浅塘在线--儿时的记忆,老家村门口一口浅塘,是儿童时光差不多全部美好时光的记忆,游泳嬉水、抓鱼钓鱼、捞螺丝、漂石仗、淘硬币、以及生活中各种洗洗涮涮~·

 找回密码
 立即注册

微信登录

微信扫一扫,快速登录

搜索
热搜: 活动 交友 discuz

社区广播台

查看: 92|回复: 0

使用访问控制列表防御IP碎片攻击

[复制链接]

4万

主题

4万

帖子

13万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
134973
发表于 2019-4-12 10:20:05 | 显示全部楼层 |阅读模式
1.基本概念
要说fragment的话,先说一下MTU(Maximum Transmission Unit,最大传输单元),这个是数据链路层的PDU(Protocol Data Unit,协议数据单元),也就是帧的大小。
不同的数据链路层协议, 帧的格式也不同, 但大致都会有目标MAC地址、源MAC地址、长度/类型、数据(有效载荷: Payload)这几个字段。 对最常见的以太网而言, 采用的是数据链路层协议是基于IEEE 802.2/802.3, 但与标准EE 802.2/802.3略有区别。以太网帧中的数据(有效)字段的长度范围是46-1500个字节。这个1500就是以太网的MTU。不同链路层协议, MTU值也不同, 对以太网, MTU是1500字节, 而对令牌环(Token Ring)网, MTU是4482字节。当链路层的上层协议,比如IP协议所要传输的IP数据包(包括IP Header)大小超过这个长度范围时, IP数据包就必须分成多片传输, 这个过程就是分片(Fragmentating), 其中分割出来的每一个片断就是一个Fragment。
2.IP包中于分片有关的字段
注意;我们接着往下提到的IP包中的字段都是IPv4中的,IPv6的包中没有关于分片的字段,因为IPv6中采用了不同的关于MTU的机制,这个回头在IPv6中提到。
IP数据包在封装时, 在IP头的第8-9个字节(16bit)中, 存放关于分片的信息. 其中前3个bit表示分片的状态, 后13个bit表示当前片断在分片之前的整块待封装的数据包中的偏移量(因为IP数据包的最大可能长度为16bit, 而这13bit无法表示16bit的范围, 故实际使用时, 偏移量的计算是用这13bit的值乘8(3bit), 以实现表示16bit的范围)。
不分片标记(Don't Fragment Flag)
IP头第8-9字节从左往右的第2bit表示当前IP数据包是(1)否(0)不分片, 缺省值为0, 就是不不分片, 即允许分片. 因为默认允许分片, 所以我们平常使用Ping命令时, 加参数-l 65500(指定IP包大小)Ping一台机器也不会有问题。
是否有后续分片标记(More Fragments Flag)
IP头第8-9字节从左往右的第3bit表示当前数据包里的数据是否为某块数据的最后一个分片, 若为0, 则说明当前数据包内的数据没有分片或者是最后一个分片, 若为1, 则表示后面还有属于同一块数据的分片。
最后可以做个测试;
之前一直说以太网MTU是1500,那么我们在主机上运行这样一个命令:
ping 192.168.0.1 -l 1500 -f  '-f参数是不允许分片,也就是将Don't Fragment Flag设置为1。
这是提示;Packet needs to be fragmented but DF set.(包需要分片,但是不允许分片。)
这是因为,帧中封装的是 IP Head+IP Data, IP Head大小20字节,而且ping命令所使用的ICMP协议会有8个字段的首部信息,1500-20-8=1472,你会发现;
ping 192.168.0.1 -l 1472 -f
这个是能ping通的。
ICMP比较特殊,一般情况下:
各分片具有分片数据长度,其中20字节IP包头不包含在该数据长度中。即,传输1500字节的数据时,实际数据长度为1480(1500-20)字节。
3.利用扩展ACL防止IP Fragment攻击
说正题了;fragment攻击是指通过恶意操作,发送极小的分片来绕过包过滤系统或者入侵检测系统的一种攻击手段。攻击者通过恶意操作,可将TCP报头(通常为20字节)分布在2个分片中,这样一来,目的端口号可以包含在第二个分片中。
对于包过滤设备或者入侵检测系统来说,首先通过判断目的端口号来采取允许/禁止措施。但是由于通过恶意分片使目的端口号位于第二个分片中,因此包过滤设备通过判断第一个分片,决定后续的分片是否允许通过。但是这些分片在目标主机上进行重组之后将形成各种攻击。通过这种方法可以迂回一些入侵检测系统及一些安全过滤系统。
我们利用扩展ACL即可对IP Fragment攻击进行控制,命令如下:
access-list 101 permit/deny 协议 源 目的 fragment  '在命令后加个fragment就行了。
加不加这个fragment是有很大区别的,下面这段借鉴了雪山飞鹄的学习笔记;
(1) 当一个ACL只含有三层信息时(不含端口号),对所有的包都进行控制。
(2) 当不使用frament 选项时,一个包含三层和四层信息的a
1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

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