linux route输出分析,Traceroute原理分析[通俗易懂]

linux route输出分析,Traceroute原理分析[通俗易懂]traceroute,现代Linux系统上的tracepath,还有Windows系统上的tracert,均是用于同一目的的网络调试工具。它们用于显示数据包在IP网络中经过的路由器的IP地址。原理这些程序是利用IP数据包的存活时间(TTL)值来实现其功能的。当一台计算机发送IP数据包时,会为数据包设置存活时间(TTL)值。每当数据包经过一个路由器,其存活时间值就会减1。当存活时间减到…

大家好,又见面了,我是你们的朋友全栈君。

traceroute,现代 Linux 系统上的 tracepath,还有Windows 系统上的 tracert,均是用于同一目的的网络调试工具。它们用于显示数据包在IP网络中经过的路由器的IP地址。

原理

这些程序是利用IP数据包的存活时间(TTL)值来实现其功能的。当一台计算机发送IP数据包时,会为数据包设置存活时间(TTL)值。每当数据包经过一个路由器,其存活时间值就会减 1。当存活时间减到 0 时,路由器将不再转发数据包,而是发送一个 ICMP TTL 数据包给最初发出数据包的计算机。

Traceroute 程序首先向目标主机发出 TTL 为 1 的数据包,发送数据包的计算机与目标主机之间的路径中的第一个路由器,在转发数据包时将数据包的 TTL 减 1,它发现 TTL 被减为了 0,于是向最初发出数据包的计算机发送一个 ICMP TTL 数据包,Traceroute 程序以此获得了与目标主机之间的路径上的第一个路由器的IP地址。后面 traceroute 程序依次向目标主机发送 TTL 为 2、3、4 . . . 的数据包,逐个探测出来与目标主机之间的路径上每一个路由器的 IP 地址。

实现

默认条件下,traceroute 首先发出 TTL = 1 的UDP 数据包,第一个路由器将 TTL 减 1 得 0 后就不再继续转发此数据包,而是返回一个 ICMP 超时报文,traceroute 从超时报文中即可提取出数据包所经过的第一个网关的 IP 地址。然后又发送了一个 TTL = 2 的 UDP 数据包,由此可获得第二个网关的 IP 地址。依次递增 TTL 便获得了沿途所有网关的 IP 地址。

需要注意的是,并不是所有网关都会如实返回 ICMP 超时报文。处于安全性考虑,大多数防火墙以及启用了防火墙功能的路由器缺省配置为不返回各种 ICMP 报文,其余路由器或交换机也可能被管理员主动修改配置变为不返回 ICMP 报文。因此 Traceroute 程序不一定能拿到所有的沿途网关地址。所以,当某个 TTL 值的数据包得不到响应时,并不能停止这一追踪过程,程序仍然会把 TTL 递增而发出下一个数据包。这个过程将一直持续到数据包发送到目标主机,或者达到默认或用参数指定的追踪限制(maximum_hops)才结束追踪。

依据上述原理,利用了 UDP 数据包的 Traceroute 程序在数据包到达真正的目的主机时,就可能因为该主机没有提供 UDP 服务而简单将数据包抛弃,并不返回任何信息。为了解决这个问题,Traceroute 故意使用了一个大于 30000 的端口号,因 UDP 协议规定端口号必须小于 30000 ,所以目标主机收到数据包后唯一能做的事就是返回一个 “端口不可达” 的 ICMP 报文,于是主叫方就将端口不可达报文当作跟踪结束的标志。

Wireshark 抓包分析

我们通过 Wireshark 抓包来看一下这个过程。我们追踪从我们的 PC 机到 www.163.com 之间的网络路径。打开 Wireshark,以如图所示的选项开始抓包:

65495dcefa56a3973800922fdd0ec305.png

然后我们在命令行执行 traceroute 程序:

$ traceroute www.163.com

traceroute to www.163.com (183.131.124.101), 30 hops max, 60 byte packets

1 10.240.252.1 (10.240.252.1) 0.441 ms 0.530 ms 0.712 ms

2 10.247.0.1 (10.247.0.1) 0.459 ms 0.549 ms 0.739 ms

3 10.0.10.15 (10.0.10.15) 0.479 ms 0.481 ms 0.471 ms

4 * * *

5 10.163.4.53 (10.163.4.53) 1.092 ms 10.163.4.57 (10.163.4.57) 1.008 ms 10.163.4.53 (10.163.4.53) 1.005 ms

6 115.238.118.185 (115.238.118.185) 1.006 ms 115.238.118.177 (115.238.118.177) 1.112 ms 1.502 ms

7 115.238.120.85 (115.238.120.85) 1.769 ms 115.238.120.89 (115.238.120.89) 1.480 ms 115.238.120.85 (115.238.120.85) 1.918 ms

8 220.191.200.145 (220.191.200.145) 9.229 ms 220.191.200.101 (220.191.200.101) 9.074 ms 220.191.200.93 (220.191.200.93) 1.563 ms

