ICMP协议详解

ICMP协议详解

一.ICMP协议

ICMP(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。

简介:

ICMP协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。 [3] 它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到IP数据无法访问目标、IP路由器无法按当前的传输速率转发数据包等情况时,会自动发送ICMP消息。

ICMP 是 TCP/IP 模型中网络层的重要成员,与 IP 协议、ARP 协议、RARP 协议及 IGMP 协议共同构成 TCP/IP 模型中的网络层。ping 和 tracert是两个常用网络管理命令,ping 用来测试网络可达性,tracert 用来显示到达目的主机的路径。ping和 tracert 都利用 ICMP 协议来实现网络功能,它们是把网络协议应用到日常网络管理的典型实例。 [1]

从技术角度来说,ICMP就是一个“错误侦测与回报机制”,其目的就是让我们能够检测网路的连线状况﹐也能确保连线的准确性。当路由器在处理一个数据包的过程中发生了意外,可以通过ICMP向数据包的源端报告有关事件。

其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP重定向),资料流量控制。ICMP在沟通之中,主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连线状况。

ICMP 是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。

二.报文格式

ICMP报文封装在IP数据报中

 

ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文,IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。 [3]


三.ICMP类型


已经定义的ICMP消息类型大约有10多种,每种ICMP数据类型都被封装在一个IP数据包中。主要的ICMP消息类型包括以下几种。

1.响应请求

我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。 [5]

2.目标不可到达、源抑制和超时报文

这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。 [5]

3.时间戳

时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。 [5]

4.全部消息类型

下表显示了完整的ICMP类型:

TYPE CODE Description Query Error
0 0 Echo Reply——回显应答(Ping应答) x
3 0 Network Unreachable——网络不可达 x
3 1 Host Unreachable——主机不可达 x
3 2 Protocol Unreachable——协议不可达 x
3 3 Port Unreachable——端口不可达 x
3 4 Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特 x
3 5 Source routing failed——源站选路失败 x
3 6 Destination network unknown——目的网络未知 x
3 7 Destination host unknown——目的主机未知 x
3 8 Source host isolated (obsolete)——源主机被隔离(作废不用) x
3 9 Destination network administratively prohibited——目的网络被强制禁止 x
3 10 Destination host administratively prohibited——目的主机被强制禁止 x
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达 x
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达 x
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止 x
3 14 Host precedence violation——主机越权 x
3 15 Precedence cutoff in effect——优先中止生效 x
4 0 Source quench——源端被关闭(基本流控制)
5 0 Redirect for network——对网络重定向
5 1 Redirect for host——对主机重定向
5 2 Redirect for TOS and network——对服务类型和网络重定向
5 3 Redirect for TOS and host——对服务类型和主机重定向
8 0 Echo request——回显请求(Ping请求) x
9 0 Router advertisement——路由器通告
10 0 Route solicitation——路由器请求
11 0 TTL equals 0 during transit——传输期间生存时间为0 x
11 1 TTL equals 0 during reassembly——在数据报组装期间生存时间为0 x
12 0 IP header bad (catchall error)——坏的IP首部(包括各种差错) x
12 1 Required options missing——缺少必需的选项 x
13 0 Timestamp request (obsolete)——时间戳请求(作废不用) x
14 Timestamp reply (obsolete)——时间戳应答(作废不用) x
15 0 Information request (obsolete)——信息请求(作废不用) x
16 0 Information reply (obsolete)——信息应答(作废不用) x
17 0 Address mask request——地址掩码请求 x
18 0 Address mask reply——地址掩码应答

四.ICMP命令

ICMP 协议应用在许多网络管理命令中,下面以 ping 和 tracert 命令为例详细介绍 ICMP 协议的应用。 [1]

(1) ping 命令使用 ICMP 回送请求和应答报文

在网络可达性测试中使用的分组网间探测命令 ping 能产生 ICMP 回送请求和应答报文。目的主机收到 ICMP 回送请求报文后立刻回送应答报文,若源主机能收到 ICMP 回送应答报文,则说明到达该主机的网络正常。

(2)路由分析诊断程序 tracert 使用了 ICMP时间超过报文

