背景

在前面的 iptables 命令中,我们有使用到 -s 来匹配源地址,而且在指定 IP 地址时,可以指定多个地址或者一个网段,这可以用于明确源地址的情况下使用。但是当我们有其它需求,比如指定一个连续的 IP 地址范围指定多个端口对每个客户端进行连接数限制对每个客户端进行速度限制 等等,这些需求就会使用到 iptables 的扩展模块了。其实可以把扩展模块看成插件的概念,iptables 中使用 -m 选项指定扩模块。

常用扩展模块

  • tcp :端口匹配,可以匹配 tcp 连接中的标志位
  • multiport :指定多个非连续端口,支持 tcpudp 协议
  • iprange :连续 IP 地址范围
  • string :匹配数据包中的字符串
  • time :根据指定时间范围来进行匹配
  • connlimit :客户端到服务端的连接数限制
  • limit :限制报文的速率
  • udpudp 协议扩展
  • icmpicmp 协议扩展,多用于 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 服务了。

iptables的set模块_iptables的set模块

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的set模块_网络_02

这里 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 ,则拒绝连接

iptables的set模块_iptables_03

小结

我们例举了3个模块的使用方法,分别是:

  • tcptcp 扩展模块。--dport 指定目的端口; --sport 指定源端口
  • multiport :端口扩展模块。--dports 指定目的端口,可以多个不连续; --sports 指定源端口,可以多个不连续
  • connlimit :连接数限制模块。--connlimit-above 指定上限;--connlimit-mask 指定网段连接数上限