Jak tracert i traceroute wykorzystują TTL do śledzenia trasy pakietów

Narzędzia tracert (w systemach Windows) i traceroute (linux) służą do ustalania trasy, jaką pokonują pakiet pomiędzy hostami. Składnia obu tych narzędzi jest bardzo prosta i to nie tym będzie ten wpis. Zajmiemy się natomiast bardzo ciekawym wykorzystaniu pola TTL z nagłówka pakietów IP, zaczynajmy!

Na wstępie zacznijmy od tego, do czego może nam posłużyć takie śledzenie tras? Narzędzia tracert i traceroute przydadzą się do odpowiedzi na następujące pytania:

  • Jeśli mam dwóch lub więcej dostawców internetowych, to przez którego z nich ruch jest kierowany?
  • Jeśli komunikacja nie działa, to na którym z routerów dochodzi do przerwania transmisji?
  • Czy ruch jest poprawnie trasowany, np. przez tunel VPN?

Jak działa TTL

Parametr TTL zapobiega zapętleniu pakietów w sieci. Żeby pakiet nie krążyły się pomiędzy urządzeniami sieciowymi w nieskończoność, każdy z routerów, przez które przechodzi pakiet, obniża wartość TTL o 1. Jeśli wartość TTL na początku wynosi 64, po przejściu przez pierwszy router będzie miała wartość 63. Pakiet po przejściu przez drugi router będzie miał TTL = 62 itd. Router, który obniży wartość TTL do zera, nie prześle pakietu dalej! Zamiast tego wyśle do nadawcy wiadomość o niemożliwości dalszego przesyłania pakietów. Ponieważ maksymalna wartość TTL to 255 (pole ma rozmiar 8 bitów), pakiet po przejściu przez maksymalnie 255 routerów zostanie zablokowany i nie będzie krążył dłużej w sieci.

Jak działa TTL

Jak działa tracer/traceroute

Tracert i traceroute wykorzystują fakt, że router, który nie przesyła pakietu dalej, odsyła do nadawcy informację, że pakiet został zablokowany i kto go zablokował. Działa to dokładnie tak:

  • komputer wysyła pakiet ICMP echo request (PING) z parametrem TTL=1
  • pierwszy router na drodze do celu blokuje taki pakiet i odsyła wiadomość, że takie a takie urządzenie zablokowało pakiet.
  • komputer zapisuje adres pierwszego routera na ścieżce i ponownie wysyła pakiet ICMP echo request, ale tym razem z TTL=2
  • pierwszy router przepuszcza ten pakiet i obniża wartość TTL na 1.
  • pakiet trafia na drugu router na ścieżce. Router nie przesyła pakietu dalej, tylko informuje nadawcę, że zablokował pakiet.
  • komputer zapisuje adres drugiego routera na ścieżce i wysyła kolejne pakiety, zwiększając za każdym razem TTL o 1 i dopisując kolejne routery na ścieżce.
  • po kilku takich cyklach pakiet trafia nareszcie do serwera docelowego a tracert/traceroute może wyświetlić całą trasę pomiędzy urządzeniami.
TTL Limit exceeded

Śledzenie trasy w praktyce

Tyle teorii, pora zobaczyć jak to działa w praktyce. Na początku zobaczmy, jaki jest wynik działania tracert na moim komputerze.

tracert -d 8.8.8.8

Tracing route to 8.8.8.8 over a maximum of 30 hops

  1     *        *        *     Request timed out.
  2     4 ms     3 ms     3 ms  81.30.128.1
  3    12 ms     9 ms    13 ms  178.216.40.134
  4    11 ms    10 ms    12 ms  108.170.250.193
  5    10 ms    10 ms    23 ms  216.239.41.165
  6    10 ms    10 ms    10 ms  8.8.8.8

Trace complete.

Badałem trasę do adresu 8.8.8.8, czyli serwera DNS Google. Użycie parametru -d miało na celu wyświetlanie adresów IP zamiast rozwiązywania ich na nazwy domenowe.

Jak widać, każdy z pakietów był powtarzany trzykrotnie. Protokół ICMP jest protokołem bezpołączeniowym i takie działanie ma na celu wyeliminowanie sytuacji, kiedy pojedynczy pakiet, zapytanie lub odpowiedź, byłby utracony na skutek jakiegoś błędu sieci.

W pierwszej linii nie widzimy czasów odpowiedzi a jedynie znak *, który oznacza, że na wysłane zapytanie nie przyszła żadna odpowiedź. Żadna odpowiedź oznacza, że nie przyszła ani odpowiedź z serwera docelowego, ani komunikat z routera o zablokowaniu pakietu z powodu przekroczenia czasu tranzytu pakietu (wyzerowania wartości TTL). W tej komunikacji nie wiem, jaki był pierwszy router na wyznaczanej ścieżce. Dla kolejnych routerów widać zarówno czas ich odpowiedzi, jak i ich adresy IP. W szóstej linii widać, że odpowiedział host docelowy i badanie trasy zostało zakończone.

Spoglądając na pakiety całe badanie wyglądało następująco:

Widzimy tutaj, jak zmieniał się parametr TTL. Widzimy również wiadomości „Time-to-live exceeded” wysyłane przez routery na ścieżce ruchu. Na końcu widzimy pakiety ICMP echo replay wysłane przez host docelowy.

Czy każde urządzenie obniża TTL?

Obniżanie parametru TTL przez kolejne urządzenia jest regułą. Od każdej reguły są jednak wyjątki. Zdarza się, że niektóre urządzenia nie obniżają parametru TTL, przez co są niewidoczne w takim badaniu. Odnosi się to głównie do firewalli i innych urządzeń filtrujących ruch i ma na celu ukrycie ich widoczności.

2 komentarze do “Jak tracert i traceroute wykorzystują TTL do śledzenia trasy pakietów

  1. Froke Odpowiedz

    TTL nie wyznacza trasy pakietów. Nie robi tego też ani ICMP, ani traceroute. Trase wyznaczają routery i ich tablice routingu. Źródło (poza nieużywanym source routingiem) nie ma wpływu na trasę pakietu w sieci. Traceroute może pokazać nam przez które urządzenia przechodzą wysyłane przez nas pakiety, ale z sam nic nie wyznacza.

    • Piotrek Autor wpisuOdpowiedz

      Cześć Froke,
      Dziękuję za Twój komentarz. Pokazuje mi on, jak dużo uwagi muszę poświęcić, żeby być precyzyjnie zrozumianym.
      Zrobiłem korekty w tekście i zastąpiłem „wyznaczanie” na „śledzenie” i „ustalanie”. Teraz już chyba nikt nie będzie miał wątpliwości do czego służą tracert i traceroute i po co im do tego parametr TTL 🙂
      Dzięki, że czytasz i komentujesz mojego bloga.
      Pozdrawiam
      Piotrek

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *