ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

iptables扩展

2022-03-21 23:31:43  阅读:341  来源: 互联网

标签:iptables 匹配 ping 报文 扩展 SYN tcp icmp


iptables扩展匹配条件之’–tcp-flags’

见名知义,”–tcp-flags”指的就是tcp头中的标志位,看来,在使用iptables时,我们可以通过此扩展匹配条件,去匹配tcp报文的头部的标识位,然后根据标识位的实际情况实现访问控制的功能。

既然说到了tcp头中的标志位,那么我们就来回顾一下tcp头的结构,如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j3t9T1yk-1647876291917)(C:\Users\72983\Desktop\042817_0124_1.png)]

在使用iptables时,使用tcp扩展模块的”–tcp-flags”选项,即可对上图中的标志位进行匹配,判断指定的标志位的值是否为”1″,而tcp header的结构不是我们今天讨论的重点,我们继续聊tcp的标识位,在tcp协议建立连接的过程中,需要先进行三次握手,而三次握手就要依靠tcp头中的标志位进行。

为了更加具象化的描述这个过程,我们可以抓包查看ssh建立连接的过程,如下图所示(使用wireshark在ssh客户端抓包,跟踪对应的tcp流):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f578Ncej-1647876291919)(C:\Users\72983\Desktop\042817_0124_2.png)]

上图为tcp三次握手中的第一次握手,客户端(IP为98)使用本地的随机端口54808向服务端(IP为137)发起连接请求,tcp头的标志位中,只有SYN位被标识为1,其他标志位均为0。

在上图的下方可以看到”[TCP Flags: ··········S·]”,其中的”S”就表示SYN位,整体表示只有SYN位为1。

上图为tcp三次握手中第一次握手的tcp头中的标志位,下图是第二次握手的,服务端回应刚才的请求,将自己的tcp头的SYN标志位也设置为1,同时将ACK标志位也设置为1,如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-okRUVMUb-1647876291919)(C:\Users\72983\Desktop\042817_0124_3.png)]

上图中的下方显示的标志位列表也变成了,[TCP Flags: ·······A··S·],表示只有ACK标志位与SYN标志位为1,如上图所示,第三次握手我就不再截图了,说到这里,就已经能够引出我们今天要说的话题了,就是”–tcp-flags”选项,假设,我现在想要匹配到上文中提到的”第一次握手”的报文,则可以使用如下命令:

img

上图中,”-m tcp –dport 22″的含义在前文中已经总结过,表示使用tcp扩展模块,指定目标端口为22号端口(ssh默认端口),”–tcp-flags”就是我们今天要讨论的扩展匹配条件,用于匹配报文tcp头部的标志位,”SYN,ACK,FIN,RST,URG,PSH SYN”是什么意思呢?这串字符就是用于配置我们要匹配的标志位的,我们可以把这串字符拆成两部分去理解,第一部分为”SYN,ACK,FIN,RST,URG,PSH”,第二部分为”SYN”。

第一部分表示:我们需要匹配报文tcp头中的哪些标志位,那么上例的配置表示,我们需要匹配报文tcp头中的6个标志位,这6个标志位分别为为”SYN、ACK、FIN、RST、URG、PSH”,我们可以把这一部分理解成需要匹配的标志位列表。

第二部分表示:第一部分的标志位列表中,哪些标志位必须为1,上例中,第二部分为SYN,则表示,第一部分需要匹配的标志位列表中,SYN标志位的值必须为1,其他标志位必须为0。

所以,上例中的”SYN,ACK,FIN,RST,URG,PSH SYN”表示,需要匹配报文tcp头中的”SYN、ACK、FIN、RST、URG、PSH”这些标志位,其中SYN标志位必须为1,其他的5个标志位必须为0,这与上文中wireshark抓包时的情况相同,正是tcp三次握手时第一次握手时的情况,上文中第一次握手的报文的tcp头中的标志位如下:

img

其实,–tcp-flags的表示方法与wireshark的表示方法有异曲同工之妙,只不过,wireshark中,标志位为0的用”点”表示,标志位为1的用对应字母表示,在–tcp-flags中,需要先指明需要匹配哪些标志位,然后再指明这些标志位中,哪些必须为1,剩余的都必须为0。

那么,聪明如你一定想到了,如果我想要匹配tcp头中的第二次握手时的标志位的情况,该怎么表示呢?

示例如下(此处省略对源地址与目标地址的匹配,重点在于对tcp-flags的示例)

img

上图中,第一条命令匹配到的报文是第一次握手的报文,第二条命令匹配到的报文是第二次握手的报文。

综上所述,只要我们能够灵活的配置上例中的标志位,即可匹配到更多的应用场景中。

其实,上例中的两条命令还可以简写为如下模样

img

没错,我们可以用ALL表示”SYN,ACK,FIN,RST,URG,PSH”。

其实,tcp扩展模块还为我们专门提供了一个选项,可以匹配上文中提到的”第一次握手”,那就是–syn选项

使用”–syn”选项相当于使用”–tcp-flags SYN,RST,ACK,FIN SYN”,也就是说,可以使用”–syn”选项去匹配tcp新建连接的请求报文。

示例如下:

img

小结

结合之前的文章,我们把tcp模块的常用扩展匹配条件再总结一遍,方便以后回顾。

tcp扩展模块常用的扩展匹配条件如下:

–sport

用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围

#示例

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22:25 -j REJECT

iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT

–dport

用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围

#示例

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

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

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

–tcp-flags

用于匹配报文的tcp头的标志位

#示例

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT

iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT

iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT

–syn

用于匹配tcp新建连接的请求报文,相当于使用”–tcp-flags SYN,RST,ACK,FIN SYN”

#示例

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

