iptables 配置详解

常用命令:

iptables -A 将一个规则添加到链末尾

iptables -D 将指定的链中删除规则

iptables -F 将指定的链中删除所有规则

iptables -I 将在指定链的指定编号位置插入一个规则

iptables -L 列出指定链中所有规则

iptables -t nat -L 列出所有NAT链中所有规则

iptables -N 建立用户定义链

iptables -X 删除用户定义链

iptables -P 修改链的默认设置,如将iptables -P INPUT DROP (将INPUT链设置为DROP)

常见设置参数介绍:

--dport 指定目标TCP/IP端口 如 –dport 80

--sport 指定源TCP/IP端口 如 –sport 80

-p tcp 指定协议为tcp

-p icmp 指定协议为ICMP

-p udp 指定协议为UDP

-j DROP 拒绝

-j ACCEPT 允许

-j REJECT 拒绝并向发出消息的计算机发一个消息

-j LOG 在/var/log/messages中登记分组匹配的记录

-m mac –mac 绑定MAC地址

-m limitlimit 1/s 1/m 设置时间策列

-s 10.10.0.0或10.10.0.0/16 指定源地址或地址段

-d 10.10.0.0或10.10.0.0/16 指定目标地址或地址段

-s ! 10.10.0.0 指定源地址以外的

配置Filter表防火墙

1.查看防火墙的当前配置:

$ iptables -L
#默认情况下,防火墙的规则列表都是空的:
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

如果没有指定对数据包使用特定规则,防火墙会执行默认设置。从上述查询结果中可以看出,三个链的默认匹配规则都是ACCEPT,即允许数据包通过。DROP为放弃数据包。

修改链的策略

$ iptables -P FORWARD DROP
#对默认的匹配转发的流量包丢弃

2.添加防火墙规则

对某个IP进行过滤

$ iptables -A INPUT -s 10.108.13.2 -j DROP
#对10.108.13.2用户发来的数据包进行丢弃
#查询当前防火墙规则
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.108.13.2 anywhere

对部分子网的特定协议过滤

#对10.108.13.0/24用户发来的数据包进行丢弃
$ iptables -A INPUT -s 10.108.13.0/24 -p tcp -j DROP
#查询当前防火墙规则
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.108.13.2 anywhere
DROP tcp -- 10.108.13.0/24 anywhere

对特定服务进行过滤

#对10.108.14.0/24的SMTP请求过滤
$ iptables -A INPUT -s 10.108.14.0/24 -p tcp --dport 25 -j DROP
#查询当前防火墙规则
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.108.13.2 anywhere
DROP tcp -- 10.108.13.0/24 anywhere
DROP tcp -- 10.108.14.0/24 anywhere tcp dpt:smtp

链式匹配

这时如果10.108.13.3用户想访问SMTP服务,因为防火墙的规则无法访问。这是添加一个允许过滤的规则

$ iptables -A INPUT -s 10.108.13.3 -j ACCEPT
#查询当前防火墙规则
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.108.13.2 anywhere
DROP tcp -- 10.108.13.0/24 anywhere
DROP tcp -- 10.108.14.0/24 anywhere tcp dpt:smtp
ACCEPT all -- 10.108.13.3 anywhere

虽然进行了如上配置,但是10.108.13.2依旧无法访问服务器的SMTP服务。这是因为内核是从顶到底顺序读取链配置的,并且对第一条匹配的配置执行。第一条规则不匹配10.108.13.3。顺序匹配第二条规则,匹配成功,丢弃数据包(这时还未匹配到第四条规则)。

解决方案:将第四条规则加到第二条规则的前。

#首先删除第四条规则
$ iptables -D INPUT 4
#将第四条规则插入到第二行(第一行也可以)
$ iptables -I INPUT 2 -s 10.108.13.3 -j ACCEPT
#查询当前防火墙规则
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 10.108.13.2 anywhere
ACCEPT all -- 10.108.13.3 anywhere
DROP tcp -- 10.108.13.0/24 anywhere
DROP tcp -- 10.108.14.0/24 anywhere tcp dpt:smtp

不允许ICMP通信

$ iptables -I INPUT -p icmp -j DROP
#查询当前防火墙规则
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP icmp -- anywhere anywhere
DROP all -- 10.108.13.2 anywhere
ACCEPT all -- 10.108.13.3 anywhere
DROP tcp -- 10.108.13.0/24 anywhere
DROP tcp -- 10.108.14.0/24 anywhere tcp dpt:smtp

3.清除现有的防火墙规则:

清除预设表filter中的所有规则链的规则

$ iptables -F 

清除预设表filter中使用者自定链中的原则

$ iptables -X 

保存防火墙设置

$ /etc/init.d/iptables save

$ service iptables save