Утилита ping позволяет только определить наличие проблемы, что узел не отвечает, но как узнать где обрывается соединение? Для этого применяется утилита traceroure. В этой небольшой инструкции мы рассмотрим как пользоваться traceroute linux, как понимать ее вывод и определить где же все-таки проблема. Но сначала рассмотрим, как работает traceroute.
Как работает traceroute?
Вы, наверное, уже знаете, что вся информация в сети передается в виде пакетов. Поток данных разбивается специальным программным обеспечением на небольшие пакеты и передается через сеть интернет на целевой узел, а там собирается обратно.
Каждый пакет проходит на своем пути определенное количество узлов, пока достигнет своей цели. Причем, каждый пакет имеет свое время жизни. Это количество узлов, которые может пройти пакет перед тем, как он будет уничтожен. Этот параметр записывается в заголовке TTL, каждый маршрутизатор, через который будет проходить пакет уменьшает его на единицу. При TTL=0 пакет уничтожается, а отправителю отсылается сообщение Time Exceeded.
Команда traceroute linux использует UDP пакеты. Она отправляет пакет с TTL=1 и смотрит адрес ответившего узла, дальше TTL=2, TTL=3 и так пока не достигнет цели. Каждый раз отправляется по три пакета и для каждого из них измеряется время прохождения. Пакет отправляется на случайный порт, который, скорее всего, не занят. Когда утилита traceroute получает сообщение от целевого узла о том, что порт недоступен трассировка считается завершенной.
Утилита Traceroute
Перед тем как перейти к примерам работы с утилитой давайте рассмотрим ее синтаксис и основные опции. Синтаксис вызова очень прост:
$ traceroute опции адрес_узла
В качестве адреса может использоваться ip адрес или доменное имя. Рассмотрим основные опции:
- -4 или -6 - использовать ipv4 или ipv6 протокол;
- -I - использовать ICMP пакеты вместо UDP;
- -T - использовать TCP пакеты вместо UDP;
- -F - не фрагментировать пакеты;
- -f - указать TTL с которого нужно начать;
- -g - передавать пакет через указанный шлюз;
- -i - передавать пакет через указанный интерфейс;
- -m - максимальное количество узлов, через которые пройдет пакет;
- -q - количество пакетов, отправляемых за раз, по умолчанию три;
- -n - не узнавать доменные имена;
- -p - указать порт вместо порта по умолчанию;
- -w - установить время ожидания ответа от узла, по умолчанию полсекунды;
- -r - использовать другой роутер вместо того, что указанный в таблице маршрутизации;
- -z - минимальный интервал между пакетами;
- -U - использовать UDP с увеличением номера порта;
- -UL - использовать протокол UDPLITE;
- -D - использовать протокол DCCP;
- --mtu - указать размер пакета;
- -P - протокол, доступны такие значения: raw, dccp, udplite, udp, tcpconn, tcp, icmp.
Это не все опции утилиты, но все основные, которыми вы будете пользоваться. Дальше перейдем практике того, как выполняется трассировка сети Linux.
Примеры трассировки сети в Linux
Например, выполним трассировку до сервера losst.ru:
$ sudo traceroute losst.ru
Как видите, пакет прошел через 6 узлов перед тем, как дойти до цели. На каждый узел отправлялось по три пакета и для каждого из них было засечено время прохождения. И если на одном из узлов возникнет проблема, теперь вы будете знать на каком.
У вас, наверное, возник вопрос, почему время прохождения для некоторых узлов такое долгое? Ведь если выполнить ping, то общее время будет намного меньше. Дело в том, что время засекается для пути пакета туда и обратно. От запроса до ответа. Это раз, но еще нужно учитывать что маршрутизаторы дают высший приоритет для приходящих пакетов, когда для сервисных задержки могут быть более длинными.
Еще, вместо одного узла вы можете видеть звездочки traceroute. Это еще не значит, что он не работает. Это означает что всего лишь он не захотел нам отвечать. Давайте проверим еще что-нибудь, например, публичный DNS google:
$ sudo traceroute 8.8.8.8
Здесь уже больше узлов, и такая же ситуация со звездочками. Если бы на пути к серверу возникла ошибка, мы бы это увидели. Например, узел 195.153.14.1 нам не ответил и мы смогли отследить запрос только до 212.162.26.169.
$ sudo traceroute 195.153.14.1
Иногда трассировка с помощью UDP не работает, это может произойти потому, что фаервол блокирует все лишние пакеты. Мы можем воспользоваться ICMP с помощью опции -I.
$ sudo traceroute history.pl
$ sudo traceroute -I history.pl
Но трассировка может использоваться не только для обнаружения обрыва в цепочке маршрутизаторов. У нее еще есть достаточно интересное применение по исследованию сети. Например, вы можете попытаться определить использование подсетей провайдером. Отправим три запроса на разные адреса:
$ sudo traceroute losst.ru
$ sudo traceroute history.pl
$ sudo traceroute habrahabr.ru
$ sudo traceroute history.pl
$ sudo traceroute habrahabr.ru
Затем сравните выводы этих команд. Вы увидите, что начальные IP адреса одинаковые. Мы можем сделать вывод, что наш роутер 192.168.1.1 подключен к локальной сети провайдера 195.5.8.0/24, которая, в свою очередь, подключена к сети 10.50.50.0/24 откуда уже получает доступ к внешней сети.