4.iptables的匹配条件(一)
-s选项作为匹配条件,可以匹配报文的源地址,一次指定多个时,用“逗号”隔开即可。
也可以将匹配条件取反,只需要在-s选项前加一个“!”即可
使用“!”取反后表示,报文中源地址只要不是为10.10.10.16即满足条件,就接受报文;那么使用16主机向本机发送ping请求,能得到回应吗?
结果是可以的,因为上述中,filter表的INPUT链中只有一条规则,只要源报文中源IP地址不是10.10.10.16,那么就接受此报文,但没有任何一条规则指明源IP地址是10.10.10.16时,该执行怎样的动作,当来自10.10.10.16的报文经过INPUT链中,并不能匹配上述的规则,于是报文就继续匹配后面的规则,此时只有一条规则,报文就会匹配当前链的默认动作ACCEPT了。
匹配条件:目标IP地址
使用-d选项指定“目标地址”作为匹配条件
拒绝16主机发来的报文,目的地址为本机的15地址,我们可以指定目标地址作为匹配条件:
如果我们不指定任何的目的地址,则目的地址默认为0.0.0.0./0,同理,我们如果不指定源地址,源地址默认为0.0.0.0/0。
与-s选项一样,-d选项也可以指定多个IP地址,使用逗号隔开,也可使用“叹号”取反。
当一条规则中有多个匹配条件时,这些匹配条件,默认存在“与”的关系
匹配条件:协议类型
使用-p选项,指定需要匹配的报文协议类型
示例:拒绝来自16的tcp协议类型的请求
使用ssh连接15主机(ssh协议属于tcp协议类型)
没有收到15主机的任何回应
那么我们使用ping命令(使用icmp协议),验证是否能够ping通15
结果是能够ping通的
-p支持的匹配协议:
# centos6:
tcp, udp, udplite, icmp, esp, ah, sctp
# centos7:
tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
不使用-p选项指定协议类型时,默认表示所有的协议类型都会被匹配到,与-p all
效果相同。
匹配条件:网卡接口
当本机有多块网卡时,可以使用-i选项,匹配报文是通过哪块网卡进入本机。
当前主机的网卡为eth0
假如想要拒绝由网卡eth0流入的ping请求,可以使用如下设置:
-i选项只能用于PREROUTING链、INPUT链、FORWARD链;因为它只是用于判断报文是从哪个网卡流入的,所以只能在“数据流入流向”的链中与"FORWARD"链中存在。
-o选项匹配报文将由哪块网卡流出;所以,只能用于FORWARD链、OUTPUT链
POSTROUTING链。
匹配条件:端口
“源端口”和“目标端口”属于扩展条件;而如果想要使用扩展匹配条件,则需要依赖一些扩展模块。
例如,我们想要使用iptables设置一条规则,拒绝来自10.10.10.16的ssh请求,我们就可以拒绝16主机上的报文能够发往本机的22号端口,这时,就需要用到“目标端口”选项。
--dport选项可以匹配报文的目标端口;使用--dport选项时,必须事先指定了使用哪种协议,即必须先使用-p选项。
上图中,使用--dport选项指定了匹配报文的目标端口,而在--dport之前,使用了-m选项,指定了对应的扩展模块为tcp;也就是说,如果我们想要使用--dport这个扩展匹配条件,则必须依靠某个扩展模块完成。
但在上例中,可以省略-m选项;iptables默认在使用扩展匹配条件时,如果没有使用-m指定使用哪个扩展模块,会默认使用“-m 协议名
”。
注意:如果扩展匹配条件与-p对应的协议相同,则可以省略-m选项,否则则不能省略。
--sport选项可以指定源端口
省略了-m tcp选项
扩展匹配条件同样是可以使用“ ! ”进行取反的;比如“! --dport 22”,表示目标端口不是22的报文将会匹配到。
例:拒绝除了目标端口为5901报文之外的所有报文流入本机
指定源端口和目的端口都能够指定端口范围,比如 --dport 22:25表示目标端口为22到25之间的所有端口。
使用“multiport”可以指定多个离散的、不连续的端口,每个端口之间用逗号隔开。
multiport扩展模块只能用于tcp协议和udp协议,即配合 -p tcp
或 -p udp
使用。
命令总结
1.基本匹配条件
-s # 用于匹配报文的源地址
-d # 用于匹配报文的目的地址
-p # 用于匹配报文的协议类型
-i # 用于匹配报文是从哪个网卡接口流入本机的
-o # 用于匹配报文要从哪个网卡接口流出本机
2.扩展匹配条件总结
-p tcp -m tcp --sport # 用于匹配tcp协议报文中的源端口,冒号指定一个连续的端口范围
-p tcp -m tcp --dport # 用于匹配tcp协议报文中的目的端口
-p tcp -m multiport --sport # 用于匹配报文的源端口,可以指定离散的多个端口号,端口号之间用逗号隔开
-p tcp -m multiport --dport # 用于匹配报文的目的端口,可以指定离散的多个端口号,端口号之间用逗号隔开