第五章:iptables应用案例分析(包过滤服务器上设置iptables)

第五章:iptables应用案例分析(包过滤服务器上设置iptables)



二、服务器上的iptables的设置

1)查看

#查看filter表的设置情况
iptables -t filter -L
#清空filter表上的所有规则
iptables -t filter -F
#让filter表的数据包计数器和流量计数器归零
iptables -t filter -Z

2)设置

----------------------------------------------------------------------------------------------------------

#允许 任意一台主机/某个网段 连接本服务器的SSH服务(本服务器为:SSH服务器)
(1)允许任意一台主机连接本服务器的SSH服务
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --sport 22
-m state --state ESTABLISHED -j ACCEPT
(2)允许某个网段连接本服务器的SSH服务
iptables -t filter -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -m -d 192.168.0.0/24 --sport 22 -m state --state ESTABLISHED -j ACCEPT
(3)允许某个网段的部分主机连接本服务器的SSH服务
iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.0.1-192.168.0.5 --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -m iprange --dst-range 192.168.0.1-192.168.0.5 --sport 22 -m state --state ESTABLISHED -j ACCEPT


#允许本服务器连接远程主机的SSH服务(本服务器为:SSH客户端)
iptables -t filter -A INPUT -p tcp --sport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

----------------------------------------------------------------------------------------------------------

#设置本服务器本地回环通行(因为本地回环地址:127.0.0.1,它提供了很多的服务,可通过netstat -autnlp查看)
iptables -t filter -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -t filter -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT


----------------------------------------------------------------------------------------------------------

#允许本服务器发送和接收ICMP数据包(ping指令)
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

(1)此外还可以对icmp类型的包进行流量的限制,例如:
iptables -t filter -A INPUT -p icmp -m limit --limit 5/m --limit-burst 10 -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -m limit --limit 5/m --limit-burst 10 -j ACCEPT
其中,对INPUT链与OUTPUT链限制都进行限制流量:--limit 5/m表示每分钟可接受5个icmp类型的数据包;--limit-burst 10表示最多可接受10个,当达到10个时就出现丢弃该类型数据包
;一般我们只对INPUT链进行限制流量即可,所以当使用ping出现丢包的时,那么可能的故障就是防火墙做了相应的限制流量规则
(2)把icmp类型包的过滤写入到日志,以方便查看
iptables -t filter -A INPUT -p icmp-m limit --limit 5/m --limit-burst 10 -j LOG --log-levelINFO --log-prefix "CentOS-ICMP: "
tail -f /var/log/messages

----------------------------------------------------------------------------------------------------------

#假设本服务器为:DNS服务器(192.168.0.53)
iptables -t filter -A INPUT -p udp -d 192.168.0.53 --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp -s 192.168.0.53 --sport 53 -j ACCEPT


#允许本服务器发送和接收DNS服务(本服务器为:DNS客户端)
iptables -t filter -A INPUT -p udp --sport 53 -j ACCEPT

iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT

----------------------------------------------------------------------------------------------------------

#假设本服务器:WEB服务器(192.168.0.53)
(1)允许所有的主机访问本WEB服务器
iptables -t filter -A INPUT -p tcp -d 192.168.0.53 --dport 80 -j ACCEPT(客户端请求)
iptables -t filter -A OUTPUT -p tcp -s 192.168.0.53--sport 80 -m state --state ESTABLISHED -j ACCEPT(服务器的回应)
(2)拒绝某台机子访问本WEB服务器
iptables -t filter -I INPUT -p tcp -d 192.168.0.53 --dport 80 -s 192.168.0.5 -j DROP
iptables -t filter -I OUTPUT -p tcp -s 192.168.0.53--sport 80 -d 192.168.0.5 -m state --state ESTABLISHED -jDROP
注意:拒绝的规则一定要写在允许的规则的前面((2)必须写在(1)的前面,所以可以使用-I参数,即:插入规则),因为规则的执行顺序是按从上到下的
就以上面作为这例子吧,我们的WEB服务器允许所有主机访问(除了192.168.0.5),所以我们还可以有另一种写法,如下:
iptables -t filter -A INPUT -p tcp -d 192.168.0.53 --dport 80 -s ! 192.168.0.5 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -s 192.168.0.53 --sport 80 -d ! 192.168.0.5 -j ACCEPT


#允许本服务器发送和接收httpd服务(本服务器为:web客户端)
iptables -t filter -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --sport 3127 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 3127 -j ACCEPT
注意:为什么要加上3127这个端口的相应规则呢?因为有些yum的源是提供特定端口的,此时就要自己写相应的规则


----------------------------------------------------------------------------------------------------------

#假设本服务器为:vsftp服务器(192.168.0.53)
(1)主动模式:除了打开服务器上的21端口,还得打开20端口
首先,加载相关模块
modprobe ip_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
注意以下几点
第一点:当 iptables 对 filter、nat、mangle 任意一个表进行操作的时候,会自动加载 ip_tables 模块
另外,iptable_filter、iptable_nat、iptable_mangle 模块也会自动加载

第二点:ip_conntrack 是状态检测机制,state 模块要用到,当 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 时,ip_conntrack 自动加载
第三点:ip_nat_ftp 是通过本机的 FTP 需要用到的(若你的系统不需要路由转发,没必要用这个)
第四点:ip_conntrack_ftp,当本机做 FTP 时,且要状态检测机制时才会用到


iptables -t filter -A INPUT -d 192.168.0.53 -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.53 -p tcp--sport 20:21 -m state --state ESTABLISHED,RELATED -j ACCEPT
注意:因为端口:20-21是连续的(大于20,表示为"20:";小于20,表示为":20"),所以可以--dport | --sport + 20:21这个写,如果不连续的话,那就得使用" -m multiport --dport |--sport + 端口1,端口2...",具体请使用man iptables,例如:下面这个例子
使用multiport可以添加多个不连接的端口,最多可以添加15组。如:-A INPUT -p tcp -m multiport –dport 21:25,135:139 -j DROP
如果不使用multiport参数,只能是添加连续的端口,如:-A INPUT -p tcp –dport 21:25 -j DROP,而不能写成21:25,135:139

(2)被动模式
首先,要实现被动模式,那么必须配置/etc/vsftpd/vsftpd.conf,在该文件增加如下内容:
pasv_enable=yes #启动被动模式
pasv_min_port=4040 #被动模式vsftpd服务器所使用的端口范围
pasv_max_port=4080

iptables -t filter -A INPUT -d 192.168.0.53 -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.53 -p tcp --sport 21 -j -m state --state ESTABLISHED ACCEPT
iptables -t filter -A INPUT -d 192.168.0.53 -p tcp --dport 4040:4080 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.53 -p tcp--sport 4040:4080 -m state --state ESTABLISHED -j ACCEPT
注意:被动模式下,你要使用工具下载文件,例如:在windows系统下,你可以使用xftp、FileZilla等ftp客户端工具

----------------------------------------------------------------------------------------------------------

#假设本服务器为:email服务器(192.168.0.53)
email服务器发送邮件默认所使用的端口:25
email服务器接收邮件默认所使用的端口:110
iptables -t filter -A INPUT -d 192.168.0.53 -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.53 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -d 192.168.0.53 -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -s 192.168.0.53 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

----------------------------------------------------------------------------------------------------------

最后在规则的最前面插入检测状态(提高防火墙的工作效率):
iptables -t filter -I INPUT -m state --state INVALID -j DROP
iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -I INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -t filter -I FORWARD -m state --state INVALID -j DROP
iptables -t filter -I FORWARD -m state --state ESTABLISHED -j ACCEPT