tracert 命令主要用来显示数据包到达目的主机所经过的路径。通过执行一个 tracert 到对方主机的命令,返回数据包到达目的主机所经历的路径详细信息,并显示每个路径所消耗的时间

ICMP协议详解_第1张图片 

 

五.ICMP重定向

ICMP重定向报文是ICMP控制报文中的一种。在特定的情况下,当路由器检测到一台机器使用非优化路由的时候,它会向该主机发送一个ICMP重定向报文,请求主机改变路由。路由器也会把初始数据包向它的目的地转发。

  • 发生ICMP重定向通常有两种情况:

    • 当路由器从某个接口收到数据还需要从相同接口转发该数据时;

    • 当路由器从某个接口到发往远程网络的数据时发现源ip地址与下一跳属于同一网段时。

1.ICMP应用分析-ICMP重定向

ICMP虽然不是路由协议,但是有时它也可以指导数据包的流向(使数据流向正确的网关)。ICMP协议通过ICMP重定向数据包(类型5、代码0:网络重定向)达到这个目的。

ICMP协议详解_第2张图片

图1 ICMP重定向

如图1所示,主机PC要ping路由器R2的loopback 0地址:192.168.3.1,主机将判断出目标属于不同的网段,因此它要将 ICMP请求包发往自己的默认网关192.168.1.253(路由器R1的E0接口)。但是,这之前主机PC首先必须发送ARP请求,请求路由器R1的 E0(192.168.1.253)的MAC地址。

当路由器R1收到此ARP请求包后,它首先用ARP应答包回答主机PC的ARP请求(通知主机PC:路由器R1自己的E0接口的MAC地址)。然后, 它(路由器R1)将此ICMP请求转发到路由器R2的E0接口:192.168.1.254(要求路由器R1正确配置了到网络 192.168.3.0/24的路由)。此外,路由器R1还要发送一个ICMP重定向消息给主机PC,通知主机PC对于主机PC请求的地址的网关是: 192.168.1.254。

路由器R2此时会发送一个ARP请求消息请求主机PC的MAC地址,而主机PC会发送ARP应答消息给路由器R2。最后路由器R2通过获得的主机PC的MAC地址信息,将ICMP应答消息发送给主机PC。

2.重定向报文的处理

主机和路由器对于重定向报文有不同的处理原则。 路由器一般忽略ICMP重定向报文。而主机对于重定向报文的感知取决于操作系统。以Windows为例,对于网关返回的ICMP重定向报文,Windows会在主机的路由表中添加一项主机路由。那么以后对于这个目的地址数据报,主机会将其直接送往重定向所指示的路由器。支持重定向报文处理的还有许多的Unix系统,如FreeBSD的诸多版本等。这类主机收到ICMP重定向报文后所采取的行动基本都是增加主机路由。显然,修改默认网关是不合理的。 同时,有的操作系统对于重定向报文是不做任何处理而直接丢弃(虽然也同样经由网络层向上递交),比如Sun的某些系统。 某些主机可以启动路由器功能,如FreeBSD的某些版本和Win32系统。这时主机的行为要特殊一些,会施加一些特殊条件来判断是否处理该重定向报文,这是依系统而异的。比如BSD,它检查重定向报文的条件之一是“重定向报文不能让主机本身作为网关”。

3.ICMP重定向的利与弊

ICMP重定向使得客户端的管理工作大大减少,使得对于主机的路由功能要求大大降低。该功能把所有的负担推向路由器学习。但是与此同时ICMP重定向也有很多弊端。 就重定向本身的机制来说,ICMP重定向增加了网络报文流量,因为主机的报文总是要在网关的直连网段上重复传输。那么更进一步如果主机的操作系统支持重定向(比如Windows)会如何?如图1,而主机收到重定向报文,会在自己的路由表中产生指向B的主机路由,经由1.1.1.2。事实上,主机这样可能会引起两点显著问题。 其一是引起性能问题,例如:有一台大型的服务器,要处理数十个子网下的数千台主机的业务。如果要支持重定向,那么服务器将会维护一个庞大的充满主机路由的路由表。这是一笔很大的开销。可能很大程度上降低服务性能,甚至导致网络服务瘫痪。 其二是可能埋下安全隐患。利用这点可以进行攻击和网络窃听。如果目某主机A支持ICMP重定向,那么主机B发一个IMCP重定向给它,以后它发出的所有到指定地址的报文都会转发主机B,这样B就可以达到窃听目的了。当然,拿windows操作系统来说,它会对ICMP报文进行检查,如果这个重定向不是网关发送的,会被直接丢弃。不过伪造一个网关的数据包很容易。另外,如果刻意伪造许多虚假的ICMP重定向报文,主机路由表就可能被改的乱七八糟。

