Linux traceroute 原理及使用
序
在某次接入数据的场景中,需要到对方 SFTP 服务器上,获取数据,但是在配置时发现在配置正确的情况下, 连接总是超时,最终排查后发现网络不通,打通网络后才正确连接,获取到数据。
那么,在 linux 中,我们有哪些排查网络互通的方法呢?本章节主要讲解 traceroute
的原理以及使用方法。
网络架构
这部分与网络架构强相关,需要了解网络层级结构:
请参考这里
traceroute 原理
tracerou``te
命令可以显示从本地到目标端的传输路径。在网络中,传递信息传输路径大体是一样的,对此 traceroute
通过发送不同的数据包,让经过的每个设备都返回当前节点的时间、名称、ip 地址,一直到终点。
数据包默认大小为 40 Bytes。
为了让经过的每个设备都返回信息,traceroute
设置 IP 数据包的 TTL 值来实现。可以理解为发送一个快递,如果在一段期限内没有送达,就请退还回来。
TTL Time to Live
一般指的是存活时间,但在这里特指还能通过几个设备。
traceroute
会首先发送 TTL=1 的 UDP 数据包,第一个设备将 TTL-1=0,就不再继续转发数据包,而是会返回一个 ICMP
的超时报文,报文中标示数据超时并附带当前 ip、名称信息。这样就得到了第一个设备的信息,traceroute
收到返回值后,继续发送 TTL=2 的数据包,直到尝试上限或者到达目的。
每个 TTL 默认会测试三次。
traceroute 协议
traceroute
默认为 UDP 协议数据包,但 UDP 由于只发送,无需连接,没有任何状态约束它,比较方便攻击者伪造源 IP、伪造目的端口发送任意长度的 UDP 包,长度自定义。所以一般会被大多数网站采用白名单的方式进行过滤。
除 UDP 以外,还可以使用 ICMP、TCP 协议进行测试。
traceroute 返回 ICMP 超时报文问题
拿到 TTL 的网关,并不是每个都会如实返回 ICMP 超时报文,这需要路由器设置。出于安全考虑,大多数防火墙以及开启了防火墙可能并不会返回对应 ICMP 超时报文。所以 traceroute
并不会因为某一次的超时报文缺失就停止发送请求,还会继续追踪到目标服务器的地址,一直到达到追踪上限,或者到目标服务器为止。
traceroute 参数
部分参数带有 <>
表示需要提供参数,下列表格列举了部分重要的参数,其余可以使用 man traceroute
进行查看:
man traceroute
参数 | 释义 |
---|---|
-d | debug 设置socket层级的日志为debug。 |
-f <n> | first_ttl 设置第一个检测数据包的存活数值TTL的大小。默认为1,代表第一次TTL的数值。 |
-m <n> | max_ttl 设置检测数据包的最大存活数值TTL的大小。默认为30,代表最多可以将TTL从最小测试到30。 |
-g\ <ip> | gateway 设置来源路由网关,最多可设置8个。 |
-I <name> | 指定使用哪个网络设备进行传输,如 eth0。 |
-I | 使用ICMP协议进行传输,如果不指定为UDP。 |
-T | 使用TCP协议进行传输,如果不指定为UDP。 |
-w <n> | waittime 设置等待远端主机回复报文的时间。默认为5,代表等待5秒 |
-p <port> | port 设置UDP传输协议的通信端口。 |
-r | 忽略普通的RoutingTable,直接将数据包送到远端主机上。 |
-s <ip> | 设置本地主机送出数据包的IP地址。 |
-t <n> | 设置检测数据包的TOS数值。 |
-v | 详细显示指令的执行过程。 |
-n | 直接使用IP地址而非主机名称作为返回。 |
-x | 开启或关闭数据包的正确性检验。 |
-F | 设置勿离断位。 |
举例
使用 eth0 网卡、ICMP 协议测试发送到网址 www.huangyichun.com
之间的路由:
traceroute -I www.huangyichun.com -i eth0 -n
可以看到,优先解析了对应网址的 ip 地址,DNS 解析可以跳转在这里:
Linux DNS 解析与配置
获得 ip 地址后,就开始进行 TTL 包的发送。前 5 个都返回了 ICMP 超时报文,6/7/11/12/13 都没有能返回,也就是我们之前说的可能由于对应配置或者防火墙关系。总共进行了 15 次,就到达我们的目标服务器,停止了整个程序。
如果切换为其他协议如 UDP:
traceroute www.huangyichun.com -i eth0
可以看到就算 30 跳用完,也未能到达我们的目标服务器,而且从第二跳开始就有不同的分叉路,不同的协议会有不同的结果。(也有可能中间被防火墙阻止了 ICMP 回传)