iptables的显示扩展的使用:
显式扩展:必须显式指明使用的扩展模块(rpm -ql iptables | grep "\.so$")
CentOS 6:man iptables
CentOS 7:man iptables-extensions
1、multiport扩展:多端口匹配
以离散方式定义多端口匹配,最多指定15个端口;
[!] --source-ports,--sports port[,port|,port:port]...:指明多个源端口;
[!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口
[!] --ports port[,port|,port:port]...:源和目的端口
iptables -I INPUT -s 192.168.0.0/16 -d 192.168.147.128 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -d 192.168.0.0/16 -s 192.168.147.128 -p tcp -m multiport --sports 22,80 -j ACCEPT
2、iprange扩展:ip地址范围匹配
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
[!] --src-range from[-to]:指明连续的源ip地址范围;
[!] --dst-range from[-to]:指明连续的目标ip地址范围;
iptables -I INPUT -d 192.168.147.128 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 192.168.147.20-192.168.147.200 -j ACCEPT
iptables -I OUTPUT -s 192.168.147.128 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 192.168.147.20-192.168.147.200 -j ACCEPT
3、string扩展:报文数据流中的字符串匹配
检查报文中出现的字符串;
--algo {bm|kmp}:字符串比对算法
[!] --string pattern
iptables -I OUTPUT -m string --algo bm --string 'xxxx' -j REJECT
4、time扩展:基于时间的匹配,要注意日期时间格式
根据报文到达的时间与指定的日期时间范围进行匹配;
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
iptables -I INPUT -d 192.168.147.128 -p tcp --dport 80 -m time --timestart 14:00 --timestop 16:00 -j REJECT
5、connlimit扩展:连接数量限制匹配
根据每客户端IP(也可以是地址块)做并发连接数数量匹配;
--connlimit-above n 连接数量大于n,一般-j是REJECT或DROP
--connlimit-upto n 连接数量小于等于n,一般-j是ACCEPT
--connlimit-mask prefix_length
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT
6、limit扩展:
基于收发报文的速率做检查;使用令牌桶过滤器。
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
iptables -A INPUT -d 192.168.147.128 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 30/minute -j ACCEPT
iptables -A OUTPUT -s 192.168.147.128 -p icmp --icmp-type 0 -j ACCEPT
7、state扩展:状态匹配
根据连接追踪机制检查连接的状态;
调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_conntrack_max
已经追踪到并记录下的连接:/proc/net/nf_conntrack
不同协议或连接类型追踪的时长:/proc/sys/net/netfilter/
可追踪的连接状态:
NEW:新发出的请求;连接追踪模版中不存在此连接相关的信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模版中为其建立的条目失效之前期间内所进行的通信的状态;
RELATED:相关的连接;如ftp协议中的命令连接与数据连接之间的关系;
INVALIED:无法识别的连接;
[!] --state state
iptables -I INPUT -d 192.168.147.128 -p tcp --dport 22 -m state --state NEW ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 192.168.147.128 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
对于出站报文,只要是ESTABLISHED,都放行,所以可以使用如下规则:
iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
对于进站报文,只要是ESTABLISHED,都放行
iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT
如何开放被动模式下的FTP服务?
(1)装载ftp追踪时的专用的模块:modprobe nf_conntrack_ftp
(2)放行请求报文:
命令连接(21号端口):NEW,ESTABLISHED
数据连接:RELATED,ESTABLISHED
(3)放行响应报文:ESTABLISHED
模块位置:
查看模块信息:
手动装载模块命令:modprobe nf_conntrack_ftp
安装vsftpd后启动服务:
清空规则,设置默认策略:
测试访问ftp:
添加对ssh和web的规则:
此时ftp无法访问。
设置规则放行ftp:
只需要修改INPUT第2条规则,将21端口添加进入就可以了,这是命令连接:
iptables -R INPUT 2 -d 192.168.147.128 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
对于数据连接,只要是RELATED的也放行就可以,所以INPUT修改第1条规则,添加RELATED状态放行:
iptables -R INPUT 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
至此,ftp放行成功。
单独添加规则:
放行请求报文:
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
放行响应报文:
iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
如何保存及重载规则:
保存已有规则:iptables-save > /PATH/TO/FILE iptables-save > /root/iptables.1
重载已保存规则:iptables-restore < /PATH/FROM/FILE iptables-restore < /root/iptables.1
对CentOS 6:
service iptables save 相当于 iptables-save > /etc/sysconfig/iptables
service iptables restore 相当于 iptables-restore < /etc/sysconfig/iptables
对CentOS 7:
引入了新的iptables前端管理服务工具:firewalld
Firewalld-cmd
Firewalld-config
需要开机自动装载模块,需要在/etc/sysconfig/iptables-config中进行配置:
网络防火墙:
做网络防火墙,需要主机有两块及以上网卡,两个网卡接在不同的网络中。
在7.9上,需要打开ipv4的转发功能:
设置转发功能命令:sysctl -w net.ipv4.ip_forward=1
在6.9-F2上,添加路由:route add -net 192.168.61.0/24 gw 192.168.147.128
在7.9-F1上,添加路由:route add -net 192.168.147.0 netmask 255.255.255.0 gw 192.168.61.128 dev ens33
此时,6.9-F2与7.9-F1可以相互PING通,如果将7.9上的转发功能关闭,即:
sysctl -w net.ipv4.ip_forward=0
则PING不通。
6.9-F2上有WEB服务器,在7.9-F1上:
现在将7.9上的防火墙的FORWARD默认策略改为DROP:
iptables -P FORWARD DROP
此时,F1和F2之间的web和ping都不通了。然后加规则,放行WEB服务:
iptables -A FORWARD -d 192.168.147.129 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -s 192.168.147.129 -p tcp --sport 80 -j ACCEPT
此时,WEB通了,PING还是不通,实现单独放行WEB的目的。
编写规则实现放行WEB和SSH的规则:
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -d 192.168.147.129 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT
如果F2上有ftp服务器,配置转发规则实现F1访问F2的ftp:
1、装载模块;2、放行命令连接;3、放行数据连接;4、放行响应报文
iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -R FORWARD 2 -d 192.168.147.129 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT
此时,F1就可以访问F2上的ftp服务了。