Passa al contenuto principale
Traceroute può essere uno strumento prezioso quando si cerca di diagnosticare problemi di connessione con host su altre reti. Tuttavia, per utilizzarlo in modo efficace è necessario comprenderne il funzionamento e il significato dei risultati.

 

Traceroute funziona modificando il valore Time-To-Live (TTL) nell'intestazione IP (figura 1). Dato che ho dovuto realizzare i miei esempi utilizzando la rete Stratus , ho oscurato la rappresentazione esadecimale dell'indirizzo IP nelle tracce dei pacchetti e ho tradotto tutti gli ottetti in notazione decimale con punti in un codice alfabetico univoco da A a W. Il numero di lettere rappresenta il numero di cifre nell'ottetto. Cioè AAA rappresenta un numero di 3 cifre mentre J rappresenta un numero di 1 cifra.

 

Xmit IP Ver/HL 45, ToS 0, Len 5c, ID 5447, Flg/Frg 0, TTL 3c, Prtl 1
Cksum e90c, Src XXXXXXXX, Dst XXXXXXXX
ICMP from AAA.BBB.CC.DDD to EEE.FFF.GGG.HHH echo
Figura 1 – Frame di packet_monitor con il TTL evidenziato
Ogni router che elabora il pacchetto decrementa il valore TTL di 1 e, se il valore TTL è maggiore di 0, inoltra il pacchetto al router successivo o alla destinazione finale. Se il valore TTL è 0, il router scarta il pacchetto e *potrebbe* inviare un messaggio ICMP di tempo scaduto al mittente. La parola chiave è *potrebbe*: alcuni router non inviano un messaggio di tempo scaduto o lo fanno solo se non sono occupati. Inoltre, alcuni firewall bloccheranno il messaggio ICMP, quindi anche se il router invia il messaggio di tempo scaduto, l'host che esegue traceroute potrebbe non vederlo mai.
Traceroute inizia inviando un messaggio alla destinazione finale con un valore TTL pari a 1. Misura il tempo che intercorre tra l'invio del messaggio e la ricezione della risposta.

 

17:07:07.797 Xmit IP Ver/HL 45, ToS 0, Len 28, ID 1, Flg/Frg 0, TTL 1, Prtl 11
Cksum 78CC, Src XXXXXXXX, Dst XXXXXXXX
UDP from AAA.BBB.CC.DDD.34611 to EEE.FFF.GGG.HHH.33435 Cksum 0000, 20 data bytes.
17:07:07.799 Rcvd IP Ver/HL 45, ToS c0, Len 38, ID 4a39, Flg/Frg 0, TTL 80, Prtl 1
Cksum 0d1a, Src aXXXXXXXX, Dst XXXXXXXX
ICMP from AAA.BBB.II.J to AAA.BBB.CC.DDD time excdd

 

Figura 2 – Frame e risposta di traceroute in packet_monitor
Per impostazione predefinita, il comando traceroute invia tre pacchetti con un TTL pari a 1 e riporta tutte e tre le volte il nome e/o l'indirizzo IP del router che ha inviato la risposta. Io utilizzo sempre l'opzione -numeric in modo da non dover attendere la risoluzione del nome (figura 3). Traceroute incrementa quindi il TTL di 1 e ripete l'operazione. Continuerà ad incrementare il TTL fino a quando non riceve una risposta dalla destinazione finale o fino al raggiungimento di un limite, 30 (per impostazione predefinita). È possibile trovare la documentazione su tutti gli argomenti di traceroute nel manuale OpenVOS STREAMS TCP/IP Administrator’s Guide (R419).

 

traceroute -numeric EEE.FFF.GGG.HHH
traceroute to EEE.FFF.GGG.HHH (EEE.FFF.GGG.HHH), 30 hops max, 40 byte packets
1 AAA.BBB.II.LLL 2 ms 1 ms 1 ms
2 AAA.BBB.II.J 1 ms 1 ms 1 ms
3 AAA.BBB.MM.NN 12 ms 5 ms 6 ms
4 BBB.OOO.PPP.QQQ 76 ms 76 ms 76 ms
5 BBB.RRR.SSS.TTT 80 ms 80 ms 80 ms
6 BBB.RRR.SSS.UUU 87 ms 82 ms 79 ms
7 EEE.FFF.V.J 89 ms 89 ms 86 ms
8 EEE.FFF.GGG.HHH 82 ms 87 ms 80 ms
ready 15:19:12

 

