第5章 ICMP协议
第5章 ICMP协议 学习要点 ICMP特性与功能 ICMP报文封装 ICMP报文格式(重点) ICMP差错报告(重点)
5.1 ICMP协议概述(P96) ICMP(Internet Control Message Protocol)设计的最初目的是用于IP层的差错报告,因为IP是一种不可靠的协议。 随着网络的发展,ICMP增加了检测和控制功能,大量用在传输控制报文,包括拥塞控制报文、路径控制及路由器或主机信息的查询。 ICMP属于网络层协议,是IP协议的重要补充,但是不能用来传输应用程序数据,只能传送有关网络事件的通知报文。 RFC792“Internet Control Message Protocol”是ICMP的正式规范文件。
ICMP协议概述 ICMP协议位于TCP/IP协议的网络层,不是独立的一层。 ICMP报文需要封装在IP数据报的数据部分进行传输。
5.1.1 ICMP特性(P96) ICMP为路由器(网关)或目的主机提供了一种与源主机通信的机制。 ICMP报文采用了特殊格式的IP数据报,使用了特殊的关联报文类型和代码。 在TCP/IP的某些实现中,ICMP是一项必需的要素,通常作为提供IP基础支持的一部分。 为防止出现出错信息的无限循环,ICMP不传送有关自身的任何报文,而仅仅报告有关非ICMP的IP数据报处理的错误。
5.1.2 ICMP功能(P97) IP协议尽最大努力传送数据包,但不负责差错控制,而ICMP就是为此设计的,用于在IP主机、路由器之间传递控制报文,从而实现IP层的差错控制。ICMP两大功能就是报告差错和查询。 1. 报告差错 报告路由器或目的主机在处理IP数据报时可能遇到的一些问题,如数据包不能到达目的地、超时、拥塞等。 发现错误的网络节点会立即向源主机发送ICMP以报告出错情况。 注意,ICMP在IP层仅仅涉及与传输路径和可达相关的差错问题,而不解决数据本身的差错问题。
ICMP功能 2. 查询 帮助主机或管理员从一个路由器或主机得到特定的信息,这些报文是以请求与应答方式成对出现的,一方主动向另一方发出查询请求,而另一方将查询结果报告给请求方。 ICMP请求应答报文对可在任何两个网络节点之间传输,也可以以一对多方式传输,如广播。
5.1.3 ICMP报文封装(P97) ICMP虽然可以接受来自上层(TCP UDP)的请求,但是并不直接封装上层协议的数据,而是将请求转变为ICMP报文。 首先将报文封装成IP数据报,再交给数据链层封装成数据帧,这就是所谓两级封装。
5.1.4 ICMP报文格式(P98) ICMP报文有首部和数据两部分,首部为定长的8字节,前4字节是通用部分,后4个字节随报文不同有所差异。 ICMP首部字段 类型字段,1个字节,用于指示ICMP报文的类型 代码字段,1个字节,提供关于报文类型的进一步信息。 例如,对于报文类型3,代码0表示网络不可达,代码1表示主机不可达。 校验和字段,2个字节,提供整个ICMP协议报文的校验和 首部其他部分,4字节,对于每种报文类型都是特定的
ICMP报文格式 2. ICMP数据区 ICMP数据区因不同的报文类型有所不同。 在报告差错时,携带原始出错IP数据报的首部和数据的前8个字节,通常这些信息包括该数据报的关键信息,(前8字节一般是上层协议的首部信息),主要是引起差错的原始数据包部分内容。 在请求和应答报文中,携带与请求和应答相关的额外信息,也就是基于查询类型的其他信息。
5.1.5 ICMP报文类型(P99) ICMP报文分为差错报告报文和查询报文两大类。 差错报文报告路由器或目的主机在处理IP包时遇到的问题 查询报文以请求应答形式成对出现。 大类 类型代码 说明 差错报告报文 3 目的地不可达(Destination Unreachable) 11 超时(Time Exceeded) 12 参数问题(Parameter Problem) 4 源抑制(Source Quench) 5 重定向(Redirect) 查 询 报 文 8或0 回送或回送应答(Echo or Echo Reply) 13或14 时间戳或时间戳应答Timestamp or Timestamp Reply) 17或18 地址掩码请求或地址掩码应答(Address Mask Request or Address Mask Reply) 10或9 路由器请求与路由器通告(ICMP Router Solicitation or ICMP Router Advertisement)
5.2 ICMP差错报告(P99) ICMP差错报告弥补了IP协议的不足。ICMP只负责报告差错,而将纠正错误的工作留给上层协议去做,差错报告只发给发出该数据包的源主机。 ICMP差错报告报文数据区 差错报告报文数据区包括原始数据包的首部加上该数据包的前8字节,目的是向接收差错报告的源主机提供该数据包本身的信息。该数据包的前8字节用于提供TCP或UDP端口号和TCP序列号,便于源主机通知上层的TCP或UDP。 形成ICMP差错报告,然后再封装成IP数据报发送给源主机。
5.2.1 目的地不可达(P100) 5种ICMP差错报告:目的地不可达、超时、参数问题、源抑制、重定向。 目的地不可达(Destination Unreachable) 当路由器无法根据路由表转发IP包,或主机无法向上层协议提交IP包,将丢弃当前数据包,并产生目的地不可达差错报告,向源主机报告出错。
目的地不可达 将目的地不可达的情况细分为16种。 代码 说明 网络不可达 8 源主机被隔离 1 主机不可达 9 与目的网络的通信被禁止 2 网络不可达 8 源主机被隔离 1 主机不可达 9 与目的网络的通信被禁止 2 协议不可达 10 与目的主机的通信被禁止 3 端口不可达 11 对特定的服务类型,网络不可达 4 数据报无法分片 12 对特定的服务类型,主机不可达 5 源路由失败 13 因设置过滤而主机不可达 6 目的网络未知 14 因非法优先级使主机不可达 7 目的主机未知 15 因报文优先级低使主机不可达
目的地不可达 代码为2或3的目的地不可达报文只能由目的主机产生,而其余代码的报文由路由器产生。 目的地不可达分为4个不同的层次,从大到小依次为网络不可达、主机不可达、协议不可达和端口不可达。 RFC792“INTERNET CONTROL MESSAGE PROTOCOL”(September 1981)定义了代码0~5 RFC1122“Requirements for Internet Hosts -- Communication Layers”(October 1989)定义了代码6~12 RFC1812“Requirements for IP Version 4 Routers”(June 1995)定义了代码13~15
5.2.2 超时(P101) 数据报传输中当TTL为0时,路由器会丢弃该包,并产生1个ICMP超时(Time Exceeded)发给源主机。 超时报文格式与目的地不可达报文格式相同,只是类型和代码值不同。其类型值为11,代码为0或1。 在超时报文中,代码0表示TTL超时,即TTL字段值为0,只能路由器产生。代码1表示分片重组超时,即在规定的时间内没有收到所有的分片,这只能由目的主机使用。
5.2.3 参数问题(P101) 参数问题(Parameter Problem) 参数问题报文的格式与目的地不可达报文相同,只是类型值为12,代码为0~2,重要的是它还提供一个指针(Pointer)字段。 代码0表示数据报首部中的某个字段的值有错,这时ICMP报文首部的指针指向数据报中有问题的字节。 代码1表示数据报首部中缺少某一选项所必须具有的部分参数,此时的ICMP报文没有指针字段。 代码2表示长度无效(Bad Length),即数据报结构存在无效长度,此时的ICMP报文没有指针字段。
5.2.4 源抑制(P102) 源抑制(Source Quench) 当大量数据包进入路由器或目的主机时,会造成缓冲区溢出,即出现拥塞。ICMP使用源抑制的方法来进行拥塞控制,减缓源节点(发送方)发出数据包的速率。 ICMP的源抑制报文就是为了给IP协议增加一种流量控制。 当发生拥塞时,ICMP就向源节点发出源抑制报文,通知源节点数据报已被丢弃,这里出现了拥塞。
源抑制 源抑制包括以下三个阶段: 发现拥塞阶段。路由器对缓冲区进行监测,一旦发现拥塞,立即向相应的源节点发送ICMP源抑制报文。 解决拥塞阶段。源节点根据收到的源抑制报文中的原数据报的首部信息决定对发往某特定目标节点的数据流进行抑制,通常按一定规则降低发往该目标节点的数据包传输速率。 恢复阶段。拥塞解除后,源节点逐渐恢复数据包传输速率。在规定的时间段内未收到关于某目标节点的源抑制报文,源节点就认为发往该目标节点的拥塞已经解除。
5.2.5 重定向报文(P103) 主机数量很大,而且主机不总是在线,动态更新主机路由表会产生很大的通信开销,因此主机通常使用静态路由选择。 主机在发送信息时要根据路由表选择路由器。为解决主机路由表的更新问题,ICMP提供了重定向(Redirect)机制。 主机的下一跳路由器收到数据包后,判断本路由器是否是去往目的地的最佳选择,如果不是,在转发的同时产生一个ICMP重定向报文,通知源主机修改路由表。
重定向报文 ICMP重定向报文格式 ICMP重定向报文代码 代码 说明 为网络(或子网)重定向数据包报,指明存在一条抵达指定网络的更好路径。 为网络(或子网)重定向数据包报,指明存在一条抵达指定网络的更好路径。 1 为主机重定向数据报,指明存在一条抵达指定主机的更好路径。 2 为TOS(服务类型)和网络重定向数据报,指明存在一条使用所需TOS抵达指定网络的更好路径。 3 为服务类型和主机重定向数据报,指明存在一条使用所需TOS抵达指定主机的更好路径
5.3 ICMP查询(P104) 通过使用请求与应答报文能够对某些网络问题进行诊断。
5.3.1 回送与回送应答报文(P104) 回送(Echo)与回送应答(Echo Reply)报文 目的是对网络进行诊断和测试,可用来确定是否在IP层能够正常通信,不仅可以用来测试主机或路由器的可达性,还可以测试IP协议的工作情况。 发送方如果能够收到接收方的应答,说明双方的IP软件工作正常,数据包所经过的中间路由器工作正常,线路畅通。 报文格式。类型8:请求报文;类型0:应答报文
回送与回送应答报文 报文验证分析 Ping命令通常用来测试主机或路由器的可达性。 ping命令所产生的回送与回送应答报文数据包列表。
回送与回送应答报文 ICMP回送请求报文
回送与回送应答报文 ICMP回送应答报文
5.3.2 时间戳与时间戳应答报文(P105) 时间戳(Timestamp)与时间戳应答(Timestamp Reply)报文用于两个网络节点(主机或路由器)之间的时钟同步 发送方通过获取接收方的时间戳信息,将该信息和发送方的时间戳信息进行比较后,再估算两者的时钟差异。 报文格式。类型13是请求,类型14是应答。
5.3.3 地址掩码请求与地址掩码应答报文(P106) 地址掩码请求(Address Mask Request)与地址掩码应答(Address Mask Reply)报文,由RFC950“Internet Standard Subnetting Procedure”(Internet标准子网划分程序)规定。 用于获得主机或路由器的子网掩码。主机向网络中的路由器发送地址掩码请求报文以期获得它的子网掩码 报文格式。类型17:地址掩码请求;类型18:地址掩码应答。
5.3.4 路由器请求和路由器通告报文(P107) 利用路由器请求(Router Solicitation)和路由器通告(Router Advertisement)报文来获得路由器的IP地址。 由RFC1256“ICMP Router Discovery Messages”规定。 1. 路由器发现与路由器通告 没有设置默认网关的主机启动时,默认将一个ICMP路由器请求报文发送到所有路由器的IP广播地址224.0.0.2上,目的在于定位本地路由器,这就是ICMP路由器发现。 收到请求报文的路由器将使用ICMP路由器应答报文回应给源主机。主机会在接收到的多个应答中使用第1个作为默认网关。 2. ICMP路由器请求报文格式。类型10:路由器请求。
路由器请求和路由器通告报文 3. ICMP路由器通告报文
5.4 ICMP应用(P108) 两个最著名的实用程序----Ping和Traceroute就是依靠ICMP完成连通性测试和路由跟踪。 但是,攻击者也能将ICMP用于网络侦查活动,以获取网络地址和活动进程,ICMP安全问题不容忽视。
5.4.1 使用Ping测试网络连通性(P109) Ping命令的语法格式 ping [-t] [-a] [-n count] [-l size] [-f] [-i ttl] [-v tos] [-r count] [-s count] [[-j computer-list] | [-k computer-list]] [-w timeout] destination-list 使用Ping命令
5.4.2 使用Traceroute跟踪路由(P110) 使用Traceroute跟踪路由 tracert命令的语法格式 tracert [-d] [-h maximum_hops] [-j computer-list] [-w timeout] target_name 使用tracert命令
5.4.3 ICMP安全问题(P110) 1. ICMP重定向攻击 ICMP能够用于操纵主机之间的网络流量 攻击者将流量重定向到自己的计算机上,完成任意数量的中间人攻击。 2. ICMP路由器发现 ICMP路由器发现为攻击者提供了另一种中间人攻击方法,本地网段很容易受到攻击。在路由器发现过程中,通过发送路由器请求报文来确定到达攻击者计算机的路径。 攻击者使用路由器应答欺骗目的主机,指明它自己的主机实际上是请求的中间路由器,而不是网段上的实际路由器。由于这个过程中不进行认证,接收方无法确定这个应答是伪造的
ICMP安全问题 3. 反向映射 ICMP也让攻击者借助于反向映射来探测网络中的活动目标。 当在攻击者与其潜在目标之间检测到过滤设备时,能够以非寻常方式查询路由设备,故意将数据包发送给空的网络地址。 ICMP是一个无状态协议,一旦接收到目的地为不存在主机的数据包,中间路由器将会放行该数据包通行。 一旦该数据包抵达内部路由器,该路由器对有效和可用网络地址知道更多,它将对每一个伪造请求立即以主机不可达报文作为应答 之后攻击者可以从逻辑上推论出对应于活动主机的地址。