ICMP实验五:traceroute(ICMP超时、端口不可达)

2015年11月13日

一、实验目的

通过简单实验来了解traceroute原理和过程

二、简介

  • traceroute程序作用
    • 记录IP数据报从一台主机传到另一台主机所经过的路由
  • traceroute原理
    • TTL:路由器计数器,IP数据报每经过一个路由器,TTL减1
    • 中间路由器接收到目的IP地址不是本身,而TTL为1的IP数据报,向源地址发送ICMP超时差错报文,记录本身IP
    • 目标主机接收到目的IP地址是本身,而TTL为不小于1的IP数据报,向源主机发送ICMP端口不可达差错报文,记录本身IP
  • traceroute过程
    1. 发送一份TTL字段为1的IP数据报给目的主机,处理这份数据报的第一个路由器将TTL置为0,丢弃该数据报,并发回一份超时ICMP报文,得到第一个路由器的地址
    2. 发送一份TTL字段为2的IP数据报给目的主机,处理这份数据报的第二个路由器将TTL置为0,丢弃该数据报,并发回一份超时ICMP报文,得到第二个路由器的地址
    3. 发送一份TTL字段为n的IP数据报给目的主机,目的主机收到一份TTL字段为1的IP数据报,识别出是发送给自己的数据报,而IP数据报实体为端口很大的UDP数据报,目标主机丢弃该数据报,并发回一份端口不可达ICMP报文,得到目的主机的地址

三、实验环境

  • 网络拓扑图

图片失效

  • 具体参数
表1 ICMP实验环境
机器名称 网卡名称 IP地址 MAC地址 默认网关
CentOS V1 eth0 192.168.0.2/24 00:50:56:37:63:fe 192.168.0.1
CentOS V2 eth0 192.168.1.2/24 00:0c:29:fd:28:3b 192.168.1.1
Router V1 eth2 192.168.0.1/24 00.0c.29.0a.06.f6
eth1 192.168.147.11/24 00.0c.29.0a.06.ec 192.168.147.13
Router V2 eth2 192.168.1.1/24 00.50.56.37.82.48
eth0 192.168.147.13/24 00.50.56.30.1c.49 192.168.147.11

四、实验步骤

  • 关闭CentOS V1和CentOS V2上的防火墙
1
2
3
# 命令
systemctl stop firewalld.service    # 停止firewall
systemctl disable firewalld.service # 禁止firewall开机启动
  • 在CentOS V2的eth0上监听关于子网192.168.0.0/16的icmp和udp数据包
1
2
# 命令
tcpdump -i eth0 -etxvnn -tt \(icmp or udp\) and net 192.168.0.0/16
  • 在CentOS V1上向CentOS V2进行traceroute操作
1
2
3
4
5
6
7
8
# 命令
traceroute -m 3 -q 1 192.168.1.2

# 结果
traceroute to 192.168.1.2 (192.168.1.2), 3 hops max, 60 byte packets
 1  192.168.0.1 (192.168.0.1)  2.013 ms
 2  192.168.147.13 (192.168.147.13)  2.469 ms
 3  192.168.1.2 (192.168.1.2)  3.949 ms
  • CentOS V2监听到的网络内容如下(按照IP数据报分组,不按严格按照时间顺序)
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
# ======== TTL为1的IP数据报 ========
# CentOS V1发送第1个IP数据包(装载UDP数据):id为54000,TTL为1,源地址为CentOS V1,目标为CentOS V2,下一站为Router V1
00:00:00.000000 00:50:56:37:63:fe > 00:0c:29:0a:06:f6, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 1, id 54000, offset 0, flags [none], proto UDP (17), length 60)
    192.168.0.2.34172 > 192.168.1.2.33434: UDP, length 32
	0x0000:  4500 003c d2f0 0000 0111 646c c0a8 0002
	0x0010:  c0a8 0102 857c 829a 0028 802d 4041 4243
	0x0020:  4445 4647 4849 4a4b 4c4d 4e4f 5051 5253
	0x0030:  5455 5657 5859 5a5b 5c5d 5e5f

