设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 670|回复: 0
收起左侧

技术干货 Linux安全——iptables(六)

[复制链接]
发表于 2017-7-6 11:34:44 | 显示全部楼层 |阅读模式

udp 扩展模块

udp 这个扩展模块中能用的匹配条件不是很多,--sport 和 dport 即匹配源端口和目标端口,这个和 tcp 模块中的一样,只不过 udp 扩展模块的 --sport 和 --dport 是用于匹配 udp 协议的报文。

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

iptables -I INPUT -p udp -m udp --dport 138 -j ACCEPT


                               
登录/注册后可看大图

没错这两个端口就是勒索病毒使用的端口,我们放行它。

udp 扩展和 tcp 扩展一样也可以指定连续的端口范围用“:”隔开

iptables -I INPUT -p udp -m udp --dport 137:139 -j ACCEPT

这个扩展模块没什么东西可以多说的,只是用到的还算比较多所以提一下。

ICMP 扩展模块

ICMP 中我们使用最多的无疑就是 ping 命令了,无论什么情况 ping 不 ping 的通总归要先试一下。

我们平时使用 ping 命令去 ping 某台主机如果主机可达,对方就会做出回应,也就是说发出 ping 请求,对方回应 ping 请求。ping 请求报文与 ping 回应报文虽然都属于 ICMP 类型的报文,如果深挖一下我们会发现发出的 ping 请求属于类型 8 的 ICMP 报文,而对方主机的 ping 回应报文则属于类型 0 的 ICMP 报文,根据应用场景的不同,ICMP 报文被细分为多个类型,从网上找了张对应表如下:


                               
登录/注册后可看大图


                               
登录/注册后可看大图


                               
登录/注册后可看大图

  可以看出所有表示目标不可达的 ICMP 报文的 type 值都为 3,而目标不可达又可以细分为多种情况,如网络不可达、主机不可达、端口不可达等,所有为了更加细化区分,ICMP 报文对每种 type 又细分了对应的 code 用不同的 code 对应具体的场景。我们可以使用 type/code 去匹配具体类型的ICMP 报文,比如可以使用“3/1”表示主机不可达的 ICMP 报文。

其实可以看出,ping 回应报文属于查询类(query)的 ICMP 报文,目标不可达类的 ICMP 报文则属于错误类(ERROR)报文。而我们发出的 ping 请求报文对应的 type 为 8,code 为 0。

好了,如果现在我们想要禁止所有 ICMP 类型报文进入本机,这条防火墙规则很简单。

iptables -I INPUT -p icmp -j REJECT

其中“-p icmp”所匹配的不再是 tcp 协议,而是 ICMP 协议报文。

但是如果简单的设置上面这条规则,那别的主机向我们发送 ping 请求报文无法通过防火墙,我们向别人发送 ping 请求的回应报文也无法通过防火墙。所以结果就是别人无法 ping 我们,我们也无法 ping 别人。

如果我们想要 ping 通别人,但是又不想别人 ping 通我们,那刚才那条简单的规则就不适合我们了。但通过上面的 ICMP 表我们可以修改规则来实现我们需求。

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


                               
登录/注册后可看大图

使用“-m icmp”表示使用 icmp 扩展模块,使用“--icmp-type”选项表示根据具体的 type 与 code 去匹配对应 icmp 报文,而我们使用的“--icmp-type8/0”表示 icmp 报文的 type 为 8,code 为 0 的才会被匹配到,也就是只有这类 ping 请求类型的报文才能被匹配到,所以别人对我们发起的 ping 请求将会被拒绝通过,而我们可以 ping 通别人,是因为别人回应我们的报文 icmptype 为 0,code 也为 0,所以是不会被防火墙的这条规则匹配到的。

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

iptables -I INPUT -p icmp -m icmp --icmp-type “echo-request”-j REJECT


                               
登录/注册后可看大图

--icmp-type ”echo-request”和 --icmp-type8/0 的效果是完全相同的。

-tcp-flags 扩展

其实这个是 TCP 扩展模块下的一个子选项就和 tcp--sport 和 --dport一样,但是对他的使用需要一些 tcp 协议的基础知识,比如,tcp 数据包首部的结构和 tcp 协议的三次握手四次断开过程。

TCP 协议的三次握手是基本的网络概念,简单提一下:

1、传输数据之前,客户端首先向服务器端发送一个 SYN=1(触发标志)的触发数据包,等待服务器端的确认。

2、服务器端收到该触发数据包之后,就开始回应,它会发送一个 SYN=1,ACK=1(确认号标志)的数据包,进行确认和进一步触发。

3、最后一步,是客户端的最终的确定。它会发一个 SYN=0,ACK=1 的确认包,进行最后的确认。确认完毕,三次握手就建立成功。此后,就可以进行数据通信了。


                               
登录/注册后可看大图

这些 TCP 的状态机都是被表示在 TCP 首部 TCP Flags 中如下图:


                               
登录/注册后可看大图

使用 tcp 扩展模块的“--tcp-flags”选项就可以对上图中的标识位进行匹配,判断制定标识位的值是否为“1”。

如果想要匹配三次握手中的第一次握手的报文,那可以使用命令:

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


                               
登录/注册后可看大图

其中 “-m tcp --dport 22” 的意思是使用 tcp 扩展模块,目标端口为 22 号端口;

“--tcp-flags” 的意思是匹配 tcp 报文首部的标识位;

“SYN,ACK,FIN,RST,URG,PSH SYN” 这部分是分为前后两段:

前半段 “SYN,ACK,FIN,RST,URG,PSH”意思是需要匹配tcp报文首部中的哪些标志位,可以理解为这个是一个需要匹配的标志位列表;

后半部分“SYN”表示前半部分列表中哪些位的值为“1”,也就是SYN的值为“1”。

所以结合起来这部分的意思就是,需要匹配 TCP 报文首部中的 “SYN,ACK,FIN,RST,URG,PSH”这些标志位,其中 SYN 标志位的值为 “1” ,其他5 个标志位的值为 “0”。

那匹配第二次握手的话就也可以使用

iptables -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALLSYN,ACK -j REJECT

其中的 ALL 就表示“SYN,ACK,FIN,RST,URG,PSH”。

相关阅读:
Linux安全——iptables(一)
Linux安全——iptalbes(二)
Linux安全——iptalbes(三)
Linux安全——iptalbes(四)
Linux安全——iptalbes(五)
联系我们
电话:400-004-8626
QQ:800064282
官网:www.yeslab.net


                               
登录/注册后可看大图



您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2024-4-20 00:41 , Processed in 0.054346 second(s), 8 queries , Redis On.  

  Powered by Discuz!

  © 2001-2024 HH010.COM

快速回复 返回顶部 返回列表