文章中有截图,看不清的话,可以把浏览器显示比例放大到200%后观看。
linux下traceroute的原理
本文通过抓包观察一下linux下traceroute的原理
环境:一台嵌入式linux设备,内网ip是192.168.186.195,其上有192.168.202.1的ip地址。网关是192.168.186.1。外部公网ip一个乌班图设备,ip是221.5.87.66。在嵌入式上抓包,然后传出观察。
过程:
crt上运行tftp服务器。
cmd下验证
C:\Windows\System32>netstat -ano | findstr :69 查看udp69端口是否打开?
UDP 0.0.0.0:69 *:* 27556(得到进程号是27556)
UDP [::]:69 *:* 27556
C:\Windows\System32>tasklist | findstr 27556 根据进程号查程序名
SecureCRT.exe 27556 Console 1 62,852 K
确定已经打开,文件保存目录事先已经设定好C:\Users\zy041\Desktop\seccrt\tftp\log。
已知设备的eth0口上联口192.168.186.195,gw是192.168.186.1
抓包~ # tcpdump -i eth0 -w trace2.pcap host 221.5.87.66 or icmp
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
另起一个ssh,执行traceroute
/mnt/userspace # traceroute -w 1 -d 221.5.87.66 -w 1是超时等待时间是1秒,-d是不进行dns解析,这样可以提高回显时间。
traceroute to 221.5.87.66 (221.5.87.66), 30 hops max, 38 byte packets
1 192.168.186.1 (192.168.186.1) 0.464 ms 0.293 ms 0.348 ms
2 bogon (10.110.1.1) 1.224 ms 0.913 ms 0.957 ms
3 10.0.64.1 (10.0.64.1) 5.988 ms 3.577 ms 3.588 ms
4 123.139.2.33 (123.139.2.33) 3.980 ms 3.946 ms 3.903 ms
5 * * 221.11.0.2 (221.11.0.2) 4.460 ms
6 221.11.0.153 (221.11.0.153) 6.493 ms * *
7 * * *
8 112.96.0.198 (112.96.0.198) 44.014 ms 43.995 ms 43.515 ms
9 120.80.209.146 (120.80.209.146) 40.623 ms 40.636 ms 40.358 ms
10 221.5.87.66 (221.5.87.66) 40.255 ms 39.971 ms 39.960 ms
如图,经过10次到达目的ip221.5.87.66。
停止抓包
~ # tcpdump -i eth0 -w trace2.pcap host 221.5.87.66 or icmp
tcpdump: WARNING: eth0: no IPv4 address assigned
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
^C60 packets captured ctrl+c结束抓包
60 packets received by filter
0 packets dropped by kernel
~ # tftp -pl trace2.pcap 192.168.186.118 传出文件
trace2.pcap 100% |***************************************************************| 5515 0:00:00 ETA
打开观察:
同一ip发来的ttl exceeded三次,判断可能这个ip收到ttl=1的udp包三次,所以wireshark里添加ttl项
找到ip层的ttl项,增加为列
可以看到,ttl为1-10的包,每个ttl取值发了三次,udp的目的端口每发一次+1,因为ttl exceeded消息,回携带部分收到的ttl=1的包,因为发的是udp消息,所以ip层的ttl=1,而这个ttl exceeed消息因为设备不同,ttl原始值有的是255,有的是128,有的是64,所以经过对应节点后,减1后取值不同。
看最后,ttl=10时,到达目的ip,由目的ip 221.5.87.66发出目的端口不可达(目的端口未打开这个端口),所以源设备收到目的设备ip发出目的端口不可达认为已经到达对方设备,停止发出udp包。
由此,traceroute的原理是发出udp包,ttl从1开始,每个ttl值发三次,udp的目的端口有一个基础值,每发一包,端口+1,记录ttl exceed消息的ip为经过节点ip,在收到目的发出目的端口不可达消息后,认为到达目的设备,停止命令。