Unix: что такое traceroute

Автор: | 04/10/2016
 

unix_logoОригинал и полная версия доступна тут>>>.

Основы traceroute

«Просмотр результатов traceroute схож с наблюдением с высоты птичьего полета за движением автомобиля из одной точки в другую: вы видите каждую из дорог (маршрутов) и перекрестков (роутеров), которые встречаются по пути» (с) Richard SteenbergenNANOG presentation.

Каждая строка в выводе traceroute представляет собой один «прыжок» («hop«) через роутер и отображает путь, который прошел пакет от источника до заданного направления. По умолчанию — большинство реализаций traceroute выполняет три обращения к каждому роутеру («хопу»), отображая три значения его «отзывчивости», измеряемые в милисекундах.

В некоторых случах — эти обращения к хопу могут пройти по различным каналам (хопы 1-4 и 8-9 в примере ниже), что приведет к отображению нескольких строк результата для хопа:

$ traceroute ya.ru
traceroute to ya.ru (213.180.193.3), 30 hops max, 60 byte packets
 1  ec2-79-125-0-240.eu-west-1.compute.amazonaws.com (79.125.0.240)  20.016 ms ec2-79-125-0-238.eu-west-1.compute.amazonaws.com (79.125.0.238)  16.594 ms ec2-79-125-0-236.eu-west-1.compute.amazonaws.com (79.125.0.236)  14.084 ms
 2  100.64.0.14 (100.64.0.14)  17.023 ms 100.64.1.138 (100.64.1.138)  16.738 ms 100.64.0.140 (100.64.0.140)  18.981 ms
 3  100.64.0.67 (100.64.0.67)  19.692 ms 100.64.1.69 (100.64.1.69)  11.952 ms 100.64.1.135 (100.64.1.135)  21.865 ms
 4  100.64.17.79 (100.64.17.79)  0.772 ms 100.64.16.15 (100.64.16.15)  0.794 ms 100.64.16.67 (100.64.16.67)  0.813 ms
 5  * * *
 6  * * *
 7  178.236.0.94 (178.236.0.94)  1.385 ms  1.257 ms  2.842 ms
 8  176.32.106.15 (176.32.106.15)  19.619 ms 54.239.41.101 (54.239.41.101)  19.472 ms 54.239.41.103 (54.239.41.103)  19.680 ms
 9  178.236.3.77 (178.236.3.77)  19.070 ms 178.236.3.75 (178.236.3.75)  18.986 ms 178.236.3.77 (178.236.3.77)  19.149 ms
10  178.236.3.78 (178.236.3.78)  18.787 ms  18.756 ms  18.881 ms
11  retn.franceix.net (37.49.236.17)  22.525 ms  22.519 ms  22.515 ms
12  ae9-5.RT.TC2.AMS.NL.retn.net (87.245.232.137)  23.762 ms  23.779 ms  23.801 ms
13  GW-Yandex.retn.net (87.245.246.14)  22.841 ms  22.752 ms  22.837 ms
14  jansson-et-4-1-0.yndx.net (213.180.213.95)  50.320 ms  50.371 ms  50.353 ms
15  std-p2-hu0-1-0-1.yndx.net (213.180.213.125)  70.594 ms  70.834 ms  70.770 ms
16  fol5-c2-ae3.yndx.net (87.250.239.130)  70.457 ms  70.461 ms  70.413 ms
17  * * *
18  www.yandex.ru (213.180.193.3)  76.072 ms  71.745 ms  73.028 ms
19  www.yandex.ru (213.180.193.3)  70.038 ms  70.212 ms *

Как работает traceroute

Внутри каждого IP-пакета имеется поле, известное как TTLTime To Live. Это поле содержит значение «времени жизни» пакета, измеряемое в количестве пройденных этим пакетом хопов (роутеров) и используется для предотвращения закольцовывания маршрута и бесконечного потребления сетевых ресурсов, ограничивая количество хопов, через которые может быть пропущен этот пакет.

Частью роутинга IP пакетов является уменьшение значения TTL пакета на 1 каждый роутером, который его обрабатывает. Если значение достигает значения 0 — пакет отбрасывается, а отправителю отправляется сообщение ICMP TTL Exceeded (ICMP тип 11), уведомляя о сбросе пакета. traceroute использует эту неотъемлемую часть процесса роутинга пакетов IP для составления «карты» с каждым роутером, который проходит пакет, отправляя серию «зондирующих» пакетов, TTL которых должен истекать до достижения точки назначения и подсчитывая количество полученных сообщений ICMP TTL Exceeded:

