关于traceroute的新姿势

前言


话说,为何对trace route产生了兴趣?还是来源于学校的渣渣网络。贵校的渣渣网络其实挺好,人手一个Public IP,只是说,出口处做了防火规则,禁止进入而言罢了。中间一个大的10.0.0.0/8的网络打通全网。

Traceroute

似乎教科书会提及到traceroute利用了ICMP的TTL字段来进行跟踪路由。然后就一笔带过了。因此,俺当年也天真的以为traceroute只能通过ICMP来追踪路由。但是近几日的深入研究后,也是发现,too young, too simple. 为啥俺能发现这个问题捏?其实在于俺交的网管喜欢乱玩firewall喽,老是disable掉icmp。而当网管disable掉ICMP后,俺喜欢用的mtr与traceroute的表现出了差异,不是mtr不能用就是traceroute不能用。
卧槽,不是都用的ICMP嘛,为啥会有差异。好吧,求人不如求已,RTFM。 细细扫了一遍traceroute,俺在最后发现了作者良心的写下了
LIST OF AVAILABLE METHODS 俺总结下:
1. default:
也是最古老的方法,用udp包加unlikely-port来探测。如何做呢,思路为,每一次发送的ttl+1,dst_ip填target ip。沿途的router在ttl发现为0后,回送icmp time exceed。当数据包到达dst_ip后,dst_host回送icmp unreach port,因此trace route通过抓取这两种类型的icmp packet即可。
2. icmp: 
目前最通用的方法,其实也是mtr的默认探测方法。利用icmp的echo request方式来发送packet。
 3. tcp: 
也是一种现在常用的测量方法,主要用来穿越防火墙使用。假设当你去traceroute一台主机时,有可能中间的router会直接filter掉的你的icmp echo request和一些不知名的udp port,因此,利用udp和icmp方式的探测就会立即失效。这时候,tcp方式直接利用tcp的syn包来穿越防火墙。譬如,当traceroute baidu.com时,利用-T -p 80指定tcp port=80,ttl=1,2,3,4,5....
4. udp: 
利用诸如udp port=53一类的正常端口。但是呢,这种方法有问题,就是说,可能最后一跳不认识数据包就不回复了,不过值得庆幸的是,DNS还是要回复的。233.
5. udp-lite: 
咦,这还是门新的协议,简单地说,利用
socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE);来创建,而传统的udp方式是以socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
6. dccp:
socket(AF_INET, SOCK_DCCP, IPPROTO_DCCP)
7. raw:
这种方式就直截了当,直接payload里面啥都不装,朝网络里面扔过去。

No comments:

Post a Comment