• iptables(4)规则匹配条件


    简介

            前面我们已经介绍了iptables的基本原理,表、链,数据包处理流程。如何查询各种表的信息。还有基本的增、删、改、保存的基础操作。

            经过前文介绍,我们已经能够熟练的管理规则了,但是我们只使用过一种匹配条件,就是将”源地址”作为匹配条件。那么这篇文章中,我们就来介绍一下更多的匹配条件,以及匹配条件的更多用法。

    匹配条件介绍

    匹配条件:源IP地址

    上篇文章中我们介绍的规则是匹配源地址,通过-s参数指定源地址,那我们从源地址开始逐步介绍。

    图中我指定的源地址是单个IP地址

    一次指定多个源IP地址

    通过“,”隔开多个地址,可以一次性指定多个源地址,但是指定了多个不连续的源地址后,在iptables列表中会列出多行显示。注意逗号两侧都没有空格,多个IP之间通过逗号隔开

    一次性指定一个网段

    直接使用网段信息,来设置源地址段,那么该条规则就会匹配源地址是这个网段来的所有数据

    反向匹配(条件取反)

    ! -s标识对192.168.10.100条件取反,意思是源地址只要不是192.168.10.100就匹配该条规则,注意!和-s之间有空格。

    匹配条件:目标IP地址

    除了可以通过-s选项指定源地址作为匹配条件,我们还可以使用-d选项指定”目标地址”作为匹配条件。源地址表示报文从哪里来,目标地址表示报文要到哪里去。

    如果我们不指定任何目标地址,则目标地址默认为0.0.0.0/0,如果我们不指定源地址,源地址默认为0.0.0.0/0,0.0.0.0/0表示所有IP。

    图中我只指定了目的地址10.1.1.8,没有设置源地址,那么源地址就是0.0.0.0/0,意味着任何源来的地址,目标是10.1.1.8的就会匹配该条目,动作为DROP。
    注意,此时我去掉了-n参数,标识iptables可以对地址进行解析,0.0.0.0/0就会自动解析为anywhere,该条命令意思是从192.168.140.5源来的到10.1.1.8匹配该条目会被DROP。那么该条目会生效吗?按照顺序匹配原则,任何源来的目的为10.1.1.8都会匹配到上面的anywhwere,192.168.140.5也在anywhere范围内,所以该条目不会匹配上数据流。所以请大家注意,顺序非常重要。

    与-s选项一样,-d选项也可以使用‘!’进行取反,也能够同时指定多个IP地址,使用”逗号”隔开即可。注意,不管是-s选项还是-d选项,取反操作与同时指定多个IP的操作不能同时使用。

    当一条规则中有多个匹配条件时,这多个匹配条件之间,默认存在”与”的关系。就是,当一条规则中存在多个匹配条件时,报文必须同时满足这些条件,才算做被规则匹配,就如同上面我们写的规则要同时匹配源从192.168.140.5来,目的地址为10.1.1.8该条目才会被匹配。

    匹配条件:协议类型

    可以使用-p选项,指定需要匹配的报文的协议类型,协议类型有tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh等,不通操作系统版本匹配的协议类型有些区别。

    可以使用man iptables查看iptables命令的介绍,我这里可以匹配的协议类型如上图所示
    如上图所示,我添加了一条规则,从192.168.140.248来的数据包,类型是icmp的,ACCEPT,那么此时,我从192.168.140.248 ping 192.168.140.250(本机),那么能ping通吗?

    测试

    ping通了,为什么?

    iptables -t filter -I INPUT -s 192.168.140.248 -p icmp -j ACCEPT

    因为上面我用上面这条命令配置的,-I参数是从开始插入,所以要比现有的哪条REJECT更靠前,所以会有线匹配我新插入的条目。

    通过使用--line参数可以看到具体的编号,此时我们新加入的规则是在原先规则之前的,所以从192.168.140.248来的数据包会匹配到第一条规则

    匹配条件:网卡接口

    当本机有多个网卡时,我们可以使用 -i 选项去匹配报文是通过哪块网卡流入本机的,上面介绍中我没有指定任何接口,那么默认就是匹配所有接口。

    我这里只有2个网卡,其中lo环回口,物理接口为ens33

    那么我如果只需要从ens33来的数据设置策略应该怎么做呢?

    此时我们可以看到in这列出现了ens33,标识从该接口收到的数据包,其他没有设置接口的都显示any选项,标识任何接口,此时我们再去140.248上去ping本机,就会发现,会优先匹配这一条规则
    在ping后,该条目匹配了5个数据包,后面的规则并没有匹配。因为按照顺序匹配,第一条规则已经匹配上了icmp数据包。

    需要注意的是,-i选项是用于匹配报文流入的网卡的,也就是从本机发出的报文是不可能会使用到-i选项的,因为这些由本机发出的报文压根就不是从网卡流入的,而是要通过网卡发出的。

    前面文章我们提到过数据包经过防火墙的过程,如图所示,本机直接发出的数据包是不会通过input流入的。

    根据上图所示,-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选项。

    先清空INPUT链,然后通过-p参数指定协议为tcp,通过--dport参数指定目的端口为22

    此时当通过192.168.140.248去ssh192.168.140.250的时候,就会显示connection refused

    可以在iptables中看到匹配的数据包

          其实我们使用的--dport属于扩展匹配条件,要使用扩展匹配条件,需要使用-m参数扩展模块,但是上图中,并没有指定扩展模块依旧生效,这是为什么呢?。

     在我们使用扩展模块的时候,上面的策略正常应该这么写:

    iptables -t filter -I INPUT -s 192.168.140.248 -p tcp -m tcp --dport 22 -j REJECT
    此时会发现,使不使用-m tcp,结果都是一样的

              使用-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

    图中,--sport指定源端口,由于我没有使用-n选项,那么iptables会自动解析,将tcp 22解析为ssh

    扩展取反

            前面我们介绍过-s ,-d即目的地址,源地址都是可以通过! -s进行取反的,当然,--dport,--sport也同样可以通过!进行取反操作。

    上图中,及从192.168.140.222来的tcp数据包,源端口号不是22端口的,就会匹配该规则,然后DROP

    端口范围匹配

            不论是–sport还是–dsport,都能够指定一个端口范围,如,–dport 30:35表示目标端口为30到35之间的所有端口,即30端口、31端口、32端口、33端口、34端口、35端口。

    即从192.168.140.222来的tcp数据包目标端口为30-35任何一个都会匹配该条规则,被DROP

            当然也可以匹配另一种范围如从0-20端口或者从1024以后的所有端口,即从1024-65535

    图中,:20表示从0-20,1024:表示从1024往后所有端口

    上面所指定的端口都是一个连续的端口范围,但是无法同时指定多个离散的、不连续的端口,如果想要同时指定多个离散的端口,需要借助另一个扩展模块,”multiport”模块。

    可以使用multiport模块的--sports和--dports扩展条件同时指定多个离散的源端口或者目的端口,当然也可以通过multiport模块指定连续的端口。

    通过-m multiport 然后加上--dports 1024:1030,4000,通过冒号和逗号,实现不同的范围匹配,即从192.168.140.221来的tcp协议,目标端口是1024-1030或者4000端口的,匹配该条规则,被DROP

    注意:multiport只能用于tcp和udp协议,并且后面是--dports,不是--dport。

    那么我们在写一条更复杂的策略,如下:

    上图中,匹配INPUT链,从源192.168.140.100来的数据包目的地址是192.168.200.100,协议是tcp,源端口是100-110和130,目的端口是5000-6000,6630,6638中任何的,即从100-110,130这些端口中任何一个端口来的到目的端口5000-6000,6630,6638中任何一个的,匹配该条规则,动作是ACCEPT。注意此处需要使用两次-m multiport,因为我们设置的源目端口均为连续和离散端口组合。

     注意:一些所介绍的都是TCP的设置,其实udp的设置和tcp是一样的,大家只需要根据自己的需求,将TCP改为UDP就可以了,一定要多做测试,举一反三,这样才能更灵活的掌握iptables。

  • 相关阅读:
    nodejs+vue购物网站设计系统-计算机毕业设计
    软件测试/测试开发丨Selenium Web自动化多浏览器处理
    大厂this面试题和箭头函数的this指向
    coreldraw2022新版本新功能介绍cdr2022
    REDIS12_缓存雪崩、缓存穿透、基于布隆过滤器解决缓存穿透的问题、缓存击穿、基于缓存击穿工作实际案例
    魔改editormd组件,优化ToC渲染效果
    5-1:什么是Servlet-开发你的第一个动态网站
    前端培训丁鹿学堂:前端面试之meta标签相关知识总结
    二、鼎捷T100总账管理之核算项管理篇
    压铸机泵控比例PQ阀放大器
  • 原文地址:https://blog.csdn.net/weixin_42064802/article/details/139829084