Linux traceroute 原理及使用

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 默认会测试三次。

Linux traceroute 原理及使用_第1张图片


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 first_ttl 设置第一个检测数据包的存活数值TTL的大小。默认为1,代表第一次TTL的数值。
-m max_ttl 设置检测数据包的最大存活数值TTL的大小。默认为30,代表最多可以将TTL从最小测试到30。
-g\ gateway 设置来源路由网关,最多可设置8个。
-I 指定使用哪个网络设备进行传输,如 eth0。
-I 使用ICMP协议进行传输,如果不指定为UDP。
-T 使用TCP协议进行传输,如果不指定为UDP。
-w waittime 设置等待远端主机回复报文的时间。默认为5,代表等待5秒
-p port 设置UDP传输协议的通信端口。
-r 忽略普通的RoutingTable,直接将数据包送到远端主机上。
-s 设置本地主机送出数据包的IP地址。
-t 设置检测数据包的TOS数值。
-v 详细显示指令的执行过程。
-n 直接使用IP地址而非主机名称作为返回。
-x 开启或关闭数据包的正确性检验。
-F 设置勿离断位。

举例

使用 eth0 网卡、ICMP 协议测试发送到网址 www.huangyichun.com 之间的路由:

traceroute -I www.huangyichun.com -i eth0 -n

Linux traceroute 原理及使用_第2张图片

可以看到,优先解析了对应网址的 ip 地址,DNS 解析可以跳转在这里:

Linux DNS 解析与配置

获得 ip 地址后,就开始进行 TTL 包的发送。前 5 个都返回了 ICMP 超时报文,6/7/11/12/13 都没有能返回,也就是我们之前说的可能由于对应配置或者防火墙关系。总共进行了 15 次,就到达我们的目标服务器,停止了整个程序。

如果切换为其他协议如 UDP:

traceroute www.huangyichun.com -i eth0

Linux traceroute 原理及使用_第3张图片

可以看到就算 30 跳用完,也未能到达我们的目标服务器,而且从第二跳开始就有不同的分叉路,不同的协议会有不同的结果。(也有可能中间被防火墙阻止了 ICMP 回传)

你可能感兴趣的:(shell,网络,linux,tcp/ip)