traceroute 使用 UDP 或 ICMP 还是两者都使用?

Kri*_*ris 26 networking iptables icmp udp

当我从笔记本电脑对 www.google.com 域进行跟踪时,我使用的是 icmp 还是 udp ?
我以为是 icmp 类型 11,但是在搜索其他内容时,我遇到了使用 icmp 类型 30 的规则,并且看到了使用 udp 的规则。
有人可以向我解释这是如何工作的吗?
我正在为虚拟专用服务器开发防火墙(iptables)。

Lad*_*ada 29

发送的数据包类型因实现而异。默认情况下,Windowstracert使用 ICMP,Mac OS X 和 Linux 都traceroute使用 UDP。我手头没有 BSD 或 Solaris 机器或任何其他操作系统可供检查,但 Mac OS X 版本的手册页提到它的出处是 BSD 4.3。

我的 Mac 和 Linux 版本提供了选择各种不同协议的能力,包括 ICMP、TCP、UDP 和 GRE 数据包。其他协议可以通过它们的名称或编号来指定,但 traceroute 对其他协议的工作方式一无所知。它只是盲目地发送它们。

他们还可以更改有效负载以及源端口和目标端口,以避免防火墙或发现路径上的哪个路由器正在丢弃特定大小的数据包。

traceroute 的所有版本都依赖于沿路由的每一跳的ICMP 类型 11(超时)响应。如果您的防火墙阻止了 ICMP 类型 11 响应,traceroute 将不起作用。这些数据包是入站的,而不是出站的。

ICMP 类型 30专门用于跟踪路由,并被标记为“信息请求”。我一直无法找到实际使用它的任何地方。Mac OS X 和 Linux 版本的手册页说-I将发送ICMP 类型 8(回显请求)。维基百科说 Windowstracert也使用 ICMP 回显请求。ICMP 类型 30 或类型 8 是出站数据包,而不是入站数据包。

当 TTL 恰好等于跳数时,ICMP 类型 0(回声响应)可能会作为最后一个数据包返回。当 Traceroute 收到其中之一时,它会知道它已经完成。这是一个入站数据包。

TCP SYN数据包到达目的地时将导致一个RST数据包或一个SYN ACK数据包响应。如果您收到一个SYN ACK数据包,最好跟进一个RST数据包,以免在服务器上留下半开连接。

如果您发送设置了“请勿分段”标志的大数据包,则有可能获得ICMP 类型 3 代码 4响应而不是 ICMP 类型 11 响应,但这可能只能让您找到具有最小 MTU 的跃点. 您通常只会从沿途的一跳中得到此类响应。不是所有的人。


Dan*_*man 8

传统的跟踪路由在每跳的递增端口上使用 UDP。

您可以使用任何类型的数据包来实现它 - ICMP、TCP SYN 等。它所需要的只是 IP 数据包到期,您就是黄金。

各种实现,如 MacOS,支持多种类型的跟踪路由,以及不增加端口等的模式,以绕过防火墙限制。

  • 类 Unix 实现上的默认 UDP 端口是从 33434 到 33534。ICMP 实现使用“回显请求”(类型 8)。 (7认同)