TCP/IP详解 第八章-ICMP(Internet控制报文)协议

1、引言

1.1、ICMP简介

IP 协议本身没有提供直接的方法来发现那些发往目的地址失败的IP 数据包。

此外, IP 没有提供直接的方式来获取诊断信息(例如哪些路由器在沿途中被使用了或使用一种方法来估计往返时间)

为了解决这些不足之处,将一个特殊的 Internet 控制报文协议( Internet Control Message Protocol,ICMP)[RFC0792][RFC4443]IP 结合使用,以便提供IP 协议层配置和IP 数据包处置相关的诊断和控制信息

ICMP 通常被认为是IP 的部分,它需要在所有IP 实现中存在。它使用IP 协议进行传输。因此,确切地说,它既不是一个网络层协议,也不是一个传输层协议,而是位于两者之间

ICMP报文可以分类两类:

1.差错报文:有关IP数据报传递的ICMP报文
2.查询或者信息类报文:有关信息采集和配置的ICMP报文

ICMP报文通常由IP层本身、上层的传输协议(例如TCPUDP),甚至是用户应用触发的。

ICMP并不为IP网络提供可靠性,它只是表明某些类别的故障和配置信息,最常见的丢包(路由器缓冲区溢出)并不会触发任何ICMP信息。

鉴于此,黑客们已经在大量攻击中使用ICMP报文。由于担心这种攻击,网络管理员通常会使用防火墙封堵ICMP报文,特别是在边界路由器上。如果ICMP被封锁,大量的诊断程序(例如ping, traceroute)将无法正常工作。

1.2、ICMP报文格式

 

ICMP报文封装在IP数据报内

IPv4协议中,协议字段=1

IPV6协议中,下一个头部字段=58

ICMP头部=类型+代码+检验和组成

ICMP类型不同,ICMP数据格式不同

2、ICMP报文

2.1、ICMPv4类型

信息报文: 显请求(8)和回显应答(0);路由器通告(9)和路由器请求(10)

差错报文: 目的不可达(3)、重定向(5)、超时(11)、参数问题(12)

2.2、ICMPv6类型

ICMPv6不仅有差错和信息类报文,还负责IPv6路由器和主机的配置

ICMPv6差错报文类型字段(0~127),信息类报文类型为128~255

2.3、报文处理

信息类请求将被操作系统自动处理,差错类报文传递给用户进程或传输层协议。

例外情况是:

重定向报文导致主机路由表自动更新

目的不可达需要分片报文,用于路径MTU发现机制

 

ICMPv6对报文处理更加严格:

1.未知ICMPv6报文必须传递给上层产生差错报文的进程
2.未知ICMPv6信息报文被丢弃
3. ICMPv6差错报文将会尽可能多的包含导致差错的原始报文
4.处理ICMPv6差错报文时,需要提取原始报文的上层协议类型,用于选择适当的上层进程
5.ICMPv6节点必须限制它发送ICMPv6差错报文的速率。

 

2.4、限制规则

目的:

限制生成ICMP差错报文的原因是防止出现广播风暴

ICMPv4限制规则:

1.ICMPv4差错报文
2.目的地址是IPv4广播地址或IPv4组播地址的数据报
3.作为链路层广播的数据报
4.不是第一个分片的其他分片
5.源地址不是单个主机的数据报,即原地址不能是零地址、环回地址、广播地址、组播地址

 

ICMPv6限制规则:

1.ICMPv6差错报文
2.ICMPv6重定向报文
3.目的地址是IPv6组播地址的数据包,以下情况除外:数据包太大(PTB)报文,参数问题报文
4.作为链路层组播(以及前面提到的例外情况)的数据包
5.作为链路层广播(以及前面提到的例外情况)的数据包
6.源地址不是唯一识别的单个节点的数据包

3、ICMP差错报文

3.1、总体流量水平规则

除了控制产生ICMP报文条件的规则,还有限制总体流量水平规则。一种推荐的方法是令牌桶。

随着时间流逝,系统会按恒定1/QPS时间间隔(如果QPS=100,则间隔是10ms)往桶里加入Token(想象和漏洞漏水相反,有个水龙头在不断的加水),如果桶已经满了就不再加了.新请求来临时,会各自拿走一个Token,如果没有Token可拿了就阻塞或者拒绝服务.

令牌桶的另外一个好处是可以方便的改变速度. 一旦需要提高速率,则按需提高放入桶中的令牌的速率. 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量.