iptables扩展之udp扩展与icmp扩展

udp扩展

我们先来说说udp扩展模块,这个扩展模块中能用的匹配条件比较少,只有两个,就是–sport与–dport,即匹配报文的源端口与目标端口。

没错,tcp模块中也有这两个选项,名称都一模一样。

只不过udp扩展模块的–sport与–dport是用于匹配UDP协议报文的源端口与目标端口,比如,放行samba服务的137与138这两个UDP端口,示例如下

img

前文说明过,当使用扩展匹配条件时,如果未指定扩展模块,iptables会默认调用与”-p”对应的协议名称相同的模块,所以,当使用”-p udp”时,可以省略”-m udp”,示例如下。

img

udp扩展中的–sport与–dport同样支持指定一个连续的端口范围,示例如下

img

上图中的配置表示137到157之间的所有udp端口全部对外开放,其实与tcp扩展中的使用方法相同。

但是udp中的–sport与–dport也只能指定连续的端口范围,并不能一次性指定多个离散的端口,没错,聪明如你一定想到,使用之前总结过的multiport扩展模块,即可指定多个离散的UDP端口,如果你忘了multiport模块怎样使用,请回顾前文。

总之有了前文的基础,再理解上述示例就容易多了,此处不再对udp模块的–sport与–dport进行赘述。

icmp扩展

最常用的tcp扩展、udp扩展已经总结完毕,现在聊聊icmp扩展,没错,看到icmp,你肯定就想到了ping命令,因为ping命令使用的就是icmp协议。

ICMP协议的全称为Internet Control Message Protocol,翻译为互联网控制报文协议,它主要用于探测网络上的主机是否可用,目标是否可达,网络是否通畅,路由是否可用等。

我们平常使用ping命令ping某主机时,如果主机可达,对应主机会对我们的ping请求做出回应(此处不考虑禁ping等情况),也就是说,我们发出ping请求,对方回应ping请求,虽然ping请求报文与ping回应报文都属于ICMP类型的报文,但是如果在概念上细分的话,它们所属的类型还是不同的,我们发出的ping请求属于类型8的icmp报文,而对方主机的ping回应报文则属于类型0的icmp报文,根据应用场景的不同,icmp报文被细分为如下各种类型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJ74LYdu-1647876311144)(C:\Users\72983\Desktop\icmp_4.jpg)]

从上图可以看出,所有表示”目标不可达”的icmp报文的type码为3,而”目标不可达”又可以细分为多种情况,是网络不可达呢?还是主机不可达呢?再或者是端口不可达呢?所以,为了更加细化的区分它们,icmp对每种type又细分了对应的code,用不同的code对应具体的场景, 所以,我们可以使用type/code去匹配具体类型的ICMP报文,比如可以使用”3/1″表示主机不可达的icmp报文。

上图中的第一行就表示ping回应报文,它的type为0,code也为0,从上图可以看出,ping回应报文属于查询类(query)的ICMP报文,从大类上分,ICMP报文还能分为查询类与错误类两大类,目标不可达类的icmp报文则属于错误类报文。

而我们发出的ping请求报文对应的type为8,code为0。

了解完上述概念,就好办了,我们来看一些应用场景。

假设,我们现在想要禁止所有icmp类型的报文进入本机,那么我们可以进行如下设置。

img

上例中,我们并没有使用任何扩展匹配条件,我们只是使用”-p icmp”匹配了所有icmp协议类型的报文。

如果进行了上述设置,别的主机向我们发送的ping请求报文无法进入防火墙,我们向别人发送的ping请求对应的回应报文也无法进入防火墙。所以,我们既无法ping通别人,别人也无法ping通我们。

假设,此刻需求有变,我们只想要ping通别人,但是不想让别人ping通我们,刚才的配置就不能满足我们了,我们则可以进行如下设置(此处不考虑禁ping的情况)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4dibpZlr-1647876311144)(C:\Users\72983\Desktop\icmp_6.png)]

上图中,使用”-m icmp”表示使用icmp扩展,因为上例中使用了”-p icmp”,所以”-m icmp”可以省略,使用”–icmp-type”选项表示根据具体的type与code去匹配对应的icmp报文,而上图中的”–icmp-type 8/0″表示icmp报文的type为8,code为0才会被匹配到,也就是只有ping请求类型的报文才能被匹配到,所以,别人对我们发起的ping请求将会被拒绝通过防火墙,而我们之所以能够ping通别人,是因为别人回应我们的报文的icmp type为0,code也为0,所以无法被上述规则匹配到,所以我们可以看到别人回应我们的信息。

因为type为8的类型下只有一个code为0的类型,所以我们可以省略对应的code,示例如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1PugPNIb-1647876311145)(C:\Users\72983\Desktop\icmp_7.png)]

除了能够使用对应type/code匹配到具体类型的icmp报文以外,我们还能用icmp报文的描述名称去匹配对应类型的报文,示例如下

img

没错,上例中使用的 –icmp-type “echo-request”与 –icmp-type 8/0的效果完全相同,参考本文最上方的表格即可获取对应的icmp类型的描述名称。

img

注意:名称中的”空格”需要替换为”-“。

小结

udp扩展

常用的扩展匹配条件

–sport:匹配udp报文的源地址

–dport:匹配udp报文的目标地址

#示例

iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPT

iptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT

#可以结合multiport模块指定多个离散的端口

icmp扩展

常用的扩展匹配条件

–icmp-type:匹配icmp报文的具体类型

#示例

iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT

iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT

iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT

iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT

iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

标签:iptables,匹配,ping,报文,扩展,SYN,tcp,icmp
来源: https://blog.csdn.net/weixin_54246834/article/details/123649322

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有