ICMP协议和ICMP重定向详解
ICMP协议
internet消息控制协议(ICMP)指定了多种消息类型,这些消息的共同目的就是管理网络,详见RFC792。ICMP的消息可以分为错误消息、请求消息和响应消失。ICMP数据包格式如图所示1-1。数据包可以通过类型来标识,许多数据包类型都有多个指定的类型,可以用代码字段来标识它们。表1-1列出来多种ICMP的数据包类型和代码,详见RFC1700。
图1-1 ICMP数据包格式
表1-1 ICMP数据包类型字段和代码字段
类型
|
代码
|
名称
|
0
|
0
|
回应应答
|
3
|
|
目的地不可达
|
0
|
网络不可达
|
|
1
|
主机不可达
|
|
2
|
协议不可达
|
|
3
|
端口不可达
|
|
4
|
需要分段和不需要分段标记置位
|
|
5
|
源路由失败
|
|
6
|
目的网络未知
|
|
7
|
目的主机未知
|
|
8
|
源主机被隔离
|
|
9
|
与目的网络的通信被禁止
|
|
10
|
目的主机的通信被禁止
|
|
11
|
对请求的服务类型,目的网络不可达
|
|
12
|
对请求的服务类型,目的主机不可达
|
|
4
|
0
|
源抑制(source quench)
|
5
|
|
重定向
|
0
|
为网络(子网)重定向数据报
|
|
1
|
为主机重定向数据报
|
|
|
2
|
为网络和服务类型重定向数据报
|
|
3
|
为主机和服务类型重定向数据报
|
6
|
0
|
选择主机地址
|
8
|
0
|
回应
|
9
|
0
|
路由器通告
|
10
|
0
|
路由器选择
|
11
|
|
超时
|
0
|
传输中超出TTL
|
|
1
|
超出分段重组时间
|
|
12
|
|
参数问题
|
0
|
指定错误的指针
|
|
1
|
缺少需要的选项
|
|
2
|
错误长度
|
|
13
|
0
|
时间戳
|
14
|
0
|
时间戳回复
|
15
|
0
|
信息请求(废弃)
|
16
|
0
|
信息回复(废弃)
|
17
|
0
|
地址掩码请求(即将废弃)
|
18
|
0
|
地址掩码回复(即将废弃)
|
30
|
-
|
路由跟踪
|
通过实验进行详细分析ICMP协议,拓扑图1-2 ICMP实验,通过抓包进行查看ICMP消息——Echo请求和Echo回复,它们常用在ping命令的功能中,ping命令基于ICMP协议。
实验拓扑图:
通过Wireshark抓包查看,viOS1访问(ping)viOS2的路由,可以通过数据包查看到ICMP协议中的type、code、checksums和可变字段(取决于ICMP的类型)。如图所示1-3、1-4,对应的类型、代码详细参考表1-1。
图1-3 ICMP_request
图1-4 ICMP_reply
大部分ICMP类型都与路由选择功能有关,但是有2个类型特别重要:
-
路由器通告(Router Advertisement)和路由器选择(Router Selection)——分别是类型9和类型10,它们用于ICMP路由器发现协议(IRDP)。IRDP协议用于某些操作系统发现本地的路由器。
-
重定向(Redirection)——是ICMP的类型5,被路由器用于通知主机去往指定目标的网关,是数据链路上的另一台路由器。
ICMP 重定向
通过ICMP 重定向实验,掌握ICMP重定向原理,拓扑图如下1-5 ICMP重定向。
图1-5 ICMP重定向
R1的配置如下:
R1(config)#ip route 3.3.3.0 255.255.255.0 172.16.1.3
R2的配置如下:
R2(config)#ip route 0.0.0.0 0.0.0.0 172.16.1.1
R2的网关为R1,R1本身又有静态路由到3.3.3.3,下一跳为R3,注意这是个MA网络,三个接口都是同网段的,这个很关键,R2将去往3.3.3.3时,将数据送到网关172.16.1.1,这时R1经过路由表查找后,发现数据的下一跳是与本地接口同一个网段的1.3(R3)比自己距离目标更近,因此给源地址也就是R2发送一个ICMP重定向消息(需要在R1上开启 IP redirects),告诉R2去172.16.1.3为更优的下一跳。
在R2上开启debug IP icmp,现在R2去ping 3.3.3.3:
R2#debug ip icmp
R2#ping 3.3.3.3
*Feb 3 10:15:00.329: ICMP: redirect rcvd from 172.16.1.1- for 3.3.3.3 use gw 172.16.1.3.!!!!
Success rate is 80 percent (4/5), round-trip min/avg/max = 4/4/6 ms
*Feb 3 10:15:02.326: ICMP: redirect rcvd from 172.16.1.1- for 3.3.3.3 use gw 172.16.1.3
*Feb 3 10:15:02.329: ICMP: echo reply rcvd, src 3.3.3.3, dst 172.16.1.2, topology BASE, dscp 0 topoid 0
*Feb 3 10:15:02.334: ICMP: echo reply rcvd, src 3.3.3.3, dst 172.16.1.2, topology BASE, dscp 0 topoid 0
*Feb 3 10:15:02.339: ICMP: echo reply rcvd, src 3.3.3.3, dst 172.16.1.2, topology BASE, dscp 0 topoid 0
*Feb 3 10:15:02.344: ICMP: echo reply rcvd, src 3.3.3.3, dst 172.16.1.2, topology BASE, dscp 0 topoid 0
查看抓包信息:
这就是R1给R2发送的ICMP重定向消息,注意里头的Ggateway address字段,填写的就是比自己距离目的地更近的下一跳IP。
如果要关闭ICMP重定向,需在接口上,使用no ip redirects 。请注意ICMP重定向的发送条件,同时注意,R2上的这条默认路由,如果配置成关联出接口的方式,那么就无法观察到重定向的现象了,就是代理ARP。
R2(config)#ip route 0.0.0.0 0.0.0.0 GigabitEthernet0/0