3.2、ICMP差错报文数据包组成

包含一个完整的源自原始数据报的IP头部副本,再加上原始数据报的IP有效载荷区中的任何其他数据,同时保证生产恒的IP/ICMP数据报的大小不超过特定值(IPV4:576字节,IPV6最小的MTU,至少1280字节)

 

扩展的ICMP和多部报文

扩展结构用于ICMPv4的目的不可达、超时、参数问题报文,以及ICMPv6的不可达和超时报文。

通过在ICMP报文的尾部追加扩展数据结构的方法,扩展包括一个扩展头部和对象数据

ICMPv4头部的第6字节和ICMPv6头部的第5字节用来表示长度字段

3.3、ICMPv4主机不可达(1)ICMPv6地址不可达(3)

路由器或者主机产生,出现在当它被要求使用直接交付方法发送一个IP数据报到一个主机,但由于某些原因无法到达目的地。例如当最后一跳路由器试图发送一个ARP请求到已经不再或者关闭的主机时。

ICMPv6目的无路由(代码0)

ICMPv4管理禁止通信(代码3)ICMPv6目的管理禁止通信(代码1)

ICMPv4端口不可达(代码3)ICMPv6端口不可达(代码4)

结合traceroute命令分析

ICMPv4 PTB

数据大于选定的传出网络接口的MTU,则需要分片。如果到达的数据包在IP头部中设置了不分片(Don’t Fragement)字段,此时产生不可达PTB报文。已经用来作为MTU发现

ICMPv6 PTB

ICMPv6超出源地址范围

ICMPv6源地址失败进/出策略

ICMOv6拒绝路由到目的地

重定向(ICMPv4(5)/ICMPv6(137))

ICMP超时(ICMPv4(11)/ICMPv6(3))

结合traceroute命令分析

参数问题(ICMPv4(12)/ICMPv6(4))

3.4.、traceroute的原理

Traceroute命令利用了”TTL超时以及“端口不可达”的报文。

它发送的用于探测网络路径的数据包的IP之上的协议可以是 UDPTCPICMP。不同模式下,探测过程中设计的数据包如下:

1.UDP模式:UDP探测数据包(目标端口大于30000+ 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回ICMP Destination Unreachable 数据包
2.TCP模式:TCP [SYN]探测数据包(目标端口为Web服务的80+ 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回TCP [SYN ACK] 数据包
3.ICMP模式:ICMP Echo (ping) Request 探测数据包 + 中间网关发回ICMP TTL超时数据包 + 目标主机发回ICMP Echo (ping) reply 数据包

3.5、traceroute详细过程

1.将传递到目的IP地址的ICMP Echo消息的TTL值被设置为1,该消息报经过第一个路由器时,其TTL值减去1,此时新产生的TTL值为0
2. 由于TTL值被设置为0,路由器判断此时不应该尝试继续转发数据报,而是直接抛弃该数据报。由于数据报的生存周期(TTL值)已经到期,这个路由器会发送一个一个ICMP时间超时,即TTL值过期信息返回到客户端计算机。
3. traceroute命令的客户端计算机将显示该路由器的名称,之后可以再发送一个ICMP Echo消息并把TTL值设置为2
4.1个路由器仍然对这个TTL值减1,然后,如果可能的话,将这个数据报转发到传输路径上的下一跳。当数据报抵达第2个路由器,TTL值会再被减去1,成为0值。

5.2个路由器会像第1个路由器一样,抛弃这个数据包,并像第1个路由器那样返回一个ICMP消息。

6.过程会一直持续,traceroute命令不停递增TTL值,而传输路径上的路由器不断递减该值,直到数据报最终抵达预期的目的地

7.目的计算机接收到ICMP Echo消息时,会回传一个ICMP Echo Reply消息地址掩码请求/应答(17/18)、时间戳请求/应答(13/14)、信息请求/应答(15/16)等已经不再使用。

 

3.6、回显请求/应答

回显请求/应答(ICMPv48/0 ICMPv6128/129)

 

4、ICMP查询/信息类报文

4、ICMP查询/信息类报文

本地代理地址发现请求/应答(ICMPv6 144/145)

发现本地代理

移动前缀请求、通告(ICMPv6 146/147)

用来通知一个移动中的节点其本身前缀已经改变了,一般使用Ipsec保护,防止假冒前缀通告的欺骗

移动IPv6快速切换报文(ICMPv6 154)

当一个移动节点从一个网络的接入点(AP)移动到另一个是,改善IP切换延迟

组播侦听查询/报告/完成(ICMPv6 130/131/132)

版本2组播侦听发现(ICMPv6 143)

组播路由器发现(IGMP 48/49/50 ICMPv6151/152/153)

5、IPv6中的邻居发现

NDPNeighbor Discovery Protocol,邻居发现协议)是IPv6的一个关键协议,它组合了IPv4中的ARPICMP路由器发现和ICMP重定向等协议,并对它们作了改进。作为IPv6的基础性协议,NDP还提供了前缀发现、邻居不可达检测、重复地址监测、地址自动配置等功能。

5.1、路由器请求/通告(133/134)

路由器周期发送RA(route advertisement)消息。每台设备为了让二层网络上的主机和设备知道自己的存在,定时都会组播发送RA报文,RA报文中会带有网络前缀信息,及其他一些标志位信息。

主机发送RSroute solicitation),路由器回应RA(route advertisement)。 很多情况下主机接入网络后希望尽快获取网络前缀进行通信,此时主机可以立刻发送RS报文,网络上的设备将回应RA报文。主机收到包含路由信息的RA报文后,会更新自己的路由表。当主机向其他设备发送报文时,通过查询该列表的路由信息,选择合适的路由发送报文