Figura 3 – Risultato del comando traceroute
Ci si aspetterebbe che, all'aumentare del TTL, aumentassero anche i tempi di risposta, e in genere è così, ma non sempre: si confrontino i tempi riportati per il terzo hop 6 (79 ms) e il quinto hop 5 (80 ms) nella figura 3. Ci sono diverse ragioni per questo. Innanzitutto, la rete non è deterministica: a volte ci vuole semplicemente più tempo. In secondo luogo, il router all'hop N-1 potrebbe essere più occupato rispetto a quello all'hop N e impiegare più tempo per inviare il messaggio ICMP. Infine, il percorso di ritorno dal router N potrebbe essere più veloce rispetto a quello dal router N-1. Ad esempio, non è obbligatorio che il quarto router invii la sua risposta alla sorgente passando per i router 3, 2 e 1. Potrebbe inviare la risposta direttamente al router 1, il che potrebbe essere significativamente più veloce. Ciò significa che, sebbene traceroute sia molto efficace nel riportare il percorso che un pacchetto compie dall'host mittente all'host di destinazione, non è possibile fare affidamento sul fatto che un pacchetto inviato dall'host di destinazione all'host mittente segua lo stesso percorso, solo in senso inverso. Questo fenomeno è noto come routing asimmetrico.

 

Traceroute può aggiungere un indicatore a un tempo che segnala la ricezione di un messaggio diverso da quello previsto relativo al superamento del tempo massimo. Gli indicatori sono:
!H – host non raggiungibile
!N – rete non raggiungibile
!P – protocollo non raggiungibile
Ad esempio, la figura 4 mostra che il primo router non sa come raggiungere la rete di destinazione e quindi restituisce un messaggio di rete irraggiungibile; a quel punto, il traceroute si interrompe.

 

traceroute EEE.FFF.GGG.HHH -numeric
traceroute to EEE.FFF.GGG.HHH (EEE.FFF.GGG.HHH), 30 hops max, 40 byte packets
1 AAA.BBB.CC.KKK 2 ms !N 0 ms !N 1 ms !N
ready 15:40:03

 

Figura 4: messaggi di rete irraggiungibile
Un asterisco (*) al posto di un tempo indica che traceroute non ha ricevuto risposta. Come ho detto prima, potrebbe essere che il router non invii un messaggio ICMP di tempo scaduto, oppure che un firewall abbia bloccato il messaggio di tempo scaduto durante il percorso di ritorno o che abbia bloccato il messaggio in uscita. Potrebbe anche essere che la rete abbia semplicemente scartato il messaggio in uscita o quello di ritorno.

 

Un timeout, o anche due, su un hop (figura 5) indica probabilmente che il router non ha inviato il messaggio perché era occupato oppure che la rete stava perdendo dei pacchetti (o entrambe le cose). Si noti l'ottavo hop nella figura 5: l'asterisco che precede l'indirizzo IP indica che il primo messaggio della serie ha superato il tempo di attesa.

 

traceroute to EEE.FFF.GGG.HHH (EEE.FFF.GGG.HHH), 30 hops max, 40 byte packets
1 AAA.BBB.II.LLL 1 ms 0 ms *
2 AAA.BBB.II.J 1 ms 1 ms 1 ms
3 AAA.BBB.MM.NN 1 ms * 1 ms
4 BBB.OOO.PPP.QQQ 7 ms 8 ms 8 ms
5 BBB.RRR.SSS.TTT 76 ms 76 ms 75 ms
6 BBB.RRR.SSS.UUU 79 ms 77 ms 77 ms
7 EEE.FFF.V.J 79 ms * *
8 * EEE.FFF.W.253 79 ms 79 ms
9 EEE.FFF.GGG.HHH 80 ms 80 ms 80 ms
ready 14:43:16

 

