前面我们已经介绍了iptables的基本原理,表、链,数据包处理流程。如何查询各种表的信息。还有基本的增、删、改、保存的基础操作。
经过前文介绍,我们已经能够熟练的管理规则了,但是我们只使用过一种匹配条件,就是将”源地址”作为匹配条件。那么这篇文章中,我们就来介绍一下更多的匹配条件,以及匹配条件的更多用法。
上篇文章中我们介绍的规则是匹配源地址,通过-s参数指定源地址,那我们从源地址开始逐步介绍。
除了可以通过-s选项指定源地址作为匹配条件,我们还可以使用-d选项指定”目标地址”作为匹配条件。源地址表示报文从哪里来,目标地址表示报文要到哪里去。
如果我们不指定任何目标地址,则目标地址默认为0.0.0.0/0,如果我们不指定源地址,源地址默认为0.0.0.0/0,0.0.0.0/0表示所有IP。
与-s选项一样,-d选项也可以使用‘!’进行取反,也能够同时指定多个IP地址,使用”逗号”隔开即可。注意,不管是-s选项还是-d选项,取反操作与同时指定多个IP的操作不能同时使用。
当一条规则中有多个匹配条件时,这多个匹配条件之间,默认存在”与”的关系。就是,当一条规则中存在多个匹配条件时,报文必须同时满足这些条件,才算做被规则匹配,就如同上面我们写的规则要同时匹配源从192.168.140.5来,目的地址为10.1.1.8该条目才会被匹配。
可以使用-p选项,指定需要匹配的报文的协议类型,协议类型有tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh等,不通操作系统版本匹配的协议类型有些区别。
测试
iptables -t filter -I INPUT -s 192.168.140.248 -p icmp -j ACCEPT
因为上面我用上面这条命令配置的,-I参数是从开始插入,所以要比现有的哪条REJECT更靠前,所以会有线匹配我新插入的条目。
当本机有多个网卡时,我们可以使用 -i 选项去匹配报文是通过哪块网卡流入本机的,上面介绍中我没有指定任何接口,那么默认就是匹配所有接口。
那么我如果只需要从ens33来的数据设置策略应该怎么做呢?
需要注意的是,-i选项是用于匹配报文流入的网卡的,也就是从本机发出的报文是不可能会使用到-i选项的,因为这些由本机发出的报文压根就不是从网卡流入的,而是要通过网卡发出的。
根据上图所示,-i选项是用于判断报文是从哪个网卡流入的,那么,-i选项只能用于上图中的PREROUTING链、INPUT链、FORWARD链,这是-i选项的特殊性,因为它只是用于判断报文是从哪个网卡流入的,所以只能在上图中”数据流入流向”的链中与FORWARD链中存在,而上图中的”本机直接发出数据包”经过的链中,是不可能使用-i选项的,比如上图中的OUTPUT链与POSTROUTING链,他们都不能使用-i选项。
那么发出的数据包就需要使用-o选项,匹配报文将由哪块网卡流出,-o选项与-i选项是相对的,-i选项只能用于PREROUTING链、INPUT链、FORWARD链,那么-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链。
在上面介绍中,我们总结了”源地址”与”目标地址”,,”源地址”与”目标地址”属于基本匹配条件,基本匹配条件我们可以直接使用。而如果想要使用扩展匹配条件,则需要依赖一些扩展模块,或者说,在使用扩展匹配条件之前,需要指定相应的扩展模块才行
举例来说,sshd服务的默认端口为22,当使用ssh工具远程连接主机时,默认会连接服务端的22号端口,我们现在想要使用iptables设置一条规则,拒绝来自192.168.140.248的ssh请求,我们就可以拒绝248上的报文能够发往本机的22号端口,这个时候,就需要用到”目标端口”选项。
使用选项--dport可以匹配报文的目标端口,--dport意为destination-port,即表示目标端口。注意,与之前的选项不同,--dport前有两条”横杠”,而且,使用--dport选项时,必须事先指定使用哪种协议,即必须先使用-p选项。
其实我们使用的--dport属于扩展匹配条件,要使用扩展匹配条件,需要使用-m参数扩展模块,但是上图中,并没有指定扩展模块依旧生效,这是为什么呢?。
在我们使用扩展模块的时候,上面的策略正常应该这么写:
iptables -t filter -I INPUT -s 192.168.140.248 -p tcp -m tcp --dport 22 -j REJECT
使用-m选项,指定了对应的扩展模块为tcp,即如果想要使用--dport这个扩展匹配条件,则必须依靠某个扩展模块完成,上例中,这个扩展模块就是tcp扩展模块,最终,我们使用的是tcp扩展模块中的--dport扩展匹配条件。
当使用-p选项指定了报文的协议时,如果在没有使用-m指定对应的扩展模块名称的情况下,使用了扩展匹配条件, iptables默认会调用与-p选项对应的协议名称相同的模块。
上图中,我们使用-p选项指定了协议名称,使用扩展匹配条件--dport指定了目标端口,在使用扩展匹配条件的时候,如果没有使用-m指定使用哪个扩展模块,iptables会默认使用”-m 协议名”,而协议名就是-p选项对应的协议名,上图中,-p 对应的值为tcp,所以默认调用的扩展模块就为-m tcp,如果-p对应的值为udp,那么默认调用的扩展模块就为-m udp。
注意,-p tcp与 -m tcp并不冲突,-p用于匹配报文的协议,-m 用于指定扩展模块的名称,只是刚好,这个扩展模块也叫tcp。所以,在使用扩展匹配条件时,一定要注意,如果这个扩展匹配条件所依赖的扩展模块名正好与-p对应的协议名称相同,那么则可省略-m选项,否则则不能省略-m选项,必须使用-m选项指定对应的扩展模块名称。
有”目标端口”,就有”源端口”,代表”源端口”的扩展匹配条件为--sport
前面我们介绍过-s ,-d即目的地址,源地址都是可以通过! -s进行取反的,当然,--dport,--sport也同样可以通过!进行取反操作。
不论是–sport还是–dsport,都能够指定一个端口范围,如,–dport 30:35表示目标端口为30到35之间的所有端口,即30端口、31端口、32端口、33端口、34端口、35端口。
当然也可以匹配另一种范围如从0-20端口或者从1024以后的所有端口,即从1024-65535
上面所指定的端口都是一个连续的端口范围,但是无法同时指定多个离散的、不连续的端口,如果想要同时指定多个离散的端口,需要借助另一个扩展模块,”multiport”模块。
可以使用multiport模块的--sports和--dports扩展条件同时指定多个离散的源端口或者目的端口,当然也可以通过multiport模块指定连续的端口。
注意:multiport只能用于tcp和udp协议,并且后面是--dports,不是--dport。
那么我们在写一条更复杂的策略,如下:
注意:一些所介绍的都是TCP的设置,其实udp的设置和tcp是一样的,大家只需要根据自己的需求,将TCP改为UDP就可以了,一定要多做测试,举一反三,这样才能更灵活的掌握iptables。