# Traceroute - как увидеть путь пакета через интернет _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** Утилита, показывающая каждый роутер на пути до удалённого хоста. Работает через хитрый трюк: шлёт пакеты с **возрастающим TTL** (1, 2, 3, ...) и собирает ответы «time exceeded» от роутеров, которые дропают такие пакеты. ## Зачем нужен Когда твой пинг до сайта медленный - где затык? Где-то у тебя дома, у провайдера, на магистрали, у дата-центра удалённого сервера? Без traceroute это слепое гадание. С ним - **видишь каждый роутер по пути** и время ответа на каждом. ## Как работает (трюк с TTL) Каждый IP-пакет имеет поле **TTL** (Time To Live) - счётчик хопов. Каждый роутер декрементирует TTL на 1; если стало 0 - пакет дропается и отправителю летит [icmp](/kb/icmp.md) **type 11 (time exceeded)**. Traceroute эксплуатирует это: 1. Шлёт пакет с **TTL=1**. Первый же роутер декрементирует до 0, дропает, шлёт ICMP time-exceeded. Мы получили адрес **первого роутера** 2. Шлёт пакет с **TTL=2**. Первый роутер декрементирует до 1, форвардит. Второй декрементирует до 0, дропает, шлёт ICMP. Мы получили **второй роутер** 3. И так далее, увеличивая TTL пока не получим ответ от **самого хоста** Каждый шаг повторяется обычно 3 раза, чтобы увидеть разброс задержки. ## Реализации различаются - **Linux `traceroute`** по умолчанию шлёт **UDP** на «непонятный» высокий порт. Для tcp используется флаг `-T`, для icmp - `-I` - **Windows `tracert`** шлёт **ICMP echo-request** (как ping) - **macOS** - UDP по умолчанию (как Linux) Это важно: фаерволы могут пропускать ICMP, но дропать UDP - тогда traceroute показывает звёздочки, хотя `ping` работает. Решение: попробовать `traceroute -I` (ICMP) или `tcptraceroute` (использует TCP к открытому порту). ## Чтение вывода ``` $ traceroute google.com 1 192.168.1.1 0.5 ms ← домашний роутер 2 10.10.0.1 5.2 ms ← провайдер 3 * * * ← дропает или скрывается 4 72.14.234.1 12.5 ms ← magistral 5 142.250.46.225 15.0 ms ← google ``` - **`* * *`** на конкретном хопе - роутер не отвечает на ICMP (часто это политика безопасности). Не значит что путь не работает - **Резкий скачок задержки** между двумя соседними хопами - там лежит «бутылочное горлышко» - **Неравномерная задержка** в одном хопе ([1ms, 100ms, 1ms]) - обычно rate-limit на ICMP-ответы у роутера, не реальная задержка ## mtr - лучше чем traceroute **MTR** = traceroute + ping в одном - постоянно прозванивает каждый хоп и показывает % потерь и стабильность задержки. Незаменим для дебага «иногда тупит». ```bash mtr google.com # интерактивный, обновляется в реалтайме mtr -rwc 100 google.com # 100 проб, отчёт-режим, для логов ``` ## Команды ```bash traceroute google.com ``` UDP-traceroute (Linux дефолт) ```bash traceroute -I google.com ``` Через ICMP - если UDP блокируется фаерволом ```bash traceroute -T -p 443 google.com ``` Через TCP к 443 - если ICMP блокирован, но порт открыт ```bash mtr google.com ``` Интерактивный traceroute с realtime-мониторингом потерь ```bash tracepath google.com ``` Альтернатива без root, заодно показывает Path MTU ## См. также - [Routing table](/kb/routing-table.md) - [IP forwarding - превратить хост в роутер](/kb/ip-forwarding.md) - [ICMP](/kb/icmp.md) - [mtr - traceroute + ping в одном](/kb/cmd-mtr.md)