traceroute_1

Каждый такой зондирующий пакет следует следующей схеме:

  1. traceroute отправляет пакет к точке назначения, устанавливая TTL равным 1;
  2. каждый роутер в маршруте уменьшает значение TTL на единицу, пока TTL не достингнет нуля;
  3. когда TTL становится == 0 то роутер, который отбрасывает этот пакет, отправляет отправителю сообщение ICMP TTL Exceeded, в которое включаются первые 28 байт оригинального «зондирующего» пакета;
  4. traceroute получает это сообщение и использует разницу во времени между отправкой оригинального пакета и полученным в ответ пакетом ICMP для посчета задержки доставки к этому роутеру/хопу;
  5. процесс повторяется с п. 1, но с TTL увеличенным на 1, пока…
  6. окончательный получатель получает пакет от traceroute и отправляет в ответ сообщение, отличное от ICMP TTL Exceeded. Тогда traceroute считает, что трассировка завершена и заверает процесс.

Пример:

$ traceroute ya.ru 
traceroute to ya.ru (93.158.134.3), 30 hops max, 60 byte packets
 1  192.168.1.1 (192.168.1.1)  0.519 ms  0.915 ms  0.909 ms
 ...
 11  www.yandex.ru (93.158.134.3)  23.488 ms *  27.964 ms

И результат tcpdump:

$ sudo tcpdump -nvv -i eth0  host ya.ru
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:37:58.010599 IP (tos 0x0, ttl 1, id 15601, offset 0, flags [none], proto UDP (17), length 60)
    192.168.1.149.42448 > 93.158.134.3.33434: [bad udp cksum 0xa618 -> 0x3c4f!] UDP, length 32
...
12:38:03.017059 IP (tos 0x0, ttl 12, id 16527, offset 0, flags [none], proto UDP (17), length 60)
    192.168.1.149.60885 > 93.158.134.3.33468: [bad udp cksum 0xa618 -> 0xf427!] UDP, length 32
  • в результатах видно значение TTL, которое увеличивается от 1 в первом пакете  — IP (tos 0x0, ttl 1) и в последнем — IP (tos 0x0, ttl 12), всего 11 хопов
  • порт назначения для первого пакета: 93.158.134.3.33434
  • ответ ICMP TTL Exceeded93.158.134.3 > 192.168.1.149: ICMP time exceeded in-transit

Какие хопы вы видите в результатах traceroute?

Когда роутер отбрасывает пакет из-за истекшего значения TTL — он создает сообщение ICMP TTL Exceeded, в котором указывается IP-адрес интерфейса источника пакета, который получил оригинальный пакет. Далее, когда traceroute получает этот ICMP ответ — он использует адрес источника для преставления очередного роутера:

traceroute_2

В примере выше маршрут, который отобразит traceroute, будет:

  1. 172.16.2.1
  2. 10.3.2.2

Важно помнить, что traceroute не предоставляет никакой информации об «исходящих» интерфейсах роутра или об обратном пути пакета ICMP.

Реализации traceroute

Фактически — любой тип пакетов IP может использоваться как «зондирующий» пакет traceroute, так как единственное требование — это наличие поля TTL.

Наиболее часто используемые реализации traceroute:

  • классический UNIX Traceroute — использует UDP пакеты, с портом получателя 33434, который увеличивается на 1 с каждым новым пакетом. По умолчанию traceroute отправляет три пакета к каждому узлу. Порт получателя UDP пакета используется traceroute для индентификации зондирующих пакетов. После того, как пакет достингет точки назначения — получатель отправляет сообщение  ICMP Destination Unreachable (ICMP тип 3), обозначая таким образом завершение выполнения traceroute. Многие реализации traceroute позволяют использовать UDP, ICMP или TCP для создания таких «зондирующих» пакетов.
    • интересный факт: стартовый порт 33434 является суммой значений 32768  (215 — половина максимального значения диапазона портов UDP) и 666 («Число Зверя» или «Число Дьявола»).
  • Windows Traceroute (вернее — tracert.exe) использует пакеты ICMP Echo Request (ICMP Тип 8), а не UDP, как это делает UNIX-реализация traceroute, а по достижении точки назначения — tracert ожидает получения пакета  ICMP Echo Reply (ICMP тип 0).

В оригинале, на http://www.nanog.org, есть еще очень много интерсных деталей как о самом traceroute — так и правильной интерпретации данных, полученных с его помощью.

Доступны два варианта — в виде книги (PDF) и и виде презентации.