Traceroute

Traceroute и tracert — это диагностические команды командной строки, предназначенные для отображения возможных маршрутов (путей) и задержек прохождения пакетов через сеть, использующую IP-протокол.

Общие сведения
Traceroute
Тип командная строка
Автор Ван Джейкобсон
Первый выпуск 1987
Аппаратные платформы Unix-подобная система

Фукционал

Команда выводит время обратного пути (RTT), полученное от каждого последовательного узла (удалённого хоста) по маршруту к назначению. Сумма средних задержек по каждому прыжку характеризует общее время установления подключения. Команда прерывается, если все (обычно три) отправленных пакета теряются больше двух раз подряд.

Ping вычисляет только общее время обратного пути до конечной точки назначения.

Для Internet Protocol Version 6 (IPv6) данная утилита часто называется traceroute6[1] или tracert6[2].

Реализации

Данная команда присутствует во многих современных операционных системах: обычно именуется traceroute в Unix-подобных ОС, таких как FreeBSD, macOS, Linux; в Windows и ReactOStracert.

В предыдущих версиях macOS была реализована графическая оболочка, однако она была удалена начиная с выпуска macOS Big Sur[3].

В операционных системах, основанных на Windows NT, также имеется утилита PathPing, сочетающая функциональность ping и tracert.

В ReactOS утилита была разработана Гедом Мёрфи и распространяется под лицензией GPL[4].

В Unix-подобных ОС traceroute по умолчанию отправляет последовательность UDP-пакетов с номерами портов от 33434 до 33534. В реализациях traceroute, которые поставляются с Linux[5], FreeBSD[6], NetBSD[7], OpenBSD[8], DragonFly BSD и macOS предусмотрена возможность отправлять ICMP Echo Request (ключ -I), а также произвольные протоколы (-P), например, UDP, TCP (через TCP SYN) или ICMP[9].

В Windows tracert отправляет ICMP Echo Request, в отличие от traceroute, где по умолчанию используются UDP-пакеты[10].

Параметр time-to-live (TTL) (ограничение на количество прыжков) используется для пошагового определения промежуточных маршрутизаторов на пути к назначению. Traceroute увеличивает TTL с каждым новым отправляемым пакетом, начиная с единицы. Маршрутизаторы уменьшают TTL на единицу при пересылке пакета и, если TTL достигает нуля, отбрасывают пакет, возвращая ICMP сообщение ICMP Time Exceeded[9]. Для первого набора пакетов первый маршрутизатор отбрасывает пакет (TTL=0), сообщает отправителю ICMP Time Exceeded. Следующий набор пакетов получает TTL=2: первый маршрутизатор пересылает пакет, второй отбрасывает и отвечает ICMP Time Exceeded и так далее. Таким образом traceroute, анализируя ICMP Time Exceeded, строит список маршрутизаторов, по которым проходят пакеты, пока не достигнет точки назначения, где возвращается ICMP Destination Unreachable (при использовании UDP) или ICMP Echo Reply (при использовании ICMP Echo Request)[9].

Значения времени для каждого маршрутизатора отображают задержку (латентность), обычно в миллисекундах.

Отправляющая сторона ждёт ответа в течение заданного интервала. Если подтверждения нет, выводится символ * (звёздочка).

Протокол IP не гарантирует, что все пакеты дойдут до точки назначения одинаковым маршрутом; в списке могут присутствовать промежуточные хосты, по которым проходили только некоторые пакеты. Если промежуточный хост не отвечает, прыжок пропускается.

Если сеть использует файрвол и одновременно поддерживает Windows и Unix-подобные системы, для корректной работы traceroute потребуется разрешить прохождение соответствующих протоколов через фильтр.

Некоторые реализации traceroute используют TCP-пакеты, например, tcptraceroute и layer four traceroute (lft). PathPing — утилита, появившаяся в Windows NT, которая совмещает возможности ping и traceroute. MTR — усовершенствованная версия ICMP traceroute для Unix-подобных и Windows-систем. Все реализации traceroute используют ICMP Time Exceeded (тип 11) для получения ответов.

В Linux есть утилита tracepath, аналогичная traceroute, но не требующая привилегий суперпользователя[11].

Реализация traceroute в Cisco также отправляет последовательность UDP-дейтаграмм с увеличивающимися TTL на несуществующий порт (по умолчанию UDP 33434) на удалённом хосте. Расширенная версия команды позволяет указывать порт вручную[12].

Использование

undefined

В большинстве реализаций можно указать количество посылаемых запросов на каждый прыжок, интервал ожидания ответа, ограничение макcимального количества прыжков и используемый порт. Запуск traceroute без параметров обычно выводит справку по доступным опциям.

В Linux подробности и обозначения ошибок приводятся на странице руководства man traceroute.

Например:

$ traceroute -w 3 -q 1 -m 16 example.com
traceroute to example.com (93.184.216.34), 16 hops max, 52 byte packets
 1  192.x.x.x (192.x.x.x)  5.152 ms
 2  10.x.x.x (10.x.x.x)  12.767 ms
 3  172.x.x.x (172.x.x.x)  11.638 ms
 4  172.x.x.x (172.x.x.x)  13.193 ms
 5  xxx.x.x.x.cox.net (68.x.x.x)  20.624 ms
 6  xxx.xxx.xxx.edgecastcdn.net (192.x.x.x)  56.205 ms
 7  xxx.xxx.xxx.edgecastcdn.net (192.x.x.x)  24.573 ms
 8  *
 9  *
