Diamo un'occhiata a cosa succede, vero?
8.8.8.8 fa un buon esempio, perché almeno dalla mia posizione, posso raggiungerlo con traceroute
e ping
.
Prima proviamo a ping 8.8.8.8
guardare cosa succede:
$ 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
Quindi ping
invia una richiesta di eco ICMP e si aspetta una risposta di eco ICMP.
Adesso 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
Quindi traceroute
, almeno l'implementazione che ho installato, non invia ICMP. Piuttosto, invia pacchetti UDP.
Ciò che non è visibile in questa traccia (anche se sarebbe, se avessi dato tcpdump
un -v
per aumentare la verbosità) è che le prime sonde hanno un ttl di 1, e quindi incrementa il ttl per le sonde successive. Questo fa sì che i router tra me e 8.8.8.8 rispondano con un errore ICMP ttl superato, che è il modo in cui traceroute scopre i router tra qui e lì.
Alla fine il ttl è abbastanza lungo da arrivare fino a 8.8.8.8 e 8.8.8.8 risponde con un errore irraggiungibile della porta ICMP, perché non ha alcun processo di ascolto sulla porta UDP 44838. Ecco come traceroute sa che è arrivata alla destinazione finale .
Se qualcosa tra qui e là sta bloccando tutto l' ICMP, allora né il ping né il traceroute funzioneranno.
Ma di solito non è bloccato tutto l' ICMP, anche se non è raro. Il blocco di tutti gli ICMP è problematico: ad esempio interrompe il rilevamento MTU del percorso , che si basa su un errore di frammentazione ICMP richiesto. I pacchetti ICMP hanno un tipo e un codice, e gli operatori di rete responsabili bloccheranno solo selettivamente alcuni tipi o codici, quelli che comportano potenziali abusi o divulgano particolari informazioni.
Ad esempio, alcuni host non risponderanno affatto a una richiesta di eco ICMP e quindi il ping non funzionerà. L'idea è che non rispondendo ai ping, è più difficile per un utente malintenzionato scoprire quali host esistono sulla rete. In pratica, ciò è discutibile, poiché esistono altri modi per sondare un host. Ad esempio, è possibile inviare un SYN TCP alla porta 80 per trovare i server web.
Molti host inoltre non invieranno un errore irraggiungibile della porta ICMP quando ottengono un datagramma UDP o un SYN TCP a una porta su cui non hanno alcun processo in ascolto e questo interrompe il traceroute. Ancora una volta l'idea è di rendere più difficile per un utente malintenzionato mappare la rete, ma di nuovo questa è solo una piccola frustrazione per un utente malintenzionato.
Poiché traceroute è un programma e non un protocollo particolare, ha altri modi di sondare. Si basano tutti sull'incremento del TTL per scoprire i router, ma possono essere inviati diversi tipi di sonde che possono avere più o meno la possibilità di ottenere una risposta dall'endpoint. Ad esempio, i miei man tcpdump
elenchi -I
un'opzione per utilizzare le sonde echo ICMP, lo stesso del ping. Deve inoltre -T
utilizzare le sonde TCP SYN anziché UDP. Se sai che un host risponderà, ping
allora -I
ha molto senso. Se sai che l'host è in ascolto su una determinata porta TCP, allora -T
ha senso, forse in combinazione con l' -p
opzione per selezionare la porta.
Sfortunatamente queste opzioni potrebbero richiedere funzionalità di root o speciali, quindi UDP rende un default predefinito. In effetti uno strumento simile tracepath
, ha questo da dire nella sua pagina man:
DESCRIZIONE
Traccia il percorso verso la destinazione scoprendo MTU lungo questo percorso. Utilizza la porta UDP o una porta casuale. È simile al traceroute, solo non richiede i privilegi di superutente e non ha opzioni fantasiose.