Figura 5 – Router sovraccarico o pacchetti persi
Se tutti e tre i messaggi vanno in timeout ma gli hop successivi riportano i tempi (figura 6), è probabile che il router di quell'hop semplicemente non invii messaggi ICMP di timeout.

 

traceroute to EEE.FFF.GGG.HHH (EEE.FFF.GGG.HHH), 30 hops max, 40 byte packets
1 AAA.BBB.II.LLL 1 ms 0 ms 1 ms
2 AAA.BBB.II.J 1 ms 1 ms 1 ms
3 AAA.BBB.MM.NN 1 ms 1 ms 1 ms
4 BBB.OOO.PPP.QQQ 7 ms 8 ms 8 ms
5 BBB.RRR.SSS.TTT 76 ms 76 ms 75 ms
6 BBB.RRR.SSS.UUU 79 ms 77 ms 77 ms
7 * * *
8 * * *
9 EEE.FFF.GGG.HHH 80 ms 80 ms 80 ms
ready 14:47:01

 

Figura 6 – Router non rispondenti
Se tutti gli hop oltre un certo punto superano il timeout (figura 7), è probabile che vi sia un firewall che blocca i messaggi in uscita o in ritorno.

 

traceroute to EEE.FFF.GGG.HHH (EEE.FFF.GGG.HHH), 30 hops max, 40 byte packets
1 AAA.BBB.II.LLL 1 ms 0 ms 0 ms
2 AAA.BBB.II.J 1 ms 1 ms 1 ms
3 AAA.BBB.MM.NN 1 ms 1 ms 1 ms
4 BBB.OOO.PPP.QQQ 7 ms 6 ms 8 ms
5 * * *
6 * * *
7 * * *
8 * * *
. . . .
29 * * *
30 * * *
ready 14:51:05

 

Figura 7 – Blocco da parte del firewall
C'è un altro motivo per cui, superato un certo punto, si verifica un timeout. Ciò accade quando la destinazione non risponde. Non tutte le destinazioni rispondono e, quando ciò accade, si ottiene un risultato simile alla figura 8. La differenza tra le figure 7 e 8 è che nella figura 8 l'ultimo router a inviare una risposta è quello locale rispetto alla destinazione. Come si può capire che è proprio questo il caso? A volte l'indirizzamento lo rende ovvio, ad esempio il target è 192.168.1.12 e 192.168.1.1 è l'ultimo router a rispondere. Non è così ovvio nella figura 9: EEE.FFF.W.XXX potrebbe essere l'ultimo router prima di EEE.FFF.GGG.HHH, dato che hanno in comune i primi 16 bit. Ma senza conoscere lo schema di sottorete utilizzato dalla rete di destinazione non c'è modo di esserne certi senza chiedere.

 

traceroute to EEE.FFF.GGG.HHH (EEE.FFF.GGG.HHH), 30 hops max, 40 byte packets
1 AAA.BBB.II.LLL 1 ms * 0 ms
2 AAA.BBB.II.J 1 ms 1 ms 1 ms
3 AAA.BBB.MM.NN 1 ms 1 ms 0 ms
4 BBB.OOO.PPP.QQQ 10 ms 7 ms 6 ms
5 BBB.RRR.SSS.TTT 77 ms 76 ms 75 ms
6 BBB.RRR.SSS.UUU 79 ms 80 ms 81 ms
7 EEE.FFF.V.J 82 ms 78 ms 79 ms
8 EEE.FFF.W.XXX 78 ms 95 ms 77 ms
9 * * *
. . . .
29 * * *
30 * * *
ready 15:00:20

 

Figura 8 – Il bersaglio non risponde
È inoltre possibile ricevere risposte da due o più router per lo stesso hop (figura 9). Ciò può verificarsi se i router stanno effettuando il bilanciamento del carico, se la rete è instabile e le rotte cambiano o, come nel caso della figura 9, se il router AAA.BBB.CC.KKK non era il router ottimale e, dopo aver inoltrato il pacchetto a AAA.BBB.II.J, ha inviato un messaggio di reindirizzamento alla sorgente affinché modificasse la propria tabella di instradamento.

 

