当我从笔记本电脑跟踪 www.google.com 域时,我使用的是 icmp 还是 udp?
我以为是 icmp 类型 11,但在搜索其他内容时,我遇到了使用 icmp 类型 30 的规则,并且看到了使用 udp 的规则。
有人可以向我解释一下它的工作原理吗?
我正在为虚拟专用服务器开发防火墙(iptables)。
答案1
发送的数据包类型因实现方式而异。默认情况下,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 响应,则跟踪路由将不起作用。这些数据包是入站的,而不是出站的。
ICMP 类型 30是专门为 traceroute 指定的,并被标记为“信息请求”。我找不到实际使用它的地方。Mac OS X 和 Linux 版本的手册页说,-I
将发送ICMP 类型 8(回显请求)。维基百科说 Windowstracert
也使用 ICMP 回显请求。ICMP 类型 30 或类型 8 是出站数据包,而不是入站数据包。
ICMP 类型 0(回显响应)可能会在 TTL 恰好等于跳数时作为最后一个数据包返回。Traceroute 收到其中一个数据包时就会知道它已完成。这是一个入站数据包。
TCP 同步数据包到达目的地后,将导致发送RST
数据包或响应数据包。如果您收到一个数据包,最好跟进一个数据包,以免在服务器上留下半开连接。SYN ACK
SYN ACK
RST
有可能得到ICMP 类型 3 代码 4如果您发送一个设置了“不分段”标志的大数据包,则将返回 ICMP 类型 11 响应,但这可能仅允许您找到具有最小 MTU 的跃点。您通常只会从路由上的一个跃点获得此类响应。并非所有跃点。
答案2
传统的跟踪路由在每一跳上都使用增加端口的 UDP。
您可以使用任何类型的数据包来实现它 - ICMP,TCP SYN等。所需要的只是 IP 数据包过期,然后您就成功了。
各种实现,例如 MacOS,提供对多种类型的跟踪路由的支持,以及不增加端口的模式等,以绕过防火墙限制。