5.2、邻居请求/通告(135/136)

取代IPv4ARP(地址解析协议),主要目的是将IPv6地址转换为链路层地址,邻居请求NSneighbor solicitation,邻居通告NAneighbor advertisement

主机A发给主机B的报文为组播报文,主机B发给主机A的是单播报文,其他无关的路由器是不会回应的。

 

过程可以这样描述:

主机A:谁叫李法拉?你住在哪里?

主机B: 我叫李法拉,住在MAC地址的xxxxx

主机C: 不是叫我,不管他。

5.3、邻居不可达检测(Neighbor Unreachable Detection)

检测同一个链路上的两个系统什么时候丢失了或者变得非对称了。

1、未完成(Incomplete,还有没有票?不知道啊)。表示正在解析地址,但邻居链路层地址尚未确定。

2、可达(Reachable,我就是今天的票!)表示地址解析成功,该邻居可达。

3、陈旧(Stale,我的这张旧船票还能登上你的破船吗?)表示可达时间耗尽,未确定邻居是否可达。

4、延迟(Delay,破船到底还有没有?),表示未确定邻居是否可达。DELAY状态不是一个稳定的状态,而是一个延时等待状态。

5、探查(Probe,这张票还能用吗?能到xx地方吗?),节点会向处于PROBE状态的邻居持续发送NS报文。

Empty表示邻居表项为空。

5.4、邻居不可达检测状态转换

① 在EMPTY状态时,如果有报文要发送给邻接节点,则在本地邻居缓存表建立该邻接节点的表项,并将该表项置于INCOMPLETE状态,同时向邻接节点以组播方式发送NS报文。

② 节点收到邻居回应的单播NA报文后,将处于INCOMPLETE状态的邻居缓存表项转化为REACHABLE状态。如果地址解析失败(发出的组播NS超时),则删除该表项。

③ 处于REACHABLE状态的表项,如果在REACHABLE_TIME时间内没有收到关于该邻居的“可达性证实信息”,则进入STALE状态。此外,如果该节点收到邻居节点发出的非S置位NA报文,并且链路层地址有变化,相关表项会进入STALE状态。

④ 处于STALE状态的表项,当有报文发往该邻居时,这个报文会利用缓存的链路层地址进行封装,并使该表项进入DELAY状态,等待收到“可达性证实信息”。

⑤ 进入DELAY状态后,如果DELAY_FIRST_PROBE_TIME时间之内还未收到关于该邻居的“可达性证实信息”,则该表项进入PROBE状态。

⑥ 在PROBE状态时,节点会周期性地用NS报文来探测邻居的可达性,探测最大时间间隔为RETRANS_TIMER,在最多尝试MAX_ UNICAST_SOLICIT次后,如果仍未收到邻居回应的NA报文,则认为该邻居已不可达,该表项将被删除。

5.5、重复地址检测DADDuplicate Address Detect

是在接口使用某个IPv6单播地址之前进行的,主要是为了探测是否有其它的节点使用了该地址。尤其是在地址自动配置的时候,进行DAD检测是很必要的