traceroute EEE.FFF.GGG.HHH -numeric
traceroute to EEE.FFF.GGG.HHH (EEE.FFF.GGG.HHH), 30 hops max, 40 byte packets
1 AAA.BBB.CC.KKK 7 ms 1 ms 0 ms
2 AAA.BBB.II.J 1 ms AAA.BBB.MM.NN 1 ms 1 ms
3 BBB.OOO.PPP.QQQ 9 ms 8 ms 8 ms
4 BBB.RRR.SSS.TTT 81 ms 81 ms 77 ms
5 BBB.RRR.SSS.UUU 80 ms 79 ms 78 ms
6 EEE.FFF.V.J 81 ms 77 ms 77 ms
7 EEE.FFF.W.253 78 ms 80 ms 80 ms
8 EEE.FFF.GGG.HHH 84 ms 83 ms 80 ms
ready 15:47:51

 

Figura 9 – Due risposte per lo stesso salto
Esistono due tipi di comandi traceroute, che si distinguono in base al tipo di messaggio che inviano. Alcuni traceroute, come quello presente nei sistemi Microsoft Windows, inviano messaggi ICMP di richiesta di eco (ping); altri, come quello eseguito sotto STCP, inviano messaggi UDP. È importante sapere quale tipo di traceroute si sta utilizzando se è necessario configurare i firewall per consentire il passaggio dei pacchetti o scrivere filtri per analizzatori di protocollo. Inoltre, la risposta del destinatario sarà diversa. Se il target riceve una richiesta ping, invierà una risposta ping; se riceve un messaggio UDP, la risposta dipenderà dal numero di porta. Se la porta è in uso, l'applicazione in ascolto molto probabilmente scarterà il pacchetto perché non soddisfa i requisiti di struttura del messaggio dell'applicazione. Se la porta non è in uso, l'host *potrebbe* inviare un messaggio ICMP di porta di destinazione irraggiungibile. Per questo motivo, traceroute seleziona porte che in genere non vengono utilizzate.

 

Il numero di porta visualizzato dall'host di destinazione dipenderà dal numero di salti necessari per raggiungerlo. Traceroute imposta la porta di destinazione a 33435 (per impostazione predefinita) e incrementa il numero di porta per ogni messaggio (figura 10). L'host di destinazione vedrà quindi 3 porte diverse, ma è probabile che non tutte e tre siano effettivamente in uso. La porta di origine dipende dall'ID del processo che effettua l'invio. Un dato processo utilizzerà sempre la stessa porta di origine.

 

dir len proto source destination src port dst port
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33435
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33436
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33437
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33438
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33439
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33440
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33441
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33442
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33443
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33444
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33445
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33446
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33447
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33448
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33449
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33450
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33451
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33452
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33453
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33454
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33455
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33456
R 28 ICMP EEE.FFF.GGG.HHH AAA.BBB.CC.DDD unreach
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33457
R 28 ICMP EEE.FFF.GGG.HHH AAA.BBB.CC.DDD unreach
T 40 UDP AAA.BBB.CC.DDD EEE.FFF.GGG.HHH 34737 33458
R 28 ICMP EEE.FFF.GGG.HHH AAA.BBB.CC.DDD unreach

 

Figure 10 - (edited) packet traces showing port number changes
Infine, a meno che non ci sia un problema al primo hop, probabilmente non potrai fare molto per risolvere il problema. Una volta che STCP (o lo stack di rete di qualsiasi host) invia un pacchetto al router locale, non è più sotto il suo (e il tuo) controllo. Tuttavia, se conosci l'indirizzo IP dell'ultimo hop che risponde o dell'hop in cui iniziano improvvisamente a verificarsi i timeout, hai un'idea di dove si trovi il problema e puoi contattare il gruppo corretto di amministratori di rete per risolverlo.