Chinaunix首页 | 论坛 | 博客
  • 博客访问: 153721
  • 博文数量: 126
  • 博客积分: 1073
  • 博客等级: 上尉
  • 技术积分: 1175
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-12 00:32
文章分类

全部博文(126)

文章存档

2018年(56)

2013年(1)

2012年(8)

2011年(61)

分类: LINUX

2011-01-24 21:21:51

关于linux下面配置iptables防火墙的讨论,

 

Iptablesnetfilter模块关系

linux下面的防火墙并不是一个服务,而是一个加载到内核中的模块。这个模块就是netfilter模块(网络过滤模块),我们使用iptables工具来管理这个netfilter模块。

 

Iptables的模式

Enabled     默认拒绝所有

Disabled    默认允许所有

我们可以通过system-config-securitylevel这条命令通过图形界面修改,

这里可以选择enabled模式和disabled模式。

 

关于netfilter表和netfilter

这张图就很清楚的显示了netfilter表和netfilter链。

Filter table里面有三条链:

INPUT                 目的地是访问防火墙本身的数据包

OUTPUT             源地址是防火墙出去的数据包

FORWARD         数据包的源地址和目的地址都不是防火墙的数据包

Nat table里面也有三条链:

OUTPUT              数据包在出网关之前被丢给代理服务器

PREROUTING     做目的NAT转换(路由判断之前)

POSTROUTING  做源NAT转换(路由判断之后)

Mangle talbe里面有五条链:

INPUT

OUTPUT

FORWARD

PREROUTING

POSTROUTING

 

关于iptables数据包的流程

这张图就显示了整个iptables防火墙在工作时候的数据包流程。

 

关于iptables的访问控制规则

当数据包要经过iptables防火墙,首先读取第一条策略,如果第一条策略匹配,则执行,不在读取下面的策略。如果第一条策略没有匹配,则读取第二条策略,如果匹配到第二条策略,则执行,不在读取下面的策略。如果数据包没有匹配到任何策略,则匹配默认策略。默认策略是允许或者拒绝可以由用户自己定义。

 

关于iptables的匹配规则

-s   192.168.0.0/24

源地址为192.168.0.0/24的网段

-d   192.168.0.10

目的地址为192.168.0.10的主机

-i   eth0

eht0进来的数据包

-o   eth0

eth0出去的数据包

‘!’  192.168.0.10

反向选择

-p  tcp  --dport  80

协议的类型,目标端口是80

-p  udp  --sport  53

协议类型,源端口是53

 

关于iptables的规则目标

DROP          拒绝

ACCEPT     允许

LOG            日志,匹配到这条策略后,还是会继续往下面读取策略。

REJECT      拒绝,但是会给用户回应的信息。

 

关于iptables基本链操作

Iptables  -L

查看iptables table(默认显示filter table)

Iptables  -nL

IP地址的方式显示

Iptables  -L  --line-numbers

显示策略条目的行号

Iptables  -vL

查看iptables table(显示更具体的信息)

Iptables   -A

追加iptables的策略条目(默认会追加策略的最后面)

Iptables   -I

插入iptables的策略条目(默认插入到策略的最前面)

Iptables   -I   INPUT  2

插入成iptables策略条目的第二条策略

Iptables   -D  INPUT  2

删除iptables策略条目的第二条策略

Iptables   -F

清空所有的策略,但是不会清空链的默认策略。

Iptables   -Z

清空计数器

Iptables   -N

添加用户自定义链

Iptables   -X

清空用户自定义链

 

关于iptables的默认的链策略

Iptables  -P   INPUT      DROP

改变INPUT链的默认策略,拒绝只可以用DROP,不可以用REJECT(这条策略最后被执行)

Iptables  -P   OUTPUT    DROP

改变OUTPUT链的默认策略

Iptables  -P   FORWARD  DROP

改变FORWARD链的默认策略

 

下面我们来做试验,写几个简单的策略。

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/> cd pub/

lftp 192.168.0.254:/pub>

可以看到,现在我们的192.168.0.10这台主机访问服务器上面的ftp服务是没有问题的,现在我们写个策略拒绝这台主机访问。