10  93.x.x.x (93.x.x.x)  22.810 ms
11  93.x.x.x (93.x.x.x)  20.235 ms

В приведённом примере указаны параметры: время ожидания 3 секунды (вместо стандартных пяти), по одному запросу на каждый прыжок (вместо трёх), ограничение по маршруту — 16 прыжков (по умолчанию 30). Хост назначения — example.com. На 8-й и 9-й строках (TTL 8 и 9) вместо ответа отображены звёздочки — маршрутизатор не ответил в пределах установленного времени ожидания.

Значение

Traceroute помогает выявлять ошибки в маршрутизации и работу файрволов, которые могут блокировать ICMP-трафик или UDP на высоких портах (в Unix-реализациях). При этом корректный отклик traceroute не гарантирует работоспособность всех приложений — файрвол может разрешать ICMP, но запрещать другие протоколы.

Traceroute используется пентестерами для сбора информации о сетевой инфраструктуре и диапазонах IP-адресов вокруг целевого хоста.

Также traceroute позволяет выбирать оптимальный источник загрузки: если доступно несколько зеркал одного ресурса, можно определить наиболее быстрый путь.

Происхождение

Согласно руководству к traceroute, оригинальная версия программы была написана Ваном Джейкобсоном в 1987 году по предложению Стива Диринга; также идея одновременно пришла Guy Almes и Matt Mathis[13]. Автор утилиты ping, Mike Muuss, отмечал у себя на сайте, что traceroute реализован с использованием поддержки ICMP в ядре, которую он написал ранее для ping[14].

Ограничения

У traceroute существуют различные ограничения[15]. Traceroute отображает траектории на уровне сетевых интерфейсов, а не маршрутизаторов. Проблемы также возникают, если роутеры не отвечают на запросы либо лимитируют скорость ICMP-ответов[16]. При балансировке нагрузки результат может показывать несуществующий маршрут; для уменьшения этой проблемы существует модификация Paris-traceroute[17], сохраняющая инвариантность flow identifier в пакетах.

Примечания

  1. Traceroute6(8) — Linux man page (англ.). linux.die.net. Дата обращения: 28 сентября 2023. Архивировано 6 июля 2025 года.
  2. Tracert6(8): IPv6 traceroute tool — Linux man page (англ.). linux.die.net. Дата обращения: 28 сентября 2023. Архивировано 27 августа 2016 года.
  3. Rossingol, Joe Network Utility Deprecated in macOS Big Sur (англ.). MacRumors (23 июня 2020). Дата обращения: 28 сентября 2023. Архивировано 24 августа 2025 года.
  4. tracert.cpp — исходный код. GitHub. Дата обращения: 28 сентября 2023. Архивировано 18 сентября 2023 года.
  5. traceroute(8) — Linux man page (англ.). man7.org. Дата обращения: 28 сентября 2023. Архивировано 18 сентября 2025 года.
  6. traceroute(8) — FreeBSD man page (англ.). freebsd.org. Дата обращения: 28 сентября 2023.
  7. traceroute(8) — NetBSD man page (англ.). netbsd.gw.com. Дата обращения: 28 сентября 2023.
  8. traceroute(8) — OpenBSD man page (англ.). man.openbsd.org. Дата обращения: 28 сентября 2023. Архивировано 16 сентября 2025 года.
  9. 1 2 3 Comer, Douglas. Computer Network and Internets with Internet Applications. — Pearson Education, Inc., 2004. — P. 360–362. — ISBN 978-0131433519.
  10. Tracert (англ.). Microsoft Docs (3 февраля 2023). Дата обращения: 29 июля 2023. Архивировано 6 августа 2025 года.
  11. tracepath(8) – Linux man page (англ.). linux.die.net. Дата обращения: 21 июня 2015. Архивировано 15 августа 2007 года.
  12. Understanding the Ping and Traceroute Commands. Cisco IOS Software Releases 12.1 Mainline. cisco.com (29 ноября 2006). Дата обращения: 8 декабря 2013. Архивировано 6 декабря 2006 года.
  13. traceroute6.c — исходный код (англ.) (4 октября 2022). Дата обращения: 17 сентября 2023. Архивировано 9 декабря 2023 года.
  14. The Story of the PING Program. arl.army.mil. Дата обращения: 28 сентября 2023. Архивировано 23 августа 2000 года.
  15. Ray Belleville. Limitations of Traceroute Explained (англ.) (3 марта 2017). Дата обращения: 28 сентября 2023. Архивировано 5 августа 2025 года.
  16. Marchetta, P.; Montieri, A.; Persico, V.; Pescapé, A.; Cunha, Í; Katz-Bassett, E. (June 2016). How and how much traceroute confuses our understanding of network paths. 2016 IEEE International Symposium on Local and Metropolitan Area Networks (LANMAN). pp. 1—7. DOI:10.1109/lanman.2016.7548847. ISBN 978-1-4673-9882-4. S2CID 4643833.
  17. Paris Traceroute (брит. англ.). paris-traceroute.net. Дата обращения: 10 июня 2017.

Литература

  • Frisch, Æleen. Windows 2000 Commands Pocket Reference. — O'Reilly, 2001. — ISBN 978-0-596-00148-3.
  • Stanek, William R. Windows Command-Line Administrator's Pocket Consultant, 2nd Edition. — Microsoft Press, 2008. — ISBN 978-0735622623.
  • Barrett, Daniel J. Macintosh Terminal Pocket Guide: Take Command of Your Mac. — O'Reilly, 2012. — ISBN 978-1449328986.

Ссылки