traceroute - отображает путь, по которому пакеты передаются к сетевому хосту
СИНТАКСИС
traceroute [-46dFITUnreAV] [-f first_ttl] [-g gate,...]
[-i device] [-m max_ttl] [-p port] [-s src_addr]
[-q nqueries] [-N squeries] [-t tos]
[-l flow_label] [-w waittimes] [-z sendwait] [-UL] [-D]
[-P proto] [--sport=port] [-M method] [-O mod_options]
[--mtu] [--back]
host [packet_len]
traceroute6 [options]
tcptraceroute [options]
lft [options]
ОПИСАНИЕ
traceroute отслеживает путь, который пакеты проходят в IP-сети на пути к заданному хосту.
Он использует поле IP-протокола "время жизни" (TTL) и пытается получить ответ ICMP TIME_EXCEEDED от каждого шлюза на пути к хосту.
traceroute6 эквивалентен traceroute -6
tcptraceroute эквивалентен traceroute -T
lft, Layer Four Traceroute, выполняет TCP-трассировку, как traceroute -T, но пытается
обеспечить совместимость с исходной реализацией, также называемой "lft".
Единственный обязательный параметр — имя или IP-адрес целевого хоста. Необязательный параметр
packet_len — это общий размер зондирующего пакета (по умолчанию 60 байт для IPv4 и 80 для IPv6).
Указанный размер может быть проигнорирован в некоторых ситуациях или увеличен до минимального значения.
Эта программа пытается отследить путь, по которому IP-пакет будет следовать к некоторому интернет-хосту, отправляя пробные пакеты с небольшим значением TTL (время жизни), а затем прослушивая ответ ICMP "время истекло" от шлюза. Мы начинаем наши пробные пакеты со значения TTL, равного одному, и увеличиваем его на единицу, пока не получим ICMP "порт недоступен" (или TCP-сброс), что означает, что мы достигли "хоста" или достигли максимального значения (по умолчанию 30 переходов). По умолчанию отправляется три пробных пакета при каждой настройке TTL, и печатается строка, показывающая TTL, адрес шлюза и время прохождения каждого пробного пакета. Адрес может сопровождаться дополнительной информацией по запросу. Если ответы от пробных пакетов поступают от разных шлюзов, будет напечатан адрес каждой отвечающей системы. Если в течение определенного времени ожидания ответа не поступает, для этого пробного пакета печатается "*" (звездочка).
После времени прохождения может быть напечатана дополнительная аннотация: !H, !N или !P (хост, сеть или протокол недоступны), !S (ошибка маршрутизации), !F (необходима фрагментация), !X (связь административно запрещена), !V (нарушение приоритета хоста), !C (вступило в силу ограничение приоритета) или !
Мы не хотим, чтобы целевой хост обрабатывал UDP-пакеты-зонды, поэтому целевой порт устанавливается на маловероятное значение (вы можете изменить его с помощью флага -p). Для ICMP или TCP-трассировки такой проблемы нет (для TCP мы используем технику «полуоткрытого» соединения, которая предотвращает обнаружение наших зондов приложениями на целевом хосте).
В современных сетевых средах традиционные методы трассировки не всегда применимы из-за широкого использования межсетевых экранов. Такие межсетевые экраны фильтруют «маловероятные» UDP-порты или даже ICMP-эхо-запросы. Чтобы решить эту проблему, реализованы дополнительные методы трассировки (включая TCP), см. «СПИСОК ДОСТУПНЫХ МЕТОДОВ» ниже. Эти методы пытаются использовать определенный протокол и исходный/целевой порт, чтобы обойти межсетевые экраны (чтобы они воспринимались межсетевыми экранами как начало разрешенного типа сетевой сессии).
ОПЦИИ
--help Вывести справку и выйти.
-4, -6 Явно указать использование IPv4 или IPv6 для трассировки. По умолчанию программа пытается
разрешить заданное имя и автоматически выбрать соответствующий протокол. Если разрешение имени
хоста возвращает как IPv4, так и IPv6-адреса, трассировка будет использовать IPv4.
-I, --icmp
Использовать ICMP ECHO для зондов.
-T, --tcp
Использовать TCP SYN для зондов.
-d, --debug
Включить отладку на уровне сокетов (если это поддерживается ядром Linux).
-F, --dont-fragment
Не фрагментировать зондирующие пакеты. (Для IPv4 также устанавливает бит DF, который указывает
промежуточным маршрутизаторам не выполнять фрагментацию удаленно).
Изменяя размер зондирующего пакета с помощью параметра командной строки packet_len, вы можете
вручную получить информацию о MTU отдельных сетевых узлов. Опция --mtu (см. ниже) пытается
сделать это автоматически.
Обратите внимание, что функции, не допускающие фрагментацию (например, -F или --mtu), работают
правильно, начиная с версии ядра Linux 6.22. До этой версии IPv6 всегда фрагментировался, а IPv4
мог использовать только обнаруженное конечное значение MTU (из кэша маршрутов), которое может быть
меньше фактического MTU устройства.
-f first_ttl, --first=first_ttl
Указывает, с какого значения TTL начинать. По умолчанию 1.
-g gateway, --gateway=gateway
Указывает traceroute добавлять IP-опцию исходного маршрутизатора к исходящему пакету, которая
указывает сети маршрутизировать пакет через указанный шлюз (большинство маршрутизаторов отключили
исходный маршрутизатор из соображений безопасности). В общем, допускается несколько шлюзов
(разделенных запятыми). Для IPv6 допускается форма num,addr,addr..., где num — тип заголовка
маршрута (по умолчанию — тип 2). Обратите внимание, что тип 0 заголовка маршрута теперь устарел
(RFC 5095).
-i interface, --interface=interface
Указывает интерфейс, через который traceroute должен отправлять пакеты. По умолчанию интерфейс
выбирается в соответствии с таблицей маршрутизации.
-m max_ttl, --max-hops=max_ttl
Указывает максимальное количество узлов (максимальное значение TTL), до которых traceroute
будет выполнять зондирование. По умолчанию 30.
-N squeries, --sim-queries=squeries
Указывает количество одновременно отправляемых зондирующих пакетов. Отправка нескольких зондов одновременно может значительно ускорить работу traceroute. Значение по умолчанию — 16. Обратите внимание, что некоторые маршрутизаторы и хосты могут использовать ограничение скорости ICMP. В этом случае указание слишком большого числа может привести к потере некоторых ответов.
-n Не пытаться сопоставить IP-адреса с именами хостов при их отображении.
-p port, --port=port
Для трассировки UDP указывает базовый порт назначения, который будет использоваться traceroute (номер порта назначения будет увеличиваться для каждого зонда). Для трассировки ICMP указывает начальное значение последовательности ICMP (которое также будет увеличиваться для каждого зонда). Для TCP и других протоколов указывает просто постоянный порт назначения для подключения. При использовании оболочки tcptraceroute, -p указывает порт-источник.
-t tos, --tos=tos
Для IPv4 устанавливает значение Type of Service (TOS) и Precedence. Полезные значения: 16 (низкая задержка) и 8 (высокая пропускная способность). Обратите внимание, что для использования некоторых значений приоритета TOS вам необходимо быть суперпользователем. Для IPv6 устанавливает значение Traffic Control.
-l flow_label, --flowlabel=flow_label
Использует указанный flow_label для пакетов IPv6.
-w max[,here,near], --wait=max[,here,near]
Определяет, как долго ждать ответа на зонд.
Существует три (в общем случае) значения с плавающей точкой, разделенные запятой (или косой чертой). Max указывает максимальное время ожидания (в секундах, по умолчанию 5.0) в любом случае.
Традиционная реализация traceroute всегда ждала полное значение max секунд для любого зонда. Но если у нас уже есть некоторые ответы от того же узла или даже от следующего узла, мы можем использовать время кругового обмена такими ответами в качестве подсказки для определения фактического разумного времени ожидания.
Необязательное значение here (по умолчанию 3.0) указывает коэффициент, на который нужно умножить время кругового обмена полученного ответа от того же узла. Полученное значение используется в качестве времени ожидания для зонда, вместо (но не более) max. Необязательное значение near (по умолчанию 10.0) указывает аналогичный коэффициент для ответа от следующего узла. (Время первого найденного результата используется в обоих случаях).
Сначала мы ищем тот же узел (откуда будет напечатан первый зонд). Если ничего не найдено, ищем следующий узел. Если ничего не найдено, используем max. Если значения here и/или near равны нулю, соответствующее вычисление пропускается. Значения here и near всегда устанавливаются в ноль, если указано только max (для совместимости с предыдущими версиями).
-q nqueries, --queries=nqueries
Устанавливает количество зондирующих пакетов для каждого узла. Значение по умолчанию — 3.
-r Обходит обычные таблицы маршрутизации и отправляет напрямую хосту в подключенной сети. Если хост не находится в непосредственно подключенной сети, возвращается ошибка. Этот параметр можно использовать для пинга локального хоста через интерфейс, для которого нет маршрута.
-s source_addr, --source=source_addr
Выбирает альтернативный адрес-источник. Обратите внимание, что вы должны выбрать адрес одного из интерфейсов. По умолчанию используется адрес исходящего интерфейса.
-z sendwait, --sendwait=sendwait
Минимальный интервал между зондирующими пакетами (по умолчанию 0). Если значение больше 10, то оно указывает на количество миллисекунд, в противном случае – на количество секунд (допускаются значения с плавающей точкой). Полезно, когда некоторые маршрутизаторы используют ограничение скорости для ICMP-сообщений.
-e, --extensions
Отображать расширения ICMP (rfc4884). Общий формат: CLASS/TYPE:, за которым следует шестнадцатеричный дамп. MPLS (rfc4950) отображается в разобранном виде в следующем формате: MPLS:L=метка,E=exp_use,S=stack_bottom,T=TTL (дополнительные объекты разделены знаком /). Интерфейсная информация (rfc5837) также отображается в разобранном виде в следующем формате: {INC|SUB|OUT|NXT}:index,IP_addr,"name",mtu=MTU (все четыре поля могут отсутствовать).
-A, --as-path-lookups
Выполнять поиск AS-путей в реестрах маршрутизации и выводить результаты непосредственно после соответствующих адресов.
-V, --version
Вывести версию и завершить работу.
Существуют дополнительные параметры, предназначенные для расширенного использования (такие как альтернативные методы трассировки и т. д.):
--sport=port
Выбирает исходный порт для использования. Предполагает -N 1 -w 5. Обычно исходные порты (если применимо) выбираются системой.
--fwmark=mark
Устанавливает отметку брандмауэра для исходящих пакетов (начиная с ядра Linux 2.6.25).
-M method, --module=name
Использовать указанный метод для операций трассировки маршрута. По умолчанию традиционный UDP-метод имеет имя default, ICMP (-I) и TCP (-T) имеют имена icmp и tcp соответственно. Метод-специфичные опции могут передаваться с помощью -O. У большинства методов есть свои простые сокращения (например, -I означает -M icmp и т. д.).
-O option, --options=options
Указывает некоторые метод-специфичные опции. Несколько опций разделяются запятой (или используйте несколько -O в командной строке). Каждый метод может иметь свои собственные специфические опции, или у некоторых их может не быть вообще. Чтобы вывести информацию о доступных опциях, используйте -O help.
-U, --udp
Использовать UDP для указанного порта назначения для трассировки (вместо увеличения порта для каждого зондирующего пакета). Порт по умолчанию — 53 (DNS).
-UL Использовать UDPLITE для трассировки (порт по умолчанию — 53).
-D, --dccp
Использовать DCCP-запросы для зондирующих пакетов.
-P protocol, --protocol=protocol
Использовать необработанный пакет указанного протокола для трассировки. Протокол по умолчанию — 253 (rfc3692).
--mtu Определить MTU по пути трассировки. Предполагает -F -N 1. Новое значение MTU выводится один раз в формате F=NUM для первого зондирующего пакета узла, для которого требуется достичь такого MTU. (Фактически, соответствующее сообщение ICMP о необходимости фрагментации обычно отправляется предыдущим узлом).
Обратите внимание, что некоторые маршрутизаторы могут кэшировать информацию о фрагментации. Таким образом, вы можете получить окончательное значение MTU от более близкого узла. Попробуйте указать необычный TOS с помощью -t, это может помочь в одном из случаев (затем он также может быть кэширован). См. опцию -F для получения дополнительной информации.
--back Вывести количество обратных переходов, когда он, по-видимому, отличается от прямого направления.
Это число вычисляется на основе предположения, что удаленные узлы отправляют пакеты ответа с начальным значением TTL, установленным либо на 64, либо на 128, либо на 255 (что, по-видимому, является обычной практикой). Оно выводится в виде отрицательного значения в формате '-NUM'.
СПИСОК ДОСТУПНЫХ МЕТОДОВ
В общем, конкретный метод трассировки может быть выбран с помощью опции -M имя, но у большинства методов есть простые переключатели командной строки (вы можете увидеть их после имени метода, если они есть).
default
Традиционный, древний метод трассировки. Используется по умолчанию.
Пробные пакеты — это UDP-датаграммы с так называемыми «маловероятными» портами назначения. «Маловероятный» порт первого пробного пакета — 33434, затем для каждого следующего пробного пакета он увеличивается на единицу. Поскольку предполагается, что эти порты не используются, хост назначения обычно возвращает «icmp unreach port» в качестве окончательного ответа. (Никто не знает, что произойдет, если какое-либо приложение будет прослушивать эти порты).
Этот метод разрешен для непривилегированных пользователей.
icmp -I
Самый распространенный метод на данный момент, который использует ICMP-пакеты эхо для проб. Если вы можете ping(8) хост назначения, то ICMP-трассировка также применима.
Этот метод может быть разрешен для непривилегированных пользователей, начиная с ядра 3.0 (для IPv4, для IPv6 — начиная с версии 11, которая поддерживает новые сокеты dgram ICMP или «ping»). Чтобы разрешить такие сокеты, системный администратор должен предоставить диапазон sysctl net/ipv4/ping_group_range, соответствующий любой группе пользователя. Опции:
raw Использовать только необработанные сокеты (традиционный способ).
Этот способ сначала используется по умолчанию (для совместимости), затем в качестве резервного варианта используются новые сокеты dgram ICMP.
dgram Использовать только сокеты dgram ICMP.
tcp -T
Хорошо известный современный метод, предназначенный для обхода брандмауэров. Использует постоянный порт назначения (по умолчанию — 80, http).
Если в сетевом пути присутствуют какие-либо фильтры, то, скорее всего, любые «маловероятные» UDP-порты (как в случае метода default) или даже ICMP-эхо-запросы (как в случае icmp) будут отфильтрованы, и вся трассировка просто остановится на таком брандмауэре. Чтобы обойти сетевой фильтр, необходимо использовать только разрешенные комбинации протокола/порта. Если мы выполняем трассировку, скажем, почтового сервера, то, скорее всего, -T -p 25 сможет достичь его, даже если -I не сможет.
Этот метод использует хорошо известную технику «полуоткрытого соединения», которая не позволяет приложениям на хосте назначения видеть наши пробные пакеты. Обычно отправляется TCP SYN. Для портов, которые не прослушиваются, мы получаем TCP RESET, и все сделано. Для активных прослушиваемых портов мы получаем TCP SYN+ACK, но отвечаем TCP RESET (вместо ожидаемого TCP ACK), таким образом, удаленное TCP-соединение прерывается, даже не уведомляя об этом приложение.
Для метода TCP существует несколько опций:
syn,ack,fin,rst,psh,urg,ece,cwr
Устанавливает указанные флаги TCP для пробного пакета в любой комбинации.
flags=num
Устанавливает поле флагов в заголовке TCP точно равным num.
ecn Отправляет пакет SYN с флагами TCP ECE и CWR (для явного уведомления о перегрузке, RFC3168).
sack,timestamps,window_scaling
Использует соответствующую опцию заголовка TCP в исходящем пробном пакете.
sysctl Использовать текущие настройки sysctl (/proc/sys/net/*) для параметров заголовка TCP выше и ECN.
Всегда устанавливается по умолчанию, если не указано иное.
fastopen
Использовать опцию TCP fastopen (при SYN) для первоначального согласования cookie.
mss=[num]
Использовать значение num (или без изменений) для опции maxseg в заголовке TCP (при SYN) и определить ее
ограничение по пути трассировки. Новое измененное значение mss выводится один раз в формате M=NUM
при первом зонде, на котором оно было обнаружено. Обратите внимание, что некоторые маршрутизаторы могут возвращать слишком короткий
исходный фрагмент в сообщении об истечении времени, что делает проверку невозможной. Кроме того,
ответы могут поступать в другом порядке. Все это может привести к более позднему отображению отчета (использование -N 1 может помочь для порядка).
info Выводить TCP-флаги и поддерживаемые опции окончательных TCP-ответов, когда целевой хост
достигнут. Позволяет определить, прослушивает ли приложение порт и другие полезные вещи. Поддерживаемые опции TCP — все те, которые можно задать с помощью -T -O, то есть mss, sack, timestamps, window_scaling и fastopen, с аналогичным форматом вывода (значение для mss и просто наличие для остальных).
По умолчанию используются опции syn, sysctl.
tcpconn
Первоначальная реализация TCP-метода, простое использование вызова connect(2), который выполняет полное открытие TCP-сессии. Не рекомендуется для нормального использования, потому что целевое приложение всегда подвергается воздействию (и может быть сбито с толку).
udp -U
Использовать UDP-датаграмму с постоянным портом назначения (по умолчанию 53, DNS).
Предназначен для обхода брандмауэра.
Обратите внимание, что, в отличие от TCP-метода, соответствующее приложение на конечном хосте всегда получает наши зонды (со случайными данными), и большинство из них могут легко быть сбиты с толку. В большинстве случаев оно не будет отвечать на наши пакеты, поэтому мы никогда не увидим последний узел в трассировке. (К счастью, похоже, что по крайней мере DNS-серверы отвечают чем-то вроде «я сердитый»).
Этот метод разрешен для непривилегированных пользователей.
udplite -UL
Использовать UDP-lite датаграмму для зондов (с постоянным портом назначения, по умолчанию 53).
Этот метод разрешен для непривилегированных пользователей.
Опции:
coverage=num
Установите покрытие отправки UDP-lite на num.
dccp -D
Использовать пакеты DCCP Request для зондов (RFC4340).
Этот метод использует ту же «технику полуоткрытого соединения», что и для TCP. Порт назначения по умолчанию — 3343.
Опции:
service=num
Установите код службы DCCP на num (по умолчанию 1885957735).
raw -P proto
Отправлять необработанный пакет протокола proto.
Не используются заголовки, специфичные для протокола, только заголовок IP.
Предполагает -N 1 -w 5.
Опции:
protocol=proto
Использовать IP-протокол proto (по умолчанию 253).
ПРИМЕЧАНИЯ
Чтобы ускорить работу, обычно отправляется несколько зондов одновременно. С другой стороны, это создает «шторм пакетов», особенно в направлении ответа. Маршрутизаторы могут ограничивать скорость ответов ICMP, и некоторые ответы могут быть потеряны. Чтобы этого избежать, уменьшите количество одновременных зондов или даже установите его в 1 (как в первоначальной реализации traceroute), т. е. -N 1.
Конечный (целевой) хост может отбрасывать часть одновременных запросов и даже отвечать только на последние из них. Это может приводить к появлению дополнительных "похожих на истекшие" хопов вблизи конечного хопа. Мы используем интеллектуальный алгоритм для автоматического обнаружения такой ситуации, но если он не поможет в вашем случае, просто используйте опцию -N 1.
Для еще большей стабильности вы можете замедлить работу программы с помощью опции -z, например, используйте -z 5 для полусекундной паузы между запросами.
Чтобы избежать лишнего ожидания, мы используем адаптивный алгоритм для тайм-аутов (см. опцию -w для получения дополнительной информации). Это может приводить к преждевременному истечению времени (особенно когда время отклика меняется) и выводу "*" вместо времени. В таком случае отключите этот алгоритм, указав опцию -w с желаемым значением тайм-аута (например, -w 5).
Если некоторые хопы не отвечают ни одним из методов, последней возможностью получить какую-либо информацию является использование команды ping -R (IPv4 и только для ближайших 8 хопов).