背景
在前面的 iptables
命令中,我们有使用到 -s
来匹配源地址,而且在指定 IP
地址时,可以指定多个地址或者一个网段,这可以用于明确源地址的情况下使用。但是当我们有其它需求,比如指定一个连续的 IP 地址范围
、指定多个端口
、对每个客户端进行连接数限制
、对每个客户端进行速度限制
等等,这些需求就会使用到 iptables
的扩展模块了。其实可以把扩展模块看成插件的概念,iptables
中使用 -m
选项指定扩模块。
常用扩展模块
tcp
:端口匹配,可以匹配tcp
连接中的标志位multiport
:指定多个非连续端口,支持tcp
、udp
协议iprange
:连续IP
地址范围string
:匹配数据包中的字符串time
:根据指定时间范围来进行匹配connlimit
:客户端到服务端的连接数限制limit
:限制报文的速率udp
:udp
协议扩展icmp
:icmp
协议扩展,多用于ping
命令state
:对连接状态进行追踪
举例
上面简单介绍了一些常用的扩展模块,下面选取几个典型的模块来详细介绍(其它的模块可以参考这篇文章)。
tcp模块
iptables -t filter -I INPUT -p tcp -m tcp --dport 3306 -s 172.16.0.0/16 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m tcp --dport 3306 -j DROP
-m
:指定扩展模块--dport
:指定目的端口。端口格式可以为80:3306
(表示80端口到3306端口)、10050:
(表示10050端口到65535带你看)
在插入
DROP
动作的时候千万要注意,一定用-A
追加插入,如果用-I
,会把自己也挡在外面的
这里使用的 mysql 3306
端口做测试,插入上面2条规则之后,就只有 172.16.0.0/16
网段才能访问本机的mysql
服务了。
multiport模块
iptables -t filter -I INPUT -p tcp -m multiport --dports 3306,10050,10051,22 -s 172.16.0.0/16 -j ACCEPT
iptables -t filter -A INPUT -p tcp -m multiport --dports 3306,10050,10051,22 -j DROP
-m
:指定扩展模块--dports
:指定端口。可以为非连续,用逗号分割
这里对 3306,10050,10051,22
端口做了限制,只允许 172.16.0.0/16
网段的地址访问。
这里
iptables
会把端口对应的服务名显示出来
connlimit模块
iptables -t filter -I INPUT -p tcp --dport 3306 -m connlimit --connlimit-above 100 -j REJECT
-m
:指定模块--connlimit-above
:指定连接数量上限,这里为100
--connlimit-mask
:指定同一个网段的连接数上限,可以和--connlimit-above
一起使用
对连接 3306
的每个客户端限制连接数上限为 100
,如果超过 100
,则拒绝连接
小结
我们例举了3个模块的使用方法,分别是:
tcp
:tcp
扩展模块。--dport
指定目的端口;--sport
指定源端口multiport
:端口扩展模块。--dports
指定目的端口,可以多个不连续;--sports
指定源端口,可以多个不连续connlimit
:连接数限制模块。--connlimit-above
指定上限;--connlimit-mask
指定网段连接数上限