# Router V1接收到CentOS V1发送的第1个IP数据包(id为54000),TTL为1,该数据报的目的地址不是Router V1,Router V1返回装载ICMP超时差错报文的IP数据报:id为11326,TTL为64,源地址为Router V1,目标为CentOS V1,下一站为CentOS V1
# 得到第一个路由器地址192.168.0.1
00:00:00.001715 00:0c:29:0a:06:f6 > 00:50:56:37:63:fe, ethertype IPv4 (0x0800), length 102: (tos 0xc0, ttl 64, id 11326, offset 0, flags [none], proto ICMP (1), length 88)
    192.168.0.1 > 192.168.0.2: ICMP time exceeded in-transit, length 68
	(tos 0x0, ttl 1, id 54000, offset 0, flags [none], proto UDP (17), length 60)
    192.168.0.2.34172 > 192.168.1.2.33434: UDP, length 32
	0x0000:  45c0 0058 2c3e 0000 4001 cc53 c0a8 0001
	0x0010:  c0a8 0002 0b00 778e 0000 0000 4500 003c
	0x0020:  d2f0 0000 0111 646c c0a8 0002 c0a8 0102
	0x0030:  857c 829a 0028 802d 4041 4243 4445 4647
	0x0040:  4849 4a4b 4c4d 4e4f 5051 5253 5455 5657
	0x0050:  5859 5a5b 5c5d 5e5f


# ======== TTL为2的IP数据报 ========
# CentOS V1发送第2个IP数据包(装载UDP数据):id为54001,TTL为2,源地址为CentOS V1,目标为CentOS V2,下一站为Router V1
00:00:00.000012 00:50:56:37:63:fe > 00:0c:29:0a:06:f6, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 2, id 54001, offset 0, flags [none], proto UDP (17), length 60)
    192.168.0.2.34955 > 192.168.1.2.33435: UDP, length 32
	0x0000:  4500 003c d2f1 0000 0211 636b c0a8 0002
	0x0010:  c0a8 0102 888b 829b 0028 7d1d 4041 4243
	0x0020:  4445 4647 4849 4a4b 4c4d 4e4f 5051 5253
	0x0030:  5455 5657 5859 5a5b 5c5d 5e5f

# Router V1接收到CentOS V1发送的第2个IP数据包(id为54001),TTL为2,置为1,源地址CentOS V1,置为出口路由器地址即Route V1,并转发到默认网关(Router V2):id为54001,TTL为1,源地址为Router V1,目标为CentOS V2,下一站为Router V2
# UDP离开内网时需要修改为出口路由器的地址
# 源地址置为出口路由器地址前,缓存相应信息
00:00:00.000272 00:0c:29:0a:06:ec > 00:50:56:30:1c:49, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 1, id 54001, offset 0, flags [none], proto UDP (17), length 60)
    192.168.147.11.34955 > 192.168.1.2.33435: UDP, length 32
	0x0000:  4500 003c d2f1 0000 0111 d161 c0a8 930b
	0x0010:  c0a8 0102 888b 829b 0028 ea13 4041 4243
	0x0020:  4445 4647 4849 4a4b 4c4d 4e4f 5051 5253
	0x0030:  5455 5657 5859 5a5b 5c5d 5e5f


# Router V2接收到CentOS V1发送的第2个IP数据包(id为54001),TTL为1,该数据报的目的地址不是Router V2,Router V2返回装载ICMP超时差错报文[0x0b00]的IP数据报:id为57096,TTL为64,源地址为Router V2,目标为Router V1(依据引起差错报文的IP数据报的源地址),下一站为Router V1
00:00:00.000180 00:50:56:30:1c:49 > 00:0c:29:0a:06:ec, ethertype IPv4 (0x0800), length 102: (tos 0xc0, ttl 64, id 57096, offset 0, flags [none], proto ICMP (1), length 88)
    192.168.147.13 > 192.168.147.11: ICMP time exceeded in-transit, length 68
	(tos 0x0, ttl 1, id 54001, offset 0, flags [none], proto UDP (17), length 60)
    192.168.147.11.34955 > 192.168.1.2.33435: UDP, length 32
	0x0000:  45c0 0058 df08 0000 4001 f372 c0a8 930d
	0x0010:  c0a8 930b 0b00 0a98 0000 0000 4500 003c
	0x0020:  d2f1 0000 0111 d161 c0a8 930b c0a8 0102
	0x0030:  888b 829b 0028 ea13 4041 4243 4445 4647
	0x0040:  4849 4a4b 4c4d 4e4f 5051 5253 5455 5657
	0x0050:  5859 5a5b 5c5d 5e5f

