让我们看看会发生什么,好吗?
8.8.8.8 是一个很好的例子,因为至少从我的位置,我可以使用traceroute
和到达它ping
。
首先让我们试着ping 8.8.8.8
看看会发生什么:
$ tcpdump -n host 8.8.8.8 or icmp
15:36:51.045994 IP 10.4.27.179 > 8.8.8.8: ICMP echo request, id 7215, seq 0, length 64
15:36:51.062458 IP 8.8.8.8 > 10.4.27.179: ICMP echo reply, id 7215, seq 0, length 64
15:36:52.048350 IP 10.4.27.179 > 8.8.8.8: ICMP echo request, id 7215, seq 1, length 64
15:36:52.073657 IP 8.8.8.8 > 10.4.27.179: ICMP echo reply, id 7215, seq 1, length 64
所以ping
发送一个 ICMP 回声请求,并期待一个 ICMP 回声回复。
现在traceroute -n 8.8.8.8
:
15:41:31.803324 IP 10.4.27.179.44838 > 8.8.8.8.33435: UDP, length 24
15:41:31.815184 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.815343 IP 10.4.27.179.44838 > 8.8.8.8.33436: UDP, length 24
15:41:31.819654 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.819791 IP 10.4.27.179.44838 > 8.8.8.8.33437: UDP, length 24
15:41:31.824609 IP 10.250.32.2 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.824754 IP 10.4.27.179.44838 > 8.8.8.8.33438: UDP, length 24
15:41:31.830506 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.830649 IP 10.4.27.179.44838 > 8.8.8.8.33439: UDP, length 24
15:41:31.834469 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.834565 IP 10.4.27.179.44838 > 8.8.8.8.33440: UDP, length 24
15:41:31.840962 IP 64.124.23.161 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.841061 IP 10.4.27.179.44838 > 8.8.8.8.33441: UDP, length 24
15:41:31.847440 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.847634 IP 10.4.27.179.44838 > 8.8.8.8.33442: UDP, length 24
15:41:31.853664 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.853761 IP 10.4.27.179.44838 > 8.8.8.8.33443: UDP, length 24
15:41:31.859221 IP 64.125.26.21 > 10.4.27.179: ICMP time exceeded in-transit, length 148
15:41:31.859269 IP 10.4.27.179.44838 > 8.8.8.8.33444: UDP, length 24
15:41:31.864149 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.864192 IP 10.4.27.179.44838 > 8.8.8.8.33445: UDP, length 24
15:41:31.870843 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.870922 IP 10.4.27.179.44838 > 8.8.8.8.33446: UDP, length 24
15:41:31.876200 IP 64.125.31.15 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.876352 IP 10.4.27.179.44838 > 8.8.8.8.33447: UDP, length 24
15:41:31.882148 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.882249 IP 10.4.27.179.44838 > 8.8.8.8.33448: UDP, length 24
15:41:31.890076 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.890156 IP 10.4.27.179.44838 > 8.8.8.8.33449: UDP, length 24
15:41:31.896100 IP 64.125.13.111 > 10.4.27.179: ICMP time exceeded in-transit, length 36
15:41:31.896163 IP 10.4.27.179.44838 > 8.8.8.8.33450: UDP, length 24
15:41:31.905037 IP 108.170.242.225 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.905235 IP 10.4.27.179.44838 > 8.8.8.8.33451: UDP, length 24
15:41:31.913206 IP 108.170.242.225 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.913283 IP 10.4.27.179.44838 > 8.8.8.8.33452: UDP, length 24
15:41:31.923428 IP 108.170.242.241 > 10.4.27.179: ICMP time exceeded in-transit, length 76
15:41:31.923520 IP 10.4.27.179.44838 > 8.8.8.8.33453: UDP, length 24
15:41:31.932266 IP 108.170.237.9 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.932441 IP 10.4.27.179.44838 > 8.8.8.8.33454: UDP, length 24
15:41:31.939961 IP 209.85.251.9 > 10.4.27.179: ICMP time exceeded in-transit, length 76
15:41:31.940043 IP 10.4.27.179.44838 > 8.8.8.8.33455: UDP, length 24
15:41:31.947460 IP 108.170.237.21 > 10.4.27.179: ICMP time exceeded in-transit, length 60
15:41:31.947508 IP 10.4.27.179.44838 > 8.8.8.8.33456: UDP, length 24
15:41:31.954824 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33456 unreachable, length 36
15:41:31.954888 IP 10.4.27.179.44838 > 8.8.8.8.33457: UDP, length 24
15:41:31.963601 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33457 unreachable, length 36
15:41:31.963671 IP 10.4.27.179.44838 > 8.8.8.8.33458: UDP, length 24
15:41:31.972407 IP 8.8.8.8 > 10.4.27.179: ICMP 8.8.8.8 udp port 33458 unreachable, length 36
因此traceroute
,至少我安装的实现不会发送 ICMP。相反,它发送 UDP 数据包。
在此跟踪中不可见的(尽管如果我给出tcpdump
a-v
以增加详细程度)是第一个探测器的 ttl 为 1,然后它会为以后的探测器增加 ttl。这会导致我和 8.8.8.8 之间的路由器响应 ICMP ttl 超出错误,这就是 traceroute 发现这里和那里之间的路由器的方式。
最终 ttl 足够长以使其一直到达 8.8.8.8,并且 8.8.8.8 以 ICMP 端口不可达错误响应,因为它没有进程侦听 UDP 端口 44838。这就是 traceroute 知道它已到达最终目的地的方式.
如果这里和那里之间的某些东西阻塞了所有ICMP,那么 ping 和 traceroute 都将不起作用。
但通常情况下并非所有ICMP 都被阻止,尽管这种情况并不少见。阻止所有 ICMP 是有问题的:例如,它会破坏依赖于 ICMP 分段所需错误的路径 MTU 发现。ICMP 数据包具有类型和代码,负责任的网络运营商只会选择性地阻止某些类型或代码,这些类型或代码可能会造成滥用或泄露特定信息。
例如,某些主机根本不会响应 ICMP 回显请求,因此 ping 将不起作用。这个想法是,通过不响应 ping,攻击者更难发现网络上存在哪些主机。实际上,这是有问题的,因为还有其他方法可以探测主机。例如,可以向端口 80 发送 TCP SYN 以查找网络服务器。
许多主机在将 UDP 数据报或 TCP SYN 发送到没有进程侦听的端口时也不会发送 ICMP 端口不可达错误,这会破坏跟踪路由。同样的想法是让攻击者更难映射网络,但这对攻击者来说只是一个小小的挫折。
因为 traceroute 是一个程序而不是任何特定的协议,所以它有其他探测方式。它们都依赖于增加 TTL 来发现路由器,但是可以发送不同类型的探测,这些探测可能或多或少有机会从端点引出响应。例如,我man tcpdump
列出了一个-I
使用 ICMP 回声探测的选项,与 ping 相同。它还必须-T
使用 TCP SYN 探测而不是 UDP。如果您知道主持人会做出回应,ping
那就-I
很有意义了。如果您知道主机正在侦听特定的 TCP 端口,那么-T
可能与-p
选择端口的选项结合使用是有道理的。
不幸的是,这些选项可能需要 root 或特殊功能,因此 UDP 是一个公平的默认值。事实上,一个类似的工具 ,tracepath
在其手册页中是这样说的:
描述
它跟踪到目的地的路径,沿着这条路径发现 MTU。它使用UDP端口端口或一些随机端口。它类似于 traceroute,只是不需要超级用户权限,也没有花哨的选项。