[root@server1 ~]#

[root@server1 ~]# iptables -t filter -A INPUT -s 192.168.0.10 -p tcp --dport 21 -j REJECT

[root@server1 ~]#

[root@server1~]# iptables -nL

Chain INPUT (policy ACCEPT)

target        prot  opt   source                 destination        

REJECT   tcp    --   192.168.0.10         0.0.0.0/0           tcp dpt:21 reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1~]#

OK,这条简单的策略就写成功了。

现在我们来测试下,

[root@server1 ~]#

[root@server1 ~]# ssh 192.168.0.10

root@192.168.0.10's password:

Last login: Thu Mar 25 21:52:37 2010 from ftp.example.com

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

`ls' at 0 [Delaying before reconnect:30]

刚才写的那条策略就生效了。现在192.168.0.10就不可以访问服务器ftp服务了。

 

刚才使用的INPUT链,现在我们使用OUTPUT链,

现在我们拒绝服务器ssh192.168.0.20上面,

[root@server1 ~]# ssh 192.168.0.10

root@192.168.0.10's password:

Last login: Thu Mar 25 22:04:53 2010 from server1.example.com

[root@localhost ~]#

现在我们是可以ssh192.168.0.10这台主机上面去的。

[root@server1 ~]#

[root@server1 ~]# iptables -t filter -A OUTPUT -d 192.168.0.10 -p tcp --dport 22 -j REJECT

[root@server1 ~]#

[root@server1 ~]# iptables -nL

Chain INPUT (policy ACCEPT)

target     prot opt source               destination        

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target         prot  opt  source               destination        

REJECT     tcp   --   0.0.0.0/0            192.168.0.10        tcp dpt:22 reject-with icmp-port-unreachable

[root@server1 ~]#

OK,这条策略就写完成了。

现在我们再来测试下,

[root@localhost ~]#

[root@localhost ~]# ssh 192.168.0.10

ssh: connect to host 192.168.0.10 port 22: Connection refused

[root@localhost ~]#

OK,现在就连接被拒绝了,说明刚才那条策略生效了。

 

现在还有个特殊的策略,

#iptables  -A  INPUT  -j  DROP/ REJECT

这个策略我们一般写在最后面,所有没有匹配到的用户全部拒绝。

这条策略会有一个副作用,就是服务器自己反而会访问不到自己。

现在我们来测试下,

首先来访问下自己的ftp服务,

[root@server1 ~]#

[root@server1 ~]# lftp localhost

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/> cd pub/

lftp 192.168.0.254:/pub>

OK,现在访问是没有问题的。

现在我们来加上刚才的那条策略。

[root@server1 ~]#

[root@server1 ~]# iptables -A INPUT -j REJECT

[root@server1 ~]#

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target        prot  opt  source                destination         

REJECT     all   --   anywhere             anywhere            reject-with icmp-port-unreachable

 

Chain  FORWARD  (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

添加策略就完成了,现在我们再来访问下本地ftp服务,

[root@server1 ~]#

[root@server1 ~]# lftp localhost

lftp 192.168.0.254:~> ls

可以看到,现在就访问不了。

ls' at 0 [Connecting...]

这个是因为没有开启本地回环,所以必须写条策略开启本地回环。

[root@server1 ~]#

[root@server1 ~]# iptables -I INPUT -i lo -j ACCEPT

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target         prot  opt   source                destination        

ACCEPT    all    --    anywhere             anywhere           

REJECT     all     --    anywhere             anywhere            reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

现在我们插入了一条策略,再来测试下现在能否访问本地的ftp服务。

[root@server1 ~]#

[root@server1 ~]# lftp localhost

lftp localhost:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp localhost:/> cd pub/

lftp localhost:/pub>

OK,当我们允许了本地回环访问,现在就可以访问本地的ftp服务了。

默认的链策略也会有这个副作用。

 

写完iptables策略以后,重启计算机这些策略就都不会生效了。

可以使用这条命令,

#service  iptables  save

[root@localhost ~]#

[root@localhost ~]# service iptables save

Saving firewall rules to /etc/sysconfig/iptables:          [  OK  ]

[root@localhost ~]#

敲完这条命令以后,系统会将iptables的策略自动写入到/etc/sysconfig/iptables

 

我们只是对数据包的源地址和目的地址进行过滤。下面我们对数据包的状态进行过滤。这个叫做链接跟踪。

在使用状态过滤的时候,我们必须先加载相应的模块,

Modprobe  ip_conntrack_ftp 

Modprobe  ip_conntrack_tftp

Modprobe  ip_nat_ftp

Modprobe  ip_nat_tftp

关于数据包的状态

NEW                     第一次发起连接请求的数据包状态

ESTABLISHED    已经建立三次握手的数据包状态

RELATED            发送出去得到回应的数据包状态

INVALID             无效的数据包状态

关于连接跟踪的示例:

Iptables  -A    INPUT  -m  state  --state  ESTABLISHEDRELATED  -j  ACCEPT

Iptables  -A    INPUT  -m  state  --state  NEW  -p  tcp  --dport  25  -j  ACCEPT

Iptables   -A   INPUT  -m  state  --state  NEW  -j  DROP

现在我们以FTP为例,测试下,

正常情况下面,现在我们是可以访问服务器上面的ftp服务的,

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/>

可以看到,现在访问的确没有问题的,

现在我们来写几条策略,

[root@server1 ~]#

[root@server1 ~]# iptables -A INPUT -s 192.168.0.10 -p tcp --dport 21 -j ACCEPT

[root@server1 ~]#

[root@server1 ~]# iptables -A INPUT -j REJECT

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target         prot   opt  source                  destination        

ACCEPT    tcp   --   192.168.0.10         anywhere            tcp dpt:ftp

REJECT     all     --    anywhere               anywhere            reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

现在我们再到192.168.0.10上面去测试下,

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

`ls' at 0 [Delaying before reconnect: 20] 

可以看到,现在就访问不到服务器的ftp服务了。

因为我只开放了21号端口,而ftp服务的21号端口是用来传输命令通道的,现在客户端与服务器是建立不起三次握手的。

现在我们就只能够使用状态防火墙来允许建立三次握手。

使用状态防火墙首先要加载模块,

[root@server1 ~]#

[root@server1 ~]# modprobe ip_conntrack_ftp

[root@server1 ~]#

[root@server1 ~]# iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT

[root@server1 ~]#

[root@server1 ~]# iptables -L

Chain INPUT (policy ACCEPT)

target        prot  opt  source                 destination        

ACCEPT   tcp   --   192.168.0.10        anywhere         tcp dpt:ftp

ACCEPT   all    --    anywhere              anywhere        state RELATED,

ESTABLISHED

REJECT    all   --    anywhere                anywhere    reject-with icmp-port-unreachable

 

Chain FORWARD (policy ACCEPT)

target     prot opt source               destination        

 

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination        

[root@server1 ~]#

现在我们再到192.168.0.10上面去测试下,

[root@localhost ~]#

[root@localhost ~]# lftp 192.168.0.254

lftp 192.168.0.254:~> ls

drwxrwxrwx   23 0        0            4096 Mar 25 07:29 pub

lftp 192.168.0.254:/>

OK,现在就可以访问了,

这个就是状态防火墙的用法。

 

关于NAT(网络地址转换)

网络地址转换的类型:

目的地NAT(DNAT)  

PREROUTING链中进行设置,

NAT(SNATMASQUERADE)

POSTROUTING链中进行设置

 

DNAT示例:

INBOUND(进入)

Iptables  -t  nat  -A  PREROUTING  -p  tcp  --dport  80  -j  DNAT  --to-dest  192.168.0.10

OUTBOUD(输出,带有端口重定向)

Iptables  -t   nat   -A   OUTPUT  -p  tcp  --dport  80  -j  DNAT  --to--dest  192.168.0.100:3128

 

SNAT示例:

MASQUERADE(地址伪装)

Iptables  -t   nat   -A   POSTROUTING   -o   eth0   -j   MASQUERADE

SNAT

Iptables  -t   nat   -A   POSTROUTING   -j   SNAT  --to-source  1.2.3.45

 

关于linux下面简单iptables配置就是这么多了。

阅读(1169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~