DAD机制通过NSNA报文实现

节点会发送NS报文(有人叫张拉拉吗?),其源地址为未指定地址,目的地址为接口配置的IPv6地址

如果收到自己的报文(听到自己的回音,奥,自己的声音不管他),直接忽略

NS报文发送到链路上后,如果在规定时间内没有收到应答的NA报文,则认为这个单播地址在链路上是唯一的,可以分配给接口(好了,我就叫张拉拉了)

反之,如果收到应答的NA报文(一个响亮的声音回来,我就叫张拉拉!呀丫丫,有人和我同名啊,算了,改个名字吧),则表明这个地址已经被其他节点所使用,不能配置到接口

5.6、重定向功能

当网关路由器发现更好的报文转发路径时候,会用重定向报文告诉主机

主机H1要发送数据到网络N2,经过路由器R1,由R1再转发到到R2

路由器R1发现R2和它是同一网段,并且R2是直接连接着网络N2,这时候路由器R1就发送重定向报文(ND redirect)告诉主机H1,以后再给网络N2的报文就直接给R2好了,别那么绕弯子,费劲!

在重定向功能中,只有主机才会处理重定向报文。在图例中,H1会更新自己的路由表,下次再发送到N2的报文便会直接转发到R2

6、ICMPv4ICMPv6转换

信息报文只有回显请求(8->128)和回显响应(0->129)转换了。

差错报文只有目的不可达(3)、超时(11)、参数问题(12)转换了

7、与ICMP相关的攻击

7.1、与ICMP相关的攻击

主要3类:泛洪(flood)、炸弹(bomb)和信息泄露(information disclosure)

泛洪会造成大量流量,导致针对一台或多台计算机的有效的Dos攻击。

炸弹指的是发送经过特殊构造的报文,能够导致IP或者ICMP的处理崩溃或者终止。

信息泄露本身并不会造成伤害,但是能够保住其他攻击方法避免浪费时间或者被发现。

Smurf攻击:

一种早期的ICMP攻击,源IP设为受害者IP,目的地址设为广播地址,导致大量计算机响应,造成Dos攻击,这种攻击只需要在防火墙边界禁止传入的广播流量即可处理。

Ping of Death攻击:

采用ICMPv4回显请求/应答报文构建数据包分片,当他们重组时形成一个过大的数据报(大于最大值64KB),导致某些系统崩溃,形成另一种形式的Dos攻击

Land攻击:

将源地址和目的地址均设为受害者IP,收到这种报文时,有些实现有问题。

 

7.2、利用ICMP重定向功能

ICMP重定向功能可能导致终端使用一个错误的系统作为下一跳路由。可以沿着流量流插入一个中间人进行记录分析,修改导致不想要的动作。还可能会使受害者认为自身就是到达目的地址的最优网关,导致无线循环,间接锁定受害者的主机

利用路由器通告和路由器请求报文

路由器通告和路由器请求报文能被用于创建类似重定向攻击,导致受害者修改他们的默认路由;被动接受这些报文可以使攻击者了解本地网络环境的拓扑结构。

使用ICMP作为入侵程序的通信通道,协调一组合作病毒的行动。

SmackBloop攻击

ICMP目的不可达报文可造成现有连接的拒绝服务。

利用ICMP时间戳请求/应答报文

ICMP时间戳请求/应答报文能够获取主机的当前时间,进而预测与时间相关的伪随机序列。

利用PTB报文

PTB报文包含推荐MTU值的字段,攻击者修改这个值强制中断使用非常小的数据包运行,导致性能低下

如果没有加密,欺骗或者伪装攻击仍然可能,使用加密方法的协议提供更高水平的安全性,但部署复杂,出问题时分析复杂。

8、参考文献

1.《TCP/IP详解 卷1:协议
2.下一代IP协议---IPv6邻居发现协议(NDP

https://baijiahao.baidu.com/s?id=1609424059183543390&wfr=spider&for=pc

3.ICMP协议学习总结和实验笔记

https://wenku.baidu.com/view/e6eff8660b4e767f5bcfce16.html

4.ping的实现和代码分析

https://blog.csdn.net/zzucsliang/article/details/41407387

5.Traceroute(路由追踪)的原理及实现

https://www.jianshu.com/p/75a5822d0eec

6.traceroute命令初探

https://www.cnblogs.com/reaperhero/articles/10066611.html

 

感谢langgy

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章