traceroute:是网络诊断中,用来分析IP包经过那些路由的命令。
学前知识:
IP包中有个字段TTL,这个是最大跳转次数的字段,每经过一个路由器,值会-1,当值为0的时候,这个包就会被路由器丢弃,并返回ICMP-超时包给请求主机。
实现原理:
1、traceroute首先发出三个UDP包(发出三个主要是为了统计,这里可以不用太在意),其TTL的字段为1,目的地为目标主机的IP,该UDP包在经过路由器-1时,TTL值会被设置为0该包会被丢弃,并返回ICMP-超时给请求主机;
2、在收到路由器1发来的"ICMP-超时"包时,traceroute会继续发出三个UDP包,其TTL的字段被设置为2,该UDP包顺利的经过了路由器-1,在到达路由器-2时,TTL值被值为0,随之丢弃,返回ICMP-超时包给请求主机;
…………继续重复,每收到一个返回ICMP-超时的包,则继续发出TTL值+1的UDP包;
3、就这样,在经历了4个路由器后,TTL=5的UDP包,历经千山万水,终于来到了目的主机,大家可能会觉得目的主机会欣然接受这个UDP包,但实际不是,目的主机做了如下的处理:
丢弃(不认识你,狗带)
返回ICMP-目标不可达包给请求主机
大家可能觉得很奇怪,为什么会被丢弃呢?简单的说一下,就是主机没有监听该UDP端口的进程。
4、请求主机的traceroute程序,在收到ICMP-目标不可达包后,终于心满意足的结束工作了。
下面为了加深一下印象,结合tcpdump命令,对traceroute过程进行一些验证
主要观察过程中[发出的UDP包] [路由器返回的ICMP-超时包] [目的主机返回的ICMP-目标不可达包]
1、使用命令,监听目的主机相关的包
tcpdump -i eno33554984 -vvnn host 119.146.184.98
2、使用traceroute命令对目的主机发起请求
[root@www ~]#traceroute 119.146.184.98 traceroute to 119.146.184.98 (119.146.184.98), 30 hops max, 60 byte packets 1 192.168.0.1 (192.168.0.1) 2.217 ms 1.741 ms 1.509 ms 2 116.24.132.1 (116.24.132.1) 11.348 ms 11.117 ms 11.287 ms 3 113.106.47.93 (113.106.47.93) 7.111 ms 6.848 ms 7.123 ms 4 5.107.38.59.broad.fs.gd.dynamic.163data.com.cn (59.38.107.5) 6.921 ms 6.712 ms 6.434 ms 5 183.59.12.153 (183.59.12.153) 8.635 ms 7.664 ms 7.593 ms 6 183.61.222.102 (183.61.222.102) 11.923 ms 10.220 ms 9.423 ms 7 119.146.184.198 (119.146.184.198) 15.779 ms 119.146.184.94 (119.146.184.94) 47.902 ms 119.146.184.62 (119.146.184.62) 16.571 ms #################################### #返回结果解释: #列1:[1] 经过的路由器序号; #列2:[192.168.0.1 ] 路由器IP(也叫网关); #列3:[(113.106.47.93) ] 即括号内的内容,具体用途不明,有懂的可以解释一下哈; #列4:[7.111 ms] 返回的时间,这里也可以发现,一共有3个时间,还想起来吗?traceroute每次发出的UDP包都是3个一起发的; 需要注意的是,大家可以看到最后一列,是有3个地址的,其实也不难理解,路由器是会根据实际情况寻找合适的路径;
3、现在来看看tcpdump采集的结果,观察由请求主机发出的UDP包
18:56:27.892318 IP (tos 0x0, ttl 1, id 10584, offset 0, flags [none], proto UDP (17), length 60) 192.168.0.200.39914 > 119.146.184.98.33434: [bad udp cksum 0xf19e -> 0xfaae!] UDP, length 32 18:56:27.892798 IP (tos 0x0, ttl 1, id 10585, offset 0, flags [none], proto UDP (17), length 60) 192.168.0.200.38541 > 119.146.184.98.33435: [bad udp cksum 0xf19e -> 0x000b!] UDP, length 32 18:56:27.893869 IP (tos 0x0, ttl 1, id 10586, offset 0, flags [none], proto UDP (17), length 60) #################################### #返回结果解释: #可以看到我们的主机,往119.146.184.98发出TTL=1的UDP包,而且是三个;这里大家可以奇怪,不是说经过的网关会返回ICMP-超时的包吗?为啥没看到呢? #为什么呢? #因为ICMP-超时这个包,不是119.146.184.98返回的,那是谁返回的呢?回忆一下上文!是路由器!所以这里我们需要使用tcpdump指定路由器的ip来抓包。
4、观察路由器返回的ICMP-超时包