路由追踪:traceroute/tcptraceroute
一.工作原理
traceroute:IP路由过程中对数据包TTL(Time to Live,存活时间)进行处理。当路由器收到一个IP包时,会修改IP包的TTL(及由此造成的头部检验和checksum变化)。每收到一个包,检查这个 的TTL是否是0。如果是,表明这个包还没有到达目的地,而且剩余时间不多了,肯定是到不了目的地了。这样路由器就简单地丢弃这个包,并给源主机发送 ICMP通知,说这个包已经超时了。ICMP的通知信息里包含当前路由器发送时所用的IP。这样就可以通过构造数据包,来间接检查到达一个主机时经过了哪些路由。一开始发送一个TTL为1的包,这样到达第一个路由器的时候就已经超时了,第一个路由器就发通知说包超时,这样就可以记录下 所经过的第一个路由器的IP。然后TTL加1,安全通过第一个路由器,而第二个路由器的的处理与第一个相同,丢包,发通知说包超时了,这样记录下第二个路 由器IP,由此可以一直进行下去,直到这个数据包到达目标主机,由此打印出所有经过的路由器。
tcptraceroute:现代网络广泛使用防火墙,导致传统路由跟踪工具发出的(ICMP应答(ICMP echo)或UDP)数据包都被过滤掉了,所以无法进行完整的路由跟踪。尽管如此,许多情况下,防火墙会准许TCP数据包通过防火墙到达指定端口,这些端口是主机内防火墙背后的一些程序和外界连接用的。通过发送TCP SYN数据包来代替UDP或者ICMP应答数据包,tcptraceroute可以穿透大多数防火墙。
二.命令格式
#traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,... ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w MAX,HERE,NEAR ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ --fwmark=num ] host [ packetlen ]
其中traceroute -T等效于tcptraceroute
三.常用参数
-4 #强制使用ipv4地址
-6 #强制使用ipv6地址
-d #允许套接字层的调试
-F #不要对数据包进行拆分
-f first_ttl #从指定的跳数开始,而不是从1开始
-g gate,... #设置指定路由路径,ipv4协议最多设置8个,ipv6协议最多设置127个
-I #使用ICMP ECHO进行探测
-T #使用TCP SYN包进行探测,等同于tcptraceroute,默认端口是80
-i device #指定网卡设备
-m max_ttl #设置最大跳数,即最大TTL值,默认为30
-N squeries #指定同时发送的探测包数量,默认是16
-n #不要进行域名解析,以点分十进制形式显示地址
-p port #设置目的端口,UDP和ICMP端口值会增长,TCP不会改变
-t tos --tos=tos #设置ipv4的服务类型或者ipv6的通信流类别
-l flow_label #给ipv6数据包添加flow_label来使其被路由器特殊处理
-w MAX,HERE,NEAR # 设置超时,HERE为相同路由器等待次数(默认3次),NEAR为下一跳路由等待次数(默认10次),MAX为超时时间(默认5秒)
-q nqueries #设置每一跳发送的数据包量,默认是3个
-r #跳过普通的路由表,直接将数据包发送到远程主机
-s source_addr #设置探测包的来源IP地址
-z sendwait #设置探测包间隔,默认为0,不超过10是毫秒单位,超过10是秒单位
-e #展示ICMP扩展,包括多协议标签交换
-A #打印AS-PATH(BGP协议中的路径属性)
-M name #使用指定的模块进行探测(内建或者拓展的)
-O OPTS,... #使用多个指定的模块,用逗号隔开
--sport=num #指定源端口
--fwmark=num #给数据包设置防火墙标记
-U --udp #使用指定的UDP端口,默认是53
-UL #使用轻量级用户数据包协议来探测,默认端口是53
-D --dccp #使用数据包拥塞控制协议来探测(默认端口是33434)
-P prot #使用未经封装指定协议数据包来探测
--mtu #发现追踪路径上的最大传输单元(数据帧数据部分最大长度)
--back #打印返回路径的hop(路由跳),如果看起来跟去的方向的不一样
-V #打印版本信息并退出
--help #寻求帮助并且退出
Arguments: #参数
host #需要探测的主机
packetlen #设置包长度,默认是40bytes
四.实践
首先使用traceroute进行探测
#traceroute -n www.baidu.com traceroute to www.baidu.com (119.75.216.20), 30 hops max, 60 byte packets 1 222.20.5.254 0.530 ms 0.495 ms 0.493 ms 2 115.156.255.149 1.121 ms 1.253 ms 1.309 ms 3 192.168.255.177 0.632 ms 0.753 ms 0.916 ms 4 192.168.255.210 0.594 ms 0.762 ms 0.963 ms 5 * 202.114.1.186 2.228 ms * 6 202.112.53.81 3.614 ms 3.716 ms 3.869 ms 7 * * * 8 101.4.117.38 27.026 ms 26.956 ms 26.878 ms 9 101.4.112.1 22.127 ms 22.487 ms 22.393 ms 10 101.4.113.117 24.541 ms 23.641 ms 22.407 ms 11 219.224.103.10 21.155 ms 21.234 ms 20.291 ms 12 * * * 13 * * * 14 * * * 15 * * * 16 * * * ……………… 29 * * * 30 * * *
可以看到数据包并没有到达指定主机,而被过滤了,再使用tcptraceroute
# traceroute -T -n www.baidu.com traceroute to www.baidu.com (119.75.213.61), 30 hops max, 60 byte packets 1 * * * 2 115.156.255.149 0.561 ms 0.649 ms 0.767 ms 3 192.168.255.177 0.660 ms 0.765 ms 0.839 ms 4 192.168.255.210 0.640 ms 0.670 ms 0.720 ms 5 * * * 6 202.112.53.81 3.216 ms 2.826 ms 2.898 ms 7 * * * 8 101.4.117.38 27.082 ms 27.067 ms 27.049 ms 9 101.4.112.1 20.844 ms 19.985 ms 19.928 ms 10 101.4.113.117 21.696 ms 20.031 ms 29.858 ms 11 219.224.103.10 23.393 ms 20.158 ms 20.552 ms 12 * * * 13 * * * 14 119.75.213.61 20.215 ms 20.114 ms 20.052 ms
可以看到数据包到达了目的主机,这里我们使用traceroute -T 。这和tcptraceroute是等效的。使用tcptraceroute可以有效的穿透防火墙,从而到达目的主机