4.ICMP重定向的避免与消除

针对上述ICMP重定向引发的问题,我们可以采用一些手段来避免或补救。我们讨论的前提条件是不改变网络拓扑。

  • 关掉ip redirects

    在路由器上取消ip redirect。这样路由器不向主机发送ICMP重定向报文。或者当起动HSRP或VRRP的时候,ICMP重定向会被关掉。这是相当于一台路由器作备份。有效的避免出现ICMP重定向。该方案是看似根本上解决了问题,但是只是ICMP重定向报文不会发回主机,解决了安全和主机负荷的问题,网络上的流量却没有减少。

  • 不同掩码长度子网划分

    使用子接口来改变ICMP重定向条件。还是如图1,我们如下配置IP。 HostA: IP Addr = 1.1.1.12/24 Default Gateway = 1.1.1.2/24 RT1 E0/1 IP Addr = 1.1.1.254/25 RT2 E0/1 IP Addr = 1.1.1.2/24 E0/1.1(Sub interface) = 1.1.1.250/25 这种方法的基本思想是:破坏ICMP重定向的条件,哄骗路由器认为用户数据报的入接口和出接口不同。从HostA来看,RT1和RT2都在和自己直连的网段。如此配置从RT2来看,用户数据的入接口和出接口不在同一网段上,数据从1.1.1.2进入,从1.1.1.250路由出去,用户数据纯粹的被路由出去,这样就破坏了ICMP重定向的条件。而且RT2会认为自己的子接口E0/1.1和RT1的E0/1接口是在同一子网的。这种方式要求配置的技巧性比较强,但也并没有减少网络数据流量,只是在安全性和主机负荷上有所改进。

  • 使用访问控制列表(ACL)

    在高级的ACL中可以根据报文类型进行过滤,在我司设备上如下配置: [Quidway]acl number 100 match-order auto [Quidway-acl-adv-100]rule deny icmp fragment icmp-type net-redirect [Quidway-Ethernet6/0]firewall packet-filter 100 outbound 在出接口上绑定ACL,过滤掉报文。这样做实事上减少了网络流量,保证了主机的安全性,减轻主机负荷。但是会消耗路由器的处理资源。

  • 代理ARP

    代理ARP的方法比较直接,干脆在RT1上启动代理ARP,让自己的。主机广播ARP请求后,网关RT1返回RT2的接口MAC地址。这种方法相当于修改了主机的默认网关。其后所有的流量都被导向RT2。这样可能会影响原来的业务需求。所以这种方法是不可取的。

六.ICMP重定向攻击

在KAli上使用工具实施ICMP重定向网关

  • 使用工具(两个都可以)

    • netwox(工具集)

    • ettercap

  • 环境

    • Kali

    • 被攻击主机(这里用redhat)

网络适配器改为nat模式,单独可以上网,有自己ip

  • Kali:ip,网关

ICMP协议详解_第3张图片

 

 

  • 被攻击主机:IP 网关

  • ICMP协议详解_第4张图片

  • 测试被攻击主机可以成功ping通,有网 ICMP协议详解_第5张图片

Kali下载netwox 

apt-get install netwox

 Kali攻击

netwox 86 -f "host {被攻击主机ip地址}" -g "{新指定的网关ip地址}" -i "{当前网关ip地址}"
  • 被攻击主机wireshark抓包,发现ICMP重定向报文,至此逻辑成功

你可能感兴趣的:(网络,网络协议,tcp/ip)