# Router V1接收到Router V2发送的ICMP超时差错报文(id为57096),TTL为64,置为63,依据之前缓存的数据将目标地址设置为CentOS V1:id为57096,TTL为63,源地址为Router V2,目标为CentOS V1,下一站为CentOS V1
# 得到第二个路由器地址192.168.147.13
00:00:00.000148 00:0c:29:0a:06:f6 > 00:50:56:37:63:fe, ethertype IPv4 (0x0800), length 102: (tos 0xc0, ttl 63, id 57096, offset 0, flags [none], proto ICMP (1), length 88)
    192.168.147.13 > 192.168.0.2: ICMP time exceeded in-transit, length 68
	(tos 0x0, ttl 1, id 54001, offset 0, flags [none], proto UDP (17), length 60)
    192.168.0.2.34955 > 192.168.1.2.33435: UDP, length 32
	0x0000:  45c0 0058 df08 0000 3f01 877c c0a8 930d
	0x0010:  c0a8 0002 0b00 778e 0000 0000 4500 003c
	0x0020:  d2f1 0000 0111 646b c0a8 0002 c0a8 0102
	0x0030:  888b 829b 0028 7d1d 4041 4243 4445 4647
	0x0040:  4849 4a4b 4c4d 4e4f 5051 5253 5455 5657
	0x0050:  5859 5a5b 5c5d 5e5f

# ======== TTL为3的IP数据报 ========
# CentOS V1发送第3个IP数据包(装载UDP数据):id为54002,TTL为3,源地址为CentOS V1,目标为CentOS V2,下一站为Router V1
00:00:00.000002 00:50:56:37:63:fe > 00:0c:29:0a:06:f6, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 3, id 54002, offset 0, flags [none], proto UDP (17), length 60)
    192.168.0.2.48776 > 192.168.1.2.33436: UDP, length 32
	0x0000:  4500 003c d2f2 0000 0311 626a c0a8 0002
	0x0010:  c0a8 0102 be88 829c 0028 471f 4041 4243
	0x0020:  4445 4647 4849 4a4b 4c4d 4e4f 5051 5253
	0x0030:  5455 5657 5859 5a5b 5c5d 5e5f

# Router V1接收到CentOS V1发送的第3个IP数据包(id为54002),TTL为3,置为2,源地址CentOS V1,置为出口路由器地址即Route V1,并转发到默认网关(Router V2):id为54002,TTL为2,源地址为Router V1,目标为CentOS V2,下一站为Router V2
# UDP离开内网时需要修改为出口路由器的地址
# 源地址置为出口路由器地址前,缓存相应信息
00:00:00.000006 00:0c:29:0a:06:ec > 00:50:56:30:1c:49, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 2, id 54002, offset 0, flags [none], proto UDP (17), length 60)
    192.168.147.11.48776 > 192.168.1.2.33436: UDP, length 32
	0x0000:  4500 003c d2f2 0000 0211 d060 c0a8 930b
	0x0010:  c0a8 0102 be88 829c 0028 b415 4041 4243
	0x0020:  4445 4647 4849 4a4b 4c4d 4e4f 5051 5253
	0x0030:  5455 5657 5859 5a5b 5c5d 5e5f

# Router V2接收到CentOS V1发送的第3个IP数据包(id为54002),TTL为2,置为1,源地址Route V1,转发到子网机器CentOS V2:id为54002,TTL为1,源地址为Router V1,目标为CentOS V2,下一站为CentOS V2
00:00:00.000563 00:50:56:37:82:48 > 00:0c:29:fd:28:3b, ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 1, id 54002, offset 0, flags [none], proto UDP (17), length 60)
    192.168.147.11.48776 > 192.168.1.2.33436: UDP, length 32
	0x0000:  4500 003c d2f2 0000 0111 d160 c0a8 930b
	0x0010:  c0a8 0102 be88 829c 0028 b415 4041 4243
	0x0020:  4445 4647 4849 4a4b 4c4d 4e4f 5051 5253
	0x0030:  5455 5657 5859 5a5b 5c5d 5e5f

