Apresentando: tcptraceroute

O traceroute acho que todo mundo já conhece né? Pra descobrir a roda de um lugar a outra...
Mas acho que uma coisa que pouca gente sabe (inclusive eu só fiquei sabendo ontem...), é que usar ICMP (ping) pra fazer traceroute é só uma possibilidade, e que usar pacotes TCP ou UDP pode ser um meio bem mais eficiente de detectar uma conexão.

A idéia do traceroute é manipular o campo TTL dos pacotes IP para que ele receba uma mensagem "ICMP Time Exceeded" dos roteadores que estiverem entre você o a máquina alvo, e normalmente usa-se (ou eu imaginava que usava-se...) pacotes ICMP ECHO para isso. No entanto MUITOS roteadores/firewalls são configurados para barrar pacotes ping (para se "ocultarem" na rede), e por isso essa sondagem não é muito eficiente.
Veja por exemplo um tracert, feito na minha máquina XP em direção ao site www.itau.com.br:
Tracing route to www.itau.com.br [200.246.143.40]
over a maximum of 15 hops:

1 * * * Request timed out.
2 755 ms 204 ms 22 ms 200.217.72.224
3 752 ms 303 ms 619 ms 200.164.178.161
4 757 ms 342 ms 1051 ms 200.223.127.229
5 118 ms 23 ms * 200.223.131.81
6 979 ms * 213 ms 200.223.131.94
7 752 ms 423 ms 968 ms 200.216.4.89
8 172 ms 246 ms 196 ms 200.223.254.117
9 429 ms 173 ms 242 ms 200.211.219.145
10 360 ms 151 ms 189 ms 200.244.163.11
11 615 ms 224 ms 492 ms 200.230.0.114
12 455 ms 134 ms 475 ms 200.230.243.32
13 * * * Request timed out.
14 * * * Request timed out.
15 * * * Request timed out.

Trace complete.
Note que a máquina alvo não respondeu a minha consulta. Provavelmente por que ela (ou o roteador/firewall) antes dela, barra pacotes ICMP ECHO.
Aí é que entra o tcptraceroute (http://michael.toren.net/code/tcptraceroute/). Ele permite que você use pacotes TCP, com o campo TTL manipulado, para fazer esse trace, podendo inclusive escolher para qual porta você quer mandar o pacote. Vejam o resultado do tcptraceroute rodando na minha máquina linux, e tentando se conectar ao www.itau.com.br:80
Selected device eth0, address 192.168.1.14, port 1447 for outgoing packets
Tracing the path to www.itau.com.br (200.246.143.40) on TCP port 80 (www), 30 hops max
1 * * *
2 200.217.72.224 52.385 ms 53.778 ms 217.908 ms
3 200.164.178.161 448.959 ms 951.025 ms 225.461 ms
4 200.223.127.229 114.464 ms 467.334 ms 1092.071 ms
5 200.223.131.81 477.904 ms 86.221 ms 17.921 ms
6 200.223.131.94 123.253 ms 446.530 ms 771.054 ms
7 200.216.4.89 308.760 ms 280.420 ms 654.370 ms
8 200.223.254.117 905.862 ms 438.826 ms 635.176 ms
9 200.211.219.145 738.222 ms 160.895 ms 126.095 ms
10 200.244.163.11 299.300 ms 456.284 ms 543.155 ms
11 200.230.0.114 464.796 ms 257.757 ms 1116.234 ms
12 200.230.243.32 275.573 ms 160.785 ms 261.812 ms
13 201.90.84.242 788.507 ms 368.006 ms 834.374 ms
14 200.246.143.40 [open] 256.319 ms 2409.728 ms 263.736 ms

BEM mais completo não?! Duas máquinas que não aparaceram no tracert estão aparentes com o tcptraceroute!

Um outro ponto que eu quero trazer a tona é avisar que o traceroute do UNIX (Linux, BSD e variantes), usa, por padrão, pacotes UDP ao invés de ICMP para fazer suas consultas! Normalmente usa-se a porta 33434 para os pacotes, mas essa porta pode ser alterada usando-se a opção "-p". Isso pode ser útil para descobrir o caminho até servidores DNS por exemplo.
Para fazer o traceroute usar pacotes ICMP no Linux você tem de passar o parâmetro "-I" para ele.

Marcadores: ,