9 61.175.73.130 (61.175.73.130) 7.294 ms * 61.175.73.146 (61.175.73.146) 7.810 ms

10 60.191.177.122 (60.191.177.122) 26.955 ms 115.231.144.94 (115.231.144.94) 25.918 ms 26.634 ms

11 * * *

12 183.131.124.101 (183.131.124.101) 8.381 ms 7.120 ms 8.036 ms

这个过程中我们总共抓到了 67 个数据包。

b3fd60f7bbf01179774e08380bff8cfe.png

我们选中第 1 号包,也就是用于探测路径中第一个网关的 UDP 包,在下方的数据包详情中,可以看到 Time to live 值为 1。我们再选中用于探测路径中第二个网关的 UDP 包,即第 5 号包,可以看到 Time to live 值为 2:

263f982cf59fc091eebba2bdf31a6586.png

同时还能看到数据包发送的源端口为 UDP 34341,目的端口为 33438。

第 17 ~ 29 号包为中间路由节点发送回来的 TTL 超时 ICMP包。数据包被发送到目标主机时,目标主机将发回目标不可达的 ICMP 包,如下图:

33e0a06903400ead6a7da94375eaaa77.png

第 62 ~ 64 号包即为目标主机发回的数据包。

UDP 之外的选择

使用 UDP 的 traceroute,失败还是比较常见的。这常常是由于,在运营商的路由器上,UDP 与 ICMP 的待遇大不相同。为了利于 troubleshooting,ICMP ECHO Request/Reply 是不会封的,而 UDP 则不同。UDP 常被用来做网络攻击,因为 UDP 无需连接,因而没有任何状态约束它,比较方便攻击者伪造源 IP、伪造目的端口发送任意多的 UDP 包,长度自定义。所以运营商为安全考虑,对于 UDP 端口常常采用白名单 ACL,就是只有 ACL 允许的端口才可以通过,没有明确允许的则统统丢弃。比如允许 DNS/DHCP/SNMP 等。

UNIX/Linux 下的 traceroute 还提供了如下的选项:

$ traceroute –help

Usage:

traceroute [ -46dFITnreAUDV ] [ -f first_ttl ] [ -g gate,… ] [ -i device ] [ -m max_ttl ] [ -N squeries ] [ -p port ] [ -t tos ] [ -l flow_label ] [ -w waittime ] [ -q nqueries ] [ -s src_addr ] [ -z sendwait ] [ –fwmark=num ] host [ packetlen ]

Options:

-4 Use IPv4

-6 Use IPv6

-d –debug Enable socket level debugging

-F –dont-fragment Do not fragment packets

-f first_ttl –first=first_ttl

Start from the first_ttl hop (instead from 1)

-g gate,… –gateway=gate,…

Route packets through the specified gateway

(maximum 8 for IPv4 and 127 for IPv6)

-I –icmp Use ICMP ECHO for tracerouting

-T –tcp Use TCP SYN for tracerouting (default port is 80)

-i device –interface=device

Specify a network interface to operate with

-m max_ttl –max-hops=max_ttl

Set the max number of hops (max TTL to be

reached). Default is 30

-N squeries –sim-queries=squeries

Set the number of probes to be tried

simultaneously (default is 16)

-n Do not resolve IP addresses to their domain names

-p port –port=port Set the destination port to use. It is either

initial udp port value for “default” method

(incremented by each probe, default is 33434), or

initial seq for “icmp” (incremented as well,

default from 1), or some constant destination

port for other methods (with default of 80 for

“tcp”, 53 for “udp”, etc.)

. . . . . .

-U –udp Use UDP to particular port for tracerouting

(instead of increasing the port per each probe),

default port is 53

-UL Use UDPLITE for tracerouting (default dest port

is 53)

-D –dccp Use DCCP Request for tracerouting (default port

is 33434)

-P prot –protocol=prot Use raw packet of protocol prot for tracerouting

–mtu Discover MTU along the path being traced. Implies