# CentOS V2接收到CentOS V1发送的第3个IP数据包(id为54002),TTL为1,该数据报的目的地址是CentOS V2,CentOS V2返回装载ICMP端口不可达差错报文[0x0303]的IP数据报:id为8003,TTL为64,源地址为CentOS V2,目标为Router V1(依据引起差错报文的IP数据报的源地址),下一站为Router V2
00:00:00.000030 00:0c:29:fd:28:3b > 00:50:56:37:82:48, ethertype IPv4 (0x0800), length 102: (tos 0xc0, ttl 64, id 8003, offset 0, flags [none], proto ICMP (1), length 88)
    192.168.1.2 > 192.168.147.11: ICMP 192.168.1.2 udp port 33436 unreachable, length 68
	(tos 0x0, ttl 1, id 54002, offset 0, flags [none], proto UDP (17), length 60)
    192.168.147.11.48776 > 192.168.1.2.33436: UDP, length 32
	0x0000:  45c0 0058 1f43 0000 4001 4544 c0a8 0102
	0x0010:  c0a8 930b 0303 1295 0000 0000 4500 003c
	0x0020:  d2f2 0000 0111 d160 c0a8 930b c0a8 0102
	0x0030:  be88 829c 0028 b415 4041 4243 4445 4647
	0x0040:  4849 4a4b 4c4d 4e4f 5051 5253 5455 5657
	0x0050:  5859 5a5b 5c5d 5e5f

# Router V2接收到CentOS V1返回的承载ICMP端口不可达报文的IP数据报,TTL为64,置为63,转发到默认路由(Router V1):id为8003,TTL为63,源地址为CentOS V1,目标为Router V1,下一站为Router V1
# ICMP离开内网时不需要修改为出口路由器的地址
00:00:00.000454 00:50:56:30:1c:49 > 00:0c:29:0a:06:ec, ethertype IPv4 (0x0800), length 102: (tos 0xc0, ttl 63, id 8003, offset 0, flags [none], proto ICMP (1), length 88)
    192.168.1.2 > 192.168.147.11: ICMP 192.168.1.2 udp port 33436 unreachable, length 68
	(tos 0x0, ttl 1, id 54002, offset 0, flags [none], proto UDP (17), length 60)
    192.168.147.11.48776 > 192.168.1.2.33436: UDP, length 32
	0x0000:  45c0 0058 1f43 0000 3f01 4644 c0a8 0102
	0x0010:  c0a8 930b 0303 1295 0000 0000 4500 003c
	0x0020:  d2f2 0000 0111 d160 c0a8 930b c0a8 0102
	0x0030:  be88 829c 0028 b415 4041 4243 4445 4647
	0x0040:  4849 4a4b 4c4d 4e4f 5051 5253 5455 5657
	0x0050:  5859 5a5b 5c5d 5e5f

# Router V1接收到CentOS V1返回的承载ICMP端口不可达报文的IP数据报,TTL为63,置为62,依据之前缓存的信息转发到子网机器(CentOS V1):id为8003,TTL为62,源地址为CentOS V2,目标为CentOS V1,下一站为CentOS V1
# 得到最后一个路由器地址192.168.1.2
00:00:00.000005 00:0c:29:0a:06:f6 > 00:50:56:37:63:fe, ethertype IPv4 (0x0800), length 102: (tos 0xc0, ttl 62, id 8003, offset 0, flags [none], proto ICMP (1), length 88)
    192.168.1.2 > 192.168.0.2: ICMP 192.168.1.2 udp port 33436 unreachable, length 68
	(tos 0x0, ttl 1, id 54002, offset 0, flags [none], proto UDP (17), length 60)
    192.168.0.2.48776 > 192.168.1.2.33436: UDP, length 32
	0x0000:  45c0 0058 1f43 0000 3e01 da4d c0a8 0102
	0x0010:  c0a8 0002 0303 7f8b 0000 0000 4500 003c
	0x0020:  d2f2 0000 0111 646a c0a8 0002 c0a8 0102
	0x0030:  be88 829c 0028 471f 4041 4243 4445 4647
	0x0040:  4849 4a4b 4c4d 4e4f 5051 5253 5455 5657
	0x0050:  5859 5a5b 5c5d 5e5f

五、实验结果分析

  • 结合上述实验结果,得出traceroute过程图

图片失效

  • 几点注意
    1. 当UDP数据报离开路由器(出口)时,网络层源地址需要从内网地址转换为路由器出口地址,例如TTL为2和3时数据报过程中的第二步(S2)
    2. 当ICMP差错报文离开路由器(出口)时,网络层源地址无需变动,例如TTL为3时数据报过程中的第五步(S5)

六、参考内容