Write by lyc at 2020-8-31
iptables匹配条件总结之一
iptables匹配条件总结之二(常用扩展模块)

iptables 扩展匹配

  • 如果想要使用扩展匹配条件,则需要依赖一些扩展模块
  • 如果没有使用 -m 指定使用哪个扩展模块,iptables会默认使用”-m 协议名”,而协议名就是-p选项对应的协议名。

1.tcp 扩展模块

扩展匹配源、目的端口

  • “源端口”与“目标端口”属于扩展匹配条件;“源地址”与“目标地址”属于基本匹配条件
  • -p tcp -m tcp --sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围
  • -p tcp -m tcp --dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

使用–dport选项时,必须事先指定了使用哪种协议,即必须先使用 -p 选项

1
2
3
4
5
$ iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
$ iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT
$ iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT
$ iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
$ iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

2.multiport 扩展模块

  • tcp扩展模块的 --sport 或者 --dport 都可以指定一个连续的端口范围,但是无法同时指定多个离散的、不连续的端口,如果想要同时指定多个离散的端口,需要借助另一个扩展模块, multiport 模块。
  • -p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开
  • -p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开
1
2
3
4
5
$ iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
$ iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
$ iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT
$ iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT
$ iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

3.iprange 扩展模块

  • 在不使用任何扩展模块的情况下,使用-s选项或者-d选项即可匹配报文的源地址与目标地址,而且在指定IP地址时,可以同时指定多个IP地址,每个IP用”逗号”隔开
  • -s选项与-d选项并不能一次性的指定一段连续的IP地址范围,如果我们需要指定一段连续的IP地址范围,可以使用iprange扩展模块
  • --src-range 指定连续的源地址范围
  • --dst-range 指定连续的目标地址范围
1
2
3
$ iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP
$ iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP
$ iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP

4.limit 扩展模块

limit模块是对”报文到达速率”进行限制的。我们可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。

5.udp 扩展模块

iptables扩展之udp扩展与icmp扩展

  • udp扩展模块,这个扩展模块中能用的匹配条件比较少,只有两个,就是 --sport--dport,即匹配报文的源端口与目标端口。
  • 当使用扩展匹配条件时,如果未指定扩展模块,iptables会默认调用与”-p”对应的协议名称相同的模块,所以,当使用”-p udp”时,可以省略”-m udp”
1
2
3
$ iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT
$ iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT
# 可以结合multiport模块指定多个离散的端口

6.icmp 扩展模块

  • --icmp-type 匹配icmp报文的具体类型
  • -m icmp 可以省略,因为-p已经是icmp。
1
2
# 禁ping
$ iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j DROP

7.state 扩展模块

iptables扩展模块之state扩展

  • state模块可以让iptables实现”连接追踪”机制
  • “连接”其中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED
    • NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。
    • ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
    • RELATED:译为关系
    • INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文。
    • UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。

我们只要放行状态为ESTABLISHED的报文即可,因为如果报文的状态为ESTABLISHED,那么报文肯定是之前发出的报文的回应,如果你还不放心,可以将状态为RELATED或ESTABLISHED的报文都放行,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙,