Vejamos o que acontece, não é?
8.8.8.8 é um bom exemplo, porque pelo menos da minha localização, posso acessá-lo com traceroute
e ping
.
Primeiro vamos tentar ping 8.8.8.8
ver o que acontece:
$ 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
Portanto, ping
envia uma solicitação de eco do ICMP e espera uma resposta de eco do ICMP.
Agora 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
Portanto traceroute
, pelo menos a implementação que instalei, não envia ICMP. Em vez disso, ele envia pacotes UDP.
O que não é visível nesta trace (apesar de que seria, se eu dei tcpdump
um -v
para aumentar a verbosidade) é que as primeiras sondas têm um TTL de 1, e em seguida, ele incrementa o TTL para sondas posteriores. Isso faz com que os roteadores entre mim e 8.8.8.8 respondam com um erro excedido de ICMP ttl, que é como o traceroute descobre os roteadores entre aqui e ali.
Eventualmente, o ttl é longo o suficiente para chegar até 8.8.8.8 e 8.8.8.8 responde com um erro inacessível da porta ICMP, porque não possui processo de escuta na porta UDP 44838. É assim que o traceroute sabe que chegou ao destino final .
Se algo entre aqui e ali estiver bloqueando todo o ICMP, nem o ping nem o traceroute funcionarão.
Mas geralmente não é o caso de todo o ICMP estar bloqueado, embora também não seja raro. Bloquear todo o ICMP é problemático: por exemplo, ele interrompe a descoberta da MTU do caminho , que depende de um erro necessário à fragmentação do ICMP. Os pacotes ICMP têm um tipo e um código, e os operadores de rede responsáveis apenas bloquearão seletivamente alguns tipos ou códigos, aqueles que apresentam potencial para abuso ou revelam informações específicas.
Por exemplo, alguns hosts não respondem a uma solicitação de eco do ICMP e, portanto, o ping não funciona. A idéia é que, ao não responder aos pings, é mais difícil para um invasor descobrir quais hosts existem na rede. Na prática, isso é questionável, pois existem outras maneiras de investigar um host. Por exemplo, pode-se enviar um TCP SYN para a porta 80 para encontrar servidores da web.
Muitos hosts também não enviam um erro inacessível da porta ICMP quando obtêm um datagrama UDP ou um TCP SYN em uma porta na qual eles não têm processo de escuta, e isso interrompe o traceroute. Novamente, a idéia é tornar mais difícil para um invasor mapear a rede, mas, novamente, isso é apenas uma pequena frustração para um invasor.
Como o traceroute é um programa e não um protocolo específico, ele tem outras maneiras de investigar. Todos eles contam com o incremento do TTL para descobrir os roteadores, mas podem ser enviados diferentes tipos de análises que podem ter mais ou menos chance de obter uma resposta do ponto de extremidade. Por exemplo, minhas man tcpdump
listas incluem uma -I
opção para usar as sondas de eco ICMP, da mesma forma que o ping. Ele também deve -T
usar testes TCP SYN em vez de UDP. Se você sabe que um host responderá ping
, -I
faz muito sentido. Se você sabe que o host está escutando uma porta TCP específica, -T
faz sentido, talvez em conjunto com a -p
opção de selecionar a porta.
Infelizmente, essas opções podem exigir recursos raiz ou especiais, portanto, o UDP faz um padrão justo. De fato, uma ferramenta semelhante,, tracepath
tem isso a dizer em sua página de manual:
DESCRIÇÃO
Ele rastreia o caminho até o destino, descobrindo o MTU ao longo desse caminho. Ele usa a porta UDP ou alguma porta aleatória. É semelhante ao traceroute, apenas não requer privilégios de superusuário e não possui opções sofisticadas.