让我们看看会发生什么,对吧?
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
一个-v
增加冗长)是第一探头具有1的TTL,然后它增加了以后探针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是有问题的:例如,它中断了路径MTU发现,这依赖于ICMP分段所需的错误。ICMP数据包具有类型和代码,负责任的网络运营商将仅选择性地阻止某些类型或代码,这些类型或代码可能会造成滥用或泄露特定信息。
例如,某些主机根本不会响应ICMP回显请求,因此ping不起作用。这个想法是,通过不响应ping,攻击者很难发现网络上存在哪些主机。在实践中,这是有问题的,因为还有其他探测主机的方法。例如,可以将TCP SYN发送到端口80以查找Web服务器。
当许多主机将UDP数据报或TCP SYN传送到没有进程监听的端口时,它们也不会发送ICMP端口不可达错误,这会中断traceroute。再次的想法是使攻击者更难以映射网络,但这对攻击者而言只是一个小小的挫败。
因为traceroute是一个程序,而不是任何特定协议,所以它具有其他探测方式。它们全都依靠增加TTL来发现路由器,但是可以发送不同种类的探测,这些探测或多或少有机会引起端点的响应。例如,我man tcpdump
列出了-I
使用ICMP回声探针的选项,与ping相同。它还必须-T
使用TCP SYN探针而不是UDP。如果您知道主机将做出响应,ping
那么-I
很有道理。如果您知道主机正在侦听特定的TCP端口,则-T
可以将其-p
与选择端口的选项结合使用。
不幸的是,这些选项可能需要root或特殊功能,因此UDP做出了合理的默认设置。实际上,类似的工具tracepath
在其手册页中有这样的说法:
描述
它沿着该路径跟踪发现目标MTU的路径。它使用UDP端口端口或一些随机端口。它类似于traceroute,仅不需要超级用户特权,也没有任何高级选项。