`-F -N 1′

–help Read this help and exit

Arguments:

+ host The host to traceroute to

packetlen The full packet length (default is the length of an IP

header plus 40). Can be ignored or increased to a minimal

allowed value

除了 UDP 之外,我们还可以用 TCP 或 ICMP 来探测网络路径。

Traceroute 使用 TCP 探测网络路径的原理是,不断发出 TTL 逐渐增大的 TCP [SYN] 包,在收到目标主机发回的 TCP [SYN ACK] 或达到默认或设置的追踪限制(maximum_hops)时结束追踪。我们用这种方法来探测到 www.qq.com 的网络路径。适当修改 Wireshark 的抓包选项,并在命令行中执行:

$ sudo traceroute -T www.qq.com

[sudo] hanpfei0306 的密码:

traceroute to www.qq.com (182.254.34.74), 30 hops max, 60 byte packets

1 10.240.252.1 (10.240.252.1) 0.364 ms 0.486 ms 0.655 ms

2 10.247.0.1 (10.247.0.1) 0.340 ms 0.430 ms 0.511 ms

3 10.0.10.15 (10.0.10.15) 0.899 ms 0.888 ms 0.884 ms

4 * * *

5 10.163.4.53 (10.163.4.53) 1.629 ms 10.163.4.57 (10.163.4.57) 1.431 ms 10.163.4.53 (10.163.4.53) 1.434 ms

6 115.238.118.189 (115.238.118.189) 1.604 ms 0.988 ms 115.238.118.181 (115.238.118.181) 1.166 ms

7 124.160.191.101 (124.160.191.101) 6.100 ms 124.160.191.113 (124.160.191.113) 29.627 ms 29.747 ms

8 * 124.160.83.97 (124.160.83.97) 4.565 ms *

9 * * 219.158.21.17 (219.158.21.17) 27.960 ms

10 221.4.0.114 (221.4.0.114) 37.392 ms 37.567 ms 221.4.0.90 (221.4.0.90) 32.138 ms

11 * * *

12 * * *

13 * * *

14 * * *

15 * * *

16 * * *

17 * * *

18 182.254.34.74 (182.254.34.74) 31.083 ms 33.926 ms *

我们将抓到如下的网络数据包:

ac24b3a73bc4d1b8733195299cf0cb93.png

首先是一堆的 TCP [SYN] 包,然后是中间网关返回的 ICMP TTL 超时。最后收到目标主机发回的 TCP [SYN ACK] 结束整个探测过程:

cd68156bf73709bc701fa2b749ca44db.png

如图中的第 82 和 第 84 号 TCP [SYN ACK] 包。从第 71 号包,可以看到,数据包都被发向了目标主机的 80 端口。

如果我们以 -I 参数启动 traceroute,用 ICMP 来探测网络路径的话,抓到的包将如下面这样:

0d201bd60f969050f1cb33e57efb4eed.png

这个过程将不断发送 TTL 递增的 ICMP ECHO Request (Ping) 的包,中间网关在发现数据包的 TTL 减到 0 时,向源主机发回 ICMP TTL 超时。

整个过程以收到 ICMP Echo reply结束:

45d45f434ef37025eb6b327544e0a822.png

如图中的第 87 ~ 93 号包。

总结一下,traceroute 主要利用 IP 数据包的 TTL 字段值 + ICMP 来实现,它发送的用于探测网络路径的数据包的 IP 之上的协议可以是 UDP、TCP或ICMP。不同模式下,探测过程中设计的数据包如下:

UDP 模式 UDP 探测数据包(目标端口大于 30000) + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 ICMP Destination Unreachable 数据包

TCP 模式 TCP [SYN] 探测数据包(目标端口为 Web 服务的 80) + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 TCP [SYN ACK] 数据包

ICMP 模式 ICMP Echo (ping) Request 探测数据包 + 中间网关发回 ICMP TTL 超时数据包 + 目标主机发回 ICMP Echo (ping) reply 数据包

参考文档

本文来自网易实践者社区,经作者韩鹏飞授权发布。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162533.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • hibernate 自动更新_百度手机快照更新

    hibernate 自动更新_百度手机快照更新对于hibernate的快照更新的理解: 在获得持久化对象时,会在一级缓存和

  • JDK安装与环境变量配置「建议收藏」

    JDK安装与环境变量配置「建议收藏」下载JDK到Oracle官网下载JDK安装JDK安装JDK时,除了修改安装目录,其他的一路【下一步】,傻瓜式安装。注:当提示安装JRE时,可以选择不要安装。因为JDK已经自带了JRE。安装JDK测试JDK是否安装成功在配置好环境变量后,可以进入cmd中检查Java是否安装正确,检查的命令为java-versionJDK安装成功环境变量详解JAVA_HOME…

  • java获取当前日期date类型_uuid一般是多少位的啊

    java获取当前日期date类型_uuid一般是多少位的啊java中获取当前年月日使用Calendar类//获取Calendar类Calendarcalendar=Calendar.getInstance();//获取年calendar.get(Calendar.YEAR);//获取月注:获取的月比真实月少1calendar.get(Calendar.MONTH)+1;获取UUID字符串方法:uui

  • i686和x86_64的区别

    i686和x86_64的区别i686的解释:i代表intel系列的cpu。386几乎适用于所有的x86平台,不论是旧的pentum或者是新的pentum-IV与K7系列的CPU等等,都可以正常的工作!那个i指的是Intel兼容的CPU的意思,至于386不用说,就是CPU的等级啦!i586就是586等级的计算机,那是哪些呢?包括pentum第一代MMXC…

  • FPN详解

    FPN详解论文题目:FeaturePyramidNetworksforObjectDetection论文链接:论文链接论文代码:Caffe版本代码链接一、FPN初探1.图像金字塔图1图像金字塔图2高斯金字塔效果如上图所示,这是一个图像金字塔,做CV的你肯定很熟悉,因为在很多的经典算法里面都有它的身影,比如SIFT、HOG等算法。我们常用的是高斯金字塔…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号