ICMP实验六:ICMP重定向

2015年11月19日

一、实验目的

通过简单实验来了解ICMP重定向的作用

二、简介

  • ICMP重定向的产生过程示意图
    • 让具有很小选路信息的主机通过接收ICMP重定向报文来逐步学习,逐渐建立更完善的路由表
  • ICMP重定向报文的使用场景
    • 当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端,让路由更高效
  • ICMP重定向的产生过程示意图

图片失效

  • ICMP重定向的具体过程
    • 主机的默认路由为R1,IP数据报发送到R1;
    • R1决定R2是下一站。当R1将数据报发送给R2时,发现正在发送的接口与数据报到达接口是相同的;
    • R1发送一份ICMP重定向报文给主机,告诉主机以后把数据报发送给R2而不是R1;
    • 主机接收到了ICMP重定向报文后,作出一系列的判断(各个系统实现不一样),决定是否更改路由表或路由表缓存。
  • ICMP重定向报文的数据报格式
    • 代码为0:网络重定向
    • 代码为1:主机重定向
    • 代码为2:服务类型和网络重定向
    • 代码为3:服务类型和主机重定向

图片失效

三、实验环境

  • 网络拓扑图

图片失效

  • 路由表
表1 路由表信息
Destination Gateway Genmask Flags MSS Window irtt Iface
CentOS V1路由表
0.0.0.0 192.168.0.1 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
CentOS_Router V1路由表
0.0.0.0 192.168.146.2 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.146.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.146.160 192.168.0.3 255.255.255.255 UGH 0 0 0 eth1
CentOS_Router V2路由表
0.0.0.0 192.168.146.2 0.0.0.0 UG 0 0 0 eth0
192.168.0.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.146.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

注:CentOS_Router V1添加路由命令:ip route add 192.168.146.160 via 192.168.0.3 dev eth1

四、实验步骤

  • 关闭CentOS V1上监听子网192.168.0.0/24的ICMP数据包
1
2
# 命令
tcpdump -vexnn -ttt icmp -i eth0
  • 在CentOS V1上发起ping操作
1
2
3
4
5
6
7
8
9
10
11
12
13
# 命令
ping -c 2 192.168.146.160

# 结果
PING 192.168.146.160 (192.168.146.160) 56(84) bytes of data.
From 192.168.0.1: icmp_seq=1 Redirect Host(New nexthop: 192.168.0.3)
From 192.168.0.1 icmp_seq=1 Redirect Host
From 192.168.0.3 icmp_seq=1 Destination Host Unreachable
From 192.168.0.3 icmp_seq=2 Destination Host Unreachable

--- 192.168.146.160 ping statistics ---
2 packets transmitted, 0 received, +3 errors, 100% packet loss, time 1005ms
pipe 2
  • CentOS V1监听到的网络内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# CentOS V1 向192.168.146.160发送ICMP回显请求(seq=1),查询本身路由表,选择默认路由,将数据报发送给CentOS_Router V1
00:00:00.000000 00:50:56:2b:3f:e7 > 00:0c:29:23:1a:0b, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 46001, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.0.2 > 192.168.146.160: ICMP echo request, id 5521, seq 1, length 64
	0x0000:  4500 0054 b3b1 4000 4001 7304 c0a8 0002
	0x0010:  c0a8 92a0 0800 f8f8 1591 0001 d00f 5056
	0x0020:  0000 0000 fc3b 0e00 0000 0000 1011 1213
	0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
	0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
	0x0050:  3435 3637

