04 Iptables匹配条件总结

之前我们的规则匹配条件多是一个IP,可不可以多个IP同时加入匹配条件呢?是可以的,只要各IP之间使用英文逗号隔开即可,并且注意逗号两边不能用空格;不仅如此,我们还能将一个网段加入匹配条件,具体操作和结果如下

iptables -t filter -F INPUT   # 先清除之间的规则
iptables -t filter -I INPUT -s 192.168.200.115,192.168.200.116 -j DROP  # 多个IP加入匹配条件
iptables -t filter -I INPUT -s 192.168.200.0/24 -j DROP  # 一个网段加入匹配条件

iptables添加3306 iptables配置ip段_安全


可以看到,source字段和我们要去的匹配条件相同

同时,我们还能对匹配条件取反,具体操作是在匹配条件前加 ! ,如

iptables -t filter -I INPUT ! -s 192.168.200.115 -j ACCEPT ,为了方便查看,可以先清除之前的规则

iptables添加3306 iptables配置ip段_iptables添加3306_02


很好,现在按照条件,除了源地址为192.168.200.115,其他的IP发送的报文都能被本机接收,事实真的是这样吗?如果我用192.168.200.115去ping本机,能通吗,试一下吧

iptables添加3306 iptables配置ip段_防火墙_03


看来事实并不是我们想的那样,难道不是按照条件,除了192.168.200.115之外的IP发送的报文本机才接收吗?怎么192.168.200.115发送的也会接收,这个问题的确很让人摸不着头脑,上述的规则我们可以试着这样理解:

iptables是按照规则匹配的,上述规则只是表明只要报文的源地址IP不是192.168.200.115,那么就接收报文,却并没有说明当源地址IP为规则中的192.168.200.115时该做什么,iptables规则匹配报文时,由于没有定义当源地址IP为规则中的192.168.200.115时该做什么,就把报文往下传递了,但我们只有一条规则,所以就按照默认策略执行了,刚好我们的默认策略是ACCEPT,所以报文被接收了

看来取反的坑挺让人头疼的,我们在使用时可一定要注意

匹配条件:目标IP地址

之前我们的匹配条件都是源地址IP,现在来看看目标地址IP,使用 -d 选项来指定目标地址,这样我们就把一个报文来源于哪里(源地址IP),将会到哪儿去(目标地址IP)都指明了

假设我们主机有两个IP,我们想来自192.168.200.115的报文被指定的网卡接收,那么就必须要指定该网卡的IP,也就是目标地址,如本机有两个IP,192.168.200.221和192.168.200.222,我们想末尾为221的IP作为目标地址接收来自192.168.200.115的报文,如下

iptables -t filter -I INPUT -s 192.168.200.115 -d 192.168.200.221 -j ACCEPT

iptables添加3306 iptables配置ip段_IP_04


可以看到,destination字段有了我们设置的目标地址,需要说明的是,如果不指明源地址或目标地址,两者都会被0.0.0.0/0代替,表示所有IP;并且,规则中有多个匹配条件,如即指定了源地址,又指定了目标地址,那么这条规则只会匹配同时满足这两个条件的报文,即匹配条件存在逻辑"与"的关系,规则想有所动作,必须满足所有匹配条件为真

同样,-d 选项和 -s 选项一样,可以使用 ! 取反,但是注意使用叹号取反与同时指定多个IP(逗号隔开)不能同时使用

匹配条件:协议类型

我们可以使用 -p 选项,指定需要匹配的报文协议类型,如我们想只拒绝来自192.168.200.115的TCP协议类型的请求,那么可以进行如下操作

iptables -t filter -I INPUT -s 192.168.200.115 -p tcp -j REJECT

iptables添加3306 iptables配置ip段_安全_05


创建成功,prot字段值为tcp,现在再看看使用tcp协议的ssh和使用icmp协议的ping命令能否向本机发送报文并会不会被接收

iptables添加3306 iptables配置ip段_防火墙_06


很好,本机只是拒绝了tcp协议类型的报文,ping 命令还是可以正常发送

那么除了这两个协议,-p选项还支持哪些选项呢?可以参考以下内容:

在CentOS6中,-p 选项支持 tcpudpudpliteicmpespahsctp

在CentOS7中,-p 选项支持tcpudpudpliteicmpespahsctpicmpv6mh

当不使用 -p 选项指定协议时,默认为所有协议,即 all

匹配条件:网卡接口

当我们主机拥有多个网卡时,我们可以使用 -i 选项来指定网卡,这样报文就会通过该网卡接收流入本机

