iptables匹配条件总结1

源地址

-s选项除了指定单个IP,还可以一次指定多个,用”逗号”隔开即可

[root@web-1 ~]# iptables -I INPUT -s 172.16.0.116,172.16.0.115 -d 172.16.0.113 -p tcp -j REJECT

[root@web-1 ~]# iptables -L -n -v --line
Chain INPUT (policy ACCEPT 13 packets, 1428 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 REJECT     tcp  --  *      *       172.16.0.115         172.16.0.113        reject-with icmp-port-unreachable 
2        0     0 REJECT     tcp  --  *      *       172.16.0.116         172.16.0.113        reject-with icmp-port-unreachable 

“逗号”两侧均不能包含空格,多个IP之间必须与逗号相连。
还能指定某个网段

iptables -I INPUT -s 10.6.0.0/16 -j REJECT

还可以对匹配条件取反

iptables -I INPUT ! -s 172.16.0.116 -j ACCEPT

只要发往本机的报文的源地址不是172.16.0.116,就接受报文。
此刻,你猜猜,按照上例中的配置,如果此时从116主机上向防火墙所在的主机发送ping请求,116主机能得到回应吗?(此处不考虑其他链,只考虑filter表的INPUT链)
答案是:能,也就是说,按照上例的配置,116主机仍然能够ping通当前主机,为什么呢?我们来分析一下。
上例中,filter表的INPUT链中只有一条规则,这条规则要表达的意思就是:
只要报文的源IP不是172.16.0.116,那么就接受此报文,但是,某些小伙伴可能会误会,把上例中的规则理解成如下含义,
只要报文的源IP是172.16.0.116,那么就不接受此报文,这种理解与上述理解看似差别不大,其实完全不一样,这样理解是错误的,上述理解才是正确的。
换句话说就是,报文的源IP不是172.16.0.116时,会被接收,并不能代表,报文的源IP是172.16.0.116时,会被拒绝。
上例中,因为并没有任何一条规则指明源IP是172.16.0.116时,该执行怎样的动作,所以,当来自172.16.0.116的报文经过INPUT链时,并不能匹配上例中的规则,于是,此报文就继续匹配后面的规则,可是,上例中只有一条规则,这条规则后面没有其他可以匹配的规则,于是,此报文就会去匹配当前链的默认动作(默认策略),而上例中,INPUT链的默认动作为ACCEPT,所以,来自116的ping报文就被接收了,如果,把上例中INPUT链的默认策略改为DROP,那么,116的报文将会被丢弃,116上的ping命令将得不到任何回应,但是如果将INPUT链的默认策略设置为DROP,当INPUT链中没有任何规则时,所有外来报文将会被丢弃,包括我们ssh远程连接。
好了,我们通过上例,不仅了解到了怎样对匹配条件取反,还加深了我们对默认策略的了解,一举两得,我们继续聊。

-d与-s选项同理

但是请注意,不管是-s选项还是-d选项,取反操作与同时指定多个IP的操作不能同时使用。

需要明确的一点就是:当一条规则中有多个匹配条件时,这多个匹配条件之间,默认存在”与”的关系。

匹配条件:协议类型

使用-p选项,指定报文的协议类型。

[root@web-1 ~]# iptables -I INPUT -s 172.16.0.116 -d 172.16.0.113 -p tcp -j REJECT

#测试一下(ssh属于tcp协议 )
[root@slave ~]# ssh 172.16.0.113
ssh: connect to host 172.16.0.113 port 22: Connection refused

#使用ping命令试试 (ping命令使用icmp协议)
[root@slave ~]# ping 172.16.0.113
PING 172.16.0.113 (172.16.0.113) 56(84) bytes of data.
64 bytes from 172.16.0.113: icmp_seq=1 ttl=64 time=0.686 ms

可以看到,PING命令可以ping通156,证明icmp协议并没有被规则匹配到,只有tcp类型的报文被匹配到了。

centos6中,-p支持如下协议
tcp, udp, udplite, icmp, esp, ah, sctp
centos7中,-p支持如下协议
tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。

匹配条件:网卡接口

当本机有多个网卡时,使用 -i 选项去匹配报文是通过哪块网卡流入本机的。
当前主机的网卡名称为eth4,假设想要拒绝由网卡eth4流入的ping请求报文,则可以进行如下设置。

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

-i选项是用于判断报文是从哪个网卡流入的,-i选项只能用于PREROUTING链、INPUT链、FORWARD链,
使用-o选项,匹配报文将由哪块网卡流出,-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链。

扩展匹配条件

“源端口”与”目标端口”。

当我们使用ssh工具远程连接主机时,默认会连接服务端的22号端口.
设置一条规则,拒绝来自172.16.0.116的ssh请求

iptables -t filter -I INPUT -s 172.16.0.116 -p tcp -m tcp --dport 22 -j REJECT

使用–dport选项时,必须事先指定了使用哪种协议,即必须先使用-p选项
-m选项,指定了对应的扩展模块为tcp,也就是说,如果想要使用–dport这个扩展匹配条件,则必须依靠某个扩展模块完成,上例中,这个扩展模块就是tcp扩展模块,最终,我们使用的是tcp扩展模块中的dport扩展匹配条件。
在使用扩展匹配条件之前,需要指定相应的扩展模块才行。
现在你明白了吗? -m tcp表示使用tcp扩展模块,–dport表示tcp扩展模块中的一个扩展匹配条件,可用于匹配报文的目标端口。
注意,-p tcp与 -m tcp并不冲突,-p用于匹配报文的协议,-m 用于指定扩展模块的名称,正好,这个扩展模块也叫tcp。

其实,上例中,我们可以省略-m选项,示例如下。

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

当使用-p选项指定了报文的协议时,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件, iptables默认会调用与-p选项对应的协议名称相同的模块。
上例中,我们使用-p选项指定了协议名称,使用扩展匹配条件–dport指定了目标端口,在使用扩展匹配条件的时候,如果没有使用-m指定使用哪个扩展模块,iptables会默认使用”-m 协议名”,而协议名就是-p选项对应的协议名,上例中,-p 对应的值为tcp,所以默认调用的扩展模块就为-m tcp,

“源端口”的扩展匹配条件为–sport
使用–sport可以判断报文是否从指定的端口发出,即匹配报文的源端口是否与指定的端口一致,–sport意为source-port

扩展匹配条件是可以取反的,同样是使用”!”进行取反,比如 “! –dport 22”,表示目标端口不是22的报文将会被匹配到。

不管是–sport还是–dsport,都能够指定一个端口范围,比如

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

也可以写成

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

第一条规则表示匹配0号到22号之间的所有端口,下图中的第二条规则表示匹配80号端口以及其以后的所有端口(直到65535)。
刚才聊到的两个扩展匹配条件都是tcp扩展模块的,其实,tcp扩展模块还有一个比较有用的扩展匹配条件叫做”–tcp-flags”,但是由于篇幅原因,以后再对这个扩展匹配条件进行总结。

借助tcp扩展模块的–sport或者–dport都可以指定一个连续的端口范围,但是无法同时指定多个离散的、不连续的端口,如果想要同时指定多个离散的端口,需要借助另一个扩展模块,”multiport”模块。
我们可以使用multiport模块的–sports扩展条件同时指定多个离散的源端口。
我们可以使用multiport模块的–dports扩展条件同时指定多个离散的目标端口。
示例如下

iptables -t filter -I INPUT -s 172.16.0.116 -p tcp-m multiport --dports 22,36,80 -j REJECT

上图中的-m multiport是不能省略的,如果你省略了-m multiport,就相当于在没有指定扩展模块的情况下,使用了扩展条件(”–dports”),那么上例中,iptables会默认调用”-m tcp”

其实multiport模块也可以指定连续的端口范围,并且能够在指定连续的端口范围的同时,指定离散的端口号

iptables -t filter -I INPUT -s 172.16.0.116 -p tcp -m multiport --dports 22,80:88 -j REJECT

不过需要注意,multiport扩展只能用于tcp协议与udp协议,即配合-p tcp或者-p udp使用。

posted @ 2017-06-19 19:44  fanren224  阅读(298)  评论(0编辑  收藏  举报