上一篇介绍了iptables基础,匹配条件中的基本匹配和隐式扩展匹配,这里来介绍iptables的显式扩展匹配
显式匹配扩展与隐式匹配扩展不同之处在于,在使用该扩展之前,必须使用-m或–match选项指定模块。有很多种显式匹配扩展模块可用,可以用如下命令查看可用的扩展模块
[root@localhost ~]# rpm -ql iptables | grep "[[:lower:]]\+\.so$"
扩展模块的使用方法可以man iptables(CentOS 6)或man iptables-extensions(CentOS 7)查找对应内容,下面介绍几个常用显式扩展模块
1.multiport扩展
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]... 指明多个离散源端口,!表示取反
[!] --destination-ports,--dports port[,port|,port:port]... 指明多个离散的目标端口,!表示取反
[!] --ports port[,port|,port:port]... 指明多个离散源端口或者目标端口,!表示取反
eg:放行22,23,80的TCP端口
[root@localhost ~]# iptables -A INPUT -d 172.16.8.20 -p tcp -m multiport --dports 22:23,80 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 172.16.8.20 -p tcp -m multiport --sports 22:23,80 -j ACCEPT
2 .iprange扩展
指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用
[!] --src-range from[-to]:指明连续的源IP地址范围,!表示取反
[!] --dst-range from[-to]:指明连续的目标IP地址范围,!表示取反
eg:禁止172.16.8.10-172.16.8.19这些ip远程登录172.16.8.20主机
[root@localhost ~]# iptables -I INPUT 2 -d 172.16.8.20 -p tcp --dport 22 -m iprange --src-range 172.16.8.10-172.16.8.19 -j DROP
3 string扩展
字符串匹配,能够检测报文应用层中的字符串,屏蔽非法字符
--algo {bm|kmp} 指定匹配算法,有bm和kpm两种
[!] --string pattern 指定所要匹配的字符串,!表示取反
eg:当服务端返回数据报文检查到有关键字’sex’时,则丢弃该报文,可用于web敏感词过滤
[root@localhost ~]# iptables -A OUTPUT -p tcp --dport 80 -m string -algo kmp --string 'sex' -j DROP
4.time扩展
根据报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 时间格式为:2017-11-22T12:24:30
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 时间格式为 12:24:30
--timestop hh:mm[:ss]
[!] --monthdays day[,day...] 1-31
[!] --weekdays day[,day...] Mon, Tue, Wed, Thu, Fri, Sat, Sun 或者1-7
--utc 设置--datestart, --datestop, --timestart and --timestop为UTC时间
--localtz 设置--datestart, --datestop, --timestart and --timestop为内核时间(默认)
tips:注意时区差异,CST比UTC时间快8小时
eg:禁止上网策略,可以根据实际需要修改
[root@localhost ~]# iptables -A FORWARD -m time --timestart 09:00 --timestop 18:00 -j DROP <==每天固定时间段匹配
[root@localhost ~]# iptables -A FORWARD -m time --timestart 09:00 --timestop 18:00 --weekdays Mon,Tue,Wed -j DROP <==按周固定时间段匹配
[root@localhost ~]# iptables -A FORWARD -m time --datestart 2017-10-01T00:00:00 --datestop 2017-10-31T23:59:59 -j DROP <==按固定日期匹配
5.connlimit扩展
根据每客户端IP(也可以是地址块)做并发连接数数量匹配
[!] --connlimit-above n 连接的数量大于n,!表示取反
--connlimit-mask prefix_length prefix_length为掩码(0-32) ,默认是32,即每IP
eg:只允许每组C类ip同时10个80端口转发
[root@localhost ~]# iptables -I FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP
6.limit扩展
基于收发报文的速率做检查
--limit rate[/second|/minute|/hour|/day] 速率限制,默认是3/hour
--limit-burst number 空闲时峰值,默认是5
eg:限制ping速率
iptables规则已清空,并且INPUT,OUTPUT,FORWARD默认策略为ACCEPT,添加如下两条规则
[root@localhost ~]# iptables -I INPUT -d 172.16.8.20 -p icmp --icmp-type 8 -m limit --limit-burst 3 --limit 20/minute -j ACCEPT
[root@localhost ~]# iptables -A INPUT -d 172.16.8.20 -p icmp -j REJECT
其结果为
7.state扩展
根据连接追踪机制检查连接的状态
--state STATE1,STATE2,...
可追踪的连接状态:
NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:已建立的连接;NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态
RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系
INVALIED:无法识别的连接
UNTRACKED:报文未追踪,无法找到相关的连接
关于这5种状态的详细解释可以参考下面文章”User-landstates”章节
eg:放行SSH,FTP(被动模式),WEB服务
INPUT,OUTPUT,FORWARD默认策略均为DROP
[root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptbales -A INPUT -d 172.16.8.20 -p tcp -m multiport --dports 21:22,80 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT -m state --state ESTABLISHED -j ACCEPT
tips:ftp连接追踪需要额外加载nf_conntrack_ftp模块,可以用modprobe nf_conntrack_ftp命令加载,想自动加载并永久生效的话,编辑/etc/sysconfig/iptables-config文件,修改成IPTABLES_MODULES=”nf_conntrack_ftp”,保存后重启iptables
查看连接追踪功能所能够容纳的最大连接数量:
[root@localhost ~]# cat /proc/sys/net/nf_conntrack_max
默认为65536,可以根据实际需要修改
查看已经追踪到并记录下的连接:
[root@localhost ~]# cat /proc/net/nf_conntrack