我本机的网卡名称是eth0,现在我想把发送到该网卡的icmp协议的报文丢弃,使用以下命令

iptables -t filter -I INPUT -i eth0 -p icmp -j DROP

这样一来,其他主机想ping通本机就不能成功了,看一下结果

iptables添加3306 iptables配置ip段_防火墙_07

iptables添加3306 iptables配置ip段_IP_08


看来很成功,这是进入主机的报文要流经的网卡匹配规则,那如果是本机某个网卡发出的报文呢?如果我们想过滤匹配,就需要使用到 -o 选项,此选项和 -i 选项是一样的用法

我们还可以想想这两个选项能否用于所有的链呢?可能不行,因为只有PREROUTING和INPUT是数据流入本机的关卡,OUTPUT和POSTROUTING是数据流出本机的关卡,FORWARD比较特殊,流入流出的数据都可能经过这里,所以可以整理出:

  • -i 选项只能用于 :PREROUTING、INPUT、DORWARD
  • -o 选项只能用于:POSTROUTING、OUTPUT、FORWARD
扩展匹配条件

在基础的源地址,目标地址,协议和网卡后,我们再来看看扩展的端口匹配

首先了解下什么是扩展匹配条件,扩展匹配条件就是基础匹配条件之外的匹配条件,有点绕口,不过就是这样的,如果非得解释,那么只能说基础匹配条件直接拿来就能用,扩展匹配条件需要扩展模块才能使用,我们可以通过一个例子来了解一下

比如,我们想禁止其他IP来访问我们主机的ssh端口,即22号端口,这时我们就会用到扩展匹配条件"目标端口",使用选项 --dport 可以匹配"目标端口",其意思为destination-port,注意,这个选项是两根"短横"在前面,并且在使用该选项时,还得指明协议;

我们来试一下 iptables -t filter -I INPUT -s 192.168.200.115 -p tcp -m tcp --dport 22 -j REJECT

iptables添加3306 iptables配置ip段_IPtables_09


上图中,我们禁止了192.168.200.115这个源地址IP访问我们本机TCP协议的22端口,在使用 --dport 选项前,我们不仅使用了 -p 选项指定了协议类型,还使用了 -m 选项,这个 -m 选项就是指定扩展模块的,上图中指定了tcp扩展模块,有此扩展模块,我们才能使用 --dport扩展匹配条件;有时,我们可以省略 -m 指定扩展模块,只要 -p 选项指定了协议,这种情况下iptables会默认调用与 -p 选项协议相同名称的模块,当然,如果模块名与 -p 选项指定的协议名不同,则不能省略

既然有"目标端口"扩展匹配条件,肯定也有"源端口"扩展匹配条件,不同之处在于,"源端口"匹配使用的是 --sport选项,即 source-port的意思,其他使用方式相同;并且扩展匹配条件也能进行取反, --dport 和 --sport 选项进行取反,就是在选项前加 ! ,变成了 ! --dport ! --sport ,同时也要注意取反的坑

除了能匹配一个端口作为匹配条件,其实还可以指定端口段,比如 --dport 22:24 ,表示的是目标端口为22、23、24端口,试一下

iptables -t filter -I INPUT -s 192.168.200.115 -p tcp --dport 22:24 -j REJECT

iptables添加3306 iptables配置ip段_iptables添加3306_10


如果想指定端口为0到22,或者80端口之后的所有端口,可以如下操作

iptables -t filter -I INPUT -s 192.168.200.115 -p tcp --dport :22 -j REJECT

iptables -t filter -I INPUT -s 192.168.200.115 -p tcp --dport 80: -j REJECT

iptables添加3306 iptables配置ip段_安全_11


如果我们的端口号不是连续的呢?应该怎么办,总不能一条条增加吧,这时会用到multiport模块,这个模块可以支持我们 指定不连续,离散的端口,但只适用于TCP和UDP协议,也就是说只能用在 -p tcp 和 -p udp 后面;同时,相应的,–dport 选项和 --sport选项在此模块扩展下会变成 --dports 选项和 --sports 选项;指定多个离散、不连续的端口逗号隔开,具体使用如下iptables -t filter -I INPUT -s 192.168.200.115 -p tcp -m multiport --dports 22,80,3306 -j REJECT

iptables添加3306 iptables配置ip段_IPtables_12


我们还能指定一段连续的端口和一些不连续的端口,示例如下

iptables添加3306 iptables配置ip段_IP_13


【Iptables】iptables目录

【Iptables】05 Iptables常用的匹配扩展模块