# CentOS_Router V1收到CentOS V1发送过来的数据报,查询自身路由表,存在主机路由(Flag为UGH),下一跳路由为CentOS_Router V2,出口接口为eth1,与收到数据报的接口为同一接口,CentOS_Router V1向CentOS V1发送ICMP重定向数据报,告诉CentOS V1以后将数据报发送给CentOS_Router V2
# 类型+代码:0x0501,即ICMP重定向(主机重定向)
# 应该使用的路由器的IP地址:0xc0a80003,即192.168.146.0.3
00:00:00.009588 00:0c:29:23:1a:0b > 00:50:56:2b:3f:e7, ethertype IPv4 (0x0800), length 126: (tos 0xc0, ttl 64, id 20403, offset 0, flags [none], proto ICMP (1), length 112)
    192.168.0.1 > 192.168.0.2: ICMP redirect 192.168.146.160 to host 192.168.0.3, length 92
	(tos 0x0, ttl 63, id 46001, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.0.2 > 192.168.146.160: ICMP echo request, id 5521, seq 1, length 64
	0x0000:  45c0 0070 4fb3 0000 4001 a8c6 c0a8 0001
	0x0010:  c0a8 0002 0501 3a53 c0a8 0003 4500 0054
	0x0020:  b3b1 4000 3f01 7404 c0a8 0002 c0a8 92a0
	0x0030:  0800 f8f8 1591 0001 d00f 5056 0000 0000
	0x0040:  fc3b 0e00 0000 0000 1011 1213 1415 1617
	0x0050:  1819 1a1b 1c1d 1e1f 2021 2223 2425 2627
	0x0060:  2829 2a2b 2c2d 2e2f 3031 3233 3435 3637

# CentOS_Router V1传递CentOS V1发送过来的数据报,发送到CentOS_Router V2
00:00:00.002932 00:0c:29:23:1a:0b > 00:0c:29:ad:d3:58, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 63, id 46001, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.0.2 > 192.168.146.160: ICMP echo request, id 5521, seq 1, length 64
	0x0000:  4500 0054 b3b1 4000 3f01 7404 c0a8 0002
	0x0010:  c0a8 92a0 0800 f8f8 1591 0001 d00f 5056
	0x0020:  0000 0000 fc3b 0e00 0000 0000 1011 1213
	0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
	0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
	0x0050:  3435 3637

# CentOS V1收到 CentOS_Router V1发送的ICMP重定向数据报后,后续向192.168.146.160发送ICMP回显请求( seq=2)的时候,下一跳不再选择CentOS_Router V1 而是CentOS_Router V2
00:00:00.989609 00:50:56:2b:3f:e7 > 00:0c:29:ad:d3:58, ethertype IPv4 (0x0800), length 98: (tos 0x0, ttl 64, id 46002, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.0.2 > 192.168.146.160: ICMP echo request, id 5521, seq 2, length 64
	0x0000:  4500 0054 b3b2 4000 4001 7303 c0a8 0002
	0x0010:  c0a8 92a0 0800 1fe2 1591 0002 d10f 5056
	0x0020:  0000 0000 d451 0e00 0000 0000 1011 1213
	0x0030:  1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
	0x0040:  2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
	0x0050:  3435 3637

# CentOS_Router V2收到CentOS_Router V1转送过来的ICMP回显请求,查询路由表,出口为eth0,发现192.168.146.160不存在,向CentOS V1返回ICMP主机不可达差错信息
# 类型+代码:0x0301,即主机不可达
00:00:02.026138 00:0c:29:ad:d3:58 > 00:50:56:2b:3f:e7, ethertype IPv4 (0x0800), length 126: (tos 0xc0, ttl 64, id 30698, offset 0, flags [none], proto ICMP (1), length 112)
    192.168.0.3 > 192.168.0.2: ICMP host 192.168.146.160 unreachable, length 92
	(tos 0x0, ttl 62, id 46001, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.0.2 > 192.168.146.160: ICMP echo request, id 5521, seq 1, length 64
	0x0000:  45c0 0070 77ea 0000 4001 808d c0a8 0003
	0x0010:  c0a8 0002 0301 fcfe 0000 0000 4500 0054
	0x0020:  b3b1 4000 3e01 7504 c0a8 0002 c0a8 92a0
	0x0030:  0800 f8f8 1591 0001 d00f 5056 0000 0000
	0x0040:  fc3b 0e00 0000 0000 1011 1213 1415 1617
	0x0050:  1819 1a1b 1c1d 1e1f 2021 2223 2425 2627
	0x0060:  2829 2a2b 2c2d 2e2f 3031 3233 3435 3637

# CentOS_Router V2收到CentOS V1直接发送过来的ICMP回显请求,查询路由表,出口为eth0,发现192.168.146.160不存在,向CentOS V1返回ICMP主机不可达差错信息
# 类型+代码:0x0301,即主机不可达
00:00:00.000033 00:0c:29:ad:d3:58 > 00:50:56:2b:3f:e7, ethertype IPv4 (0x0800), length 126: (tos 0xc0, ttl 64, id 30699, offset 0, flags [none], proto ICMP (1), length 112)
    192.168.0.3 > 192.168.0.2: ICMP host 192.168.146.160 unreachable, length 92
	(tos 0x0, ttl 63, id 46002, offset 0, flags [DF], proto ICMP (1), length 84)
    192.168.0.2 > 192.168.146.160: ICMP echo request, id 5521, seq 2, length 64
	0x0000:  45c0 0070 77eb 0000 4001 808c c0a8 0003
	0x0010:  c0a8 0002 0301 fcfe 0000 0000 4500 0054
	0x0020:  b3b2 4000 3f01 7403 c0a8 0002 c0a8 92a0
	0x0030:  0800 1fe2 1591 0002 d10f 5056 0000 0000
	0x0040:  d451 0e00 0000 0000 1011 1213 1415 1617
	0x0050:  1819 1a1b 1c1d 1e1f 2021 2223 2425 2627
	0x0060:  2829 2a2b 2c2d 2e2f 3031 3233 3435 3637

五、实验结果分析

  • 结合上述实验结果,得出过程图,具体过程见数据报分析

图片失效

六、参考内容