Содержание

Мониторинг сети в Linux (ping, traceroute, mtr)

Существует несколько хороших утилит, позволяющих искать неисправности в сети на уровне TCP/IP. Большинство из них выдает низкоуровневую информацию, поэтому для того чтобы пользоваться ими, нужно хорошо понимать принципы работы протоколов TCP/IP и маршрутизации. В этой статье мы рассмотрим основные инструменты поиска неисправностей в сети: утилитами ping, traceroute и mtr.

Утилита ping

Проверка доступности компьютера

Утилита ping предназначена для того, чтобы при помощи отправки ICMP пакетов убедиться в работоспособности хоста. Команда ping посылает запрос (ICMP ECHO_REQUEST) конкретному компьютеру и фиксирует поступающие ответы (ICMP ECHO_RESPONSE). Её можно применять для работоспособности отдельных компьютеров и сегментов сети. В обработке ее запроса участвуют таблицы маршрутизации, физические компоненты сетей и сетевые шлюзы, поэтому для достижения успешного результата сеть должна быть в более или менее рабочем состоянии. Если команда не работает, можно быть совершенно уверенным в том, что более сложные средства тем более не функционируют. Однако это правило неприменимо в сетях, где брандмауэры блокируют эхо-запросы ICMP. Убедитесь в том, что брандмауэр не препятствует работе команды ping, прежде чем подозревать, что зондируемый компьютер игнорирует эту команду. В конце концов, отключите на короткое время брандмауэр для проверки работоспособности сети.

Если не задан аргумент «число пакетов», команда ping работает в бесконечном цикле. Чтобы прервать работу команды, нужно нажать специальную клавиатурную комбинацию <Ctrl+C>.

Например, пропингуем neoserver.ru (это имя хоста):

$ ping neoserver.ru
PING neoserver.ru (217.150.193.198) 56(84) bytes of data.
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=1 ttl=62 time=0.764 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=2 ttl=62 time=0.472 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=3 ttl=62 time=0.493 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=4 ttl=62 time=0.484 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=5 ttl=62 time=0.505 ms
^C
--- neoserver.ru ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4078ms
rtt min/avg/max/mdev = 0.472/0.543/0.764/0.113 ms

Информация о компьютере neoserver.ru включает его IP-адрес, порядковый номер ответного ICMP-пакета и полное время прохождения пакета. Полученные результаты свидетельствуют о том, что компьютер neoserer.ru работает и подключен к сети.

Min - минимальное время ответа хоста, кторому был отправлен запрос.

Avg - среднее время ответа хоста, кторому был отправлен запрос

Max - максимальное время ответа хоста, кторому был отправлен запрос.

Ещё вы увидите TTL - определяет максимальное количество хопов (то есть прыжок, участок между маршрутизаторами), которые пакет может пройти. Наличие этого параметра не позволяет пакету бесконечно ходить по сети.

В ОС Linux, как уже было сказано выше, команда ping без дополнительных параметров будет пинговать заданный хост бесконечно. Чтобы отправить, например, 10 запросов, необходимо добавить ключ :

$ ping -c 10 neoserver.ru
PING neoserver.ru (217.150.193.198) 56(84) bytes of data.
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=1 ttl=62 time=0.682 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=2 ttl=62 time=0.532 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=3 ttl=62 time=0.494 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=4 ttl=62 time=0.535 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=5 ttl=62 time=0.485 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=6 ttl=62 time=0.948 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=7 ttl=62 time=0.569 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=8 ttl=62 time=0.589 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=9 ttl=62 time=0.548 ms
64 bytes from www.neoserver.ru (217.150.193.198): icmp_seq=10 ttl=62 time=0.568 ms

--- neoserver.ru ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9151ms
rtt min/avg/max/mdev = 0.485/0.595/0.948/0.128 ms

В итоге, мы видим, что было отпралено 10 запросов и выведен результат. 

Другие примеры задействования разын ключей:

Не резолвить имена адресов, выводить только ip-адреса 

$ ping -n neoserver.ru

Завершение работы ping по заданному времени (тут 5 секунд)

$ ping -w 5 neoserver.ru

Установить размер отправляемых пакетов в 1000 байт 

ping -s 1000 neoserver.ru

Увеличить интервал времени пинга на 3 секунды

ping -i 3 neoserver.ru

 

Утилита traceroute 

Каждый пакет проходит на своем пути определенное количество узлов, пока достигнет своей цели. И, как мы уже знаем, каждый пакет имеет свое время жизни. Это количество узлов, которые может пройти пакет перед тем, как он будет уничтожен. Этот параметр записывается в заголовке TTL, каждый маршрутизатор, через который будет проходить пакет уменьшает его на единицу. При TTL=0 пакет уничтожается, а отправителю отсылается сообщение Time Exceeded.

Команда traceroute linux использует UDP пакеты. Она отправляет пакет с TTL=1 и смотрит адрес ответившего узла, дальше TTL=2, TTL=3 и так пока не достигнет цели. Каждый раз отправляется по три пакета и для каждого из них измеряется время прохождения. Пакет отправляется на случайный порт, который, скорее всего, не занят. Когда утилита 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.

Для примера, выпоним трасировку к ресурсу yandex.ru:

$ traceroute yandex.ru
traceroute to yandex.ru (5.255.255.77), 30 hops max, 60 byte packets
 1  10.1.1.1 (10.1.1.1)  15.702 ms  17.697 ms  18.735 ms
 2  cat6509-vlan2.neocomms.ru (217.150.192.161)  4.262 ms  4.981 ms  6.249 ms
 3  cerber.neocomms.ru (217.150.192.49)  5.599 ms  6.904 ms  7.676 ms
 4  cat6509-vlan17.neocomms.ru (217.150.192.6)  8.367 ms  9.311 ms  10.586 ms
 5  jrm7i-ge-1-3-vlan17.neocomms.ru (217.150.192.1)  11.217 ms  12.124 ms  13.815 ms
 6  dante.yndx.net (195.208.208.93)  28.355 ms  24.533 ms  24.137 ms
 7  yandex.ru (5.255.255.77)  13.600 ms  13.294 ms  12.941 ms

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

Иногда, вместо одного узла вы можете видеть звездочки. Это значит, что шлюзы либо не высылают нам ICMP с сообщением «time exceeded», либо у их сообщений слишком маленький TTL и оно нас не достигает. В точности нельзя сказать, что происходит на самом деле, но ясно, что по какой-то причине хост не захотел нам отвечать:

$ traceroute neoserver.ru 
traceroute to neoserver.ru (217.150.193.198), 30 hops max, 60 byte packets
 1  core1.trkgok.net (91.207.88.1)  0.706 ms  0.745 ms  0.749 ms
 2  rumba.trkgok.net (91.207.88.101)  0.309 ms  0.306 ms  0.341 ms
 3  edgein.trkgok.net (91.207.88.113)  1.177 ms * *
 4  * * *
 5  * * *
 6  * kv-kh.ett.ua (80.93.127.141)  10.123 ms  10.333 ms
 7  fiord.net (62.140.239.185)  379.003 ms  378.168 ms  378.121 ms
 8  kiev-nt-b1-ae8-vlan3100.fiord.net (62.140.245.156)  9.381 ms  9.288 ms  9.441 ms
 9  msk-m9-b1-ae16-vlan3877.fiord.net (80.77.167.16)  19.811 ms  19.819 ms  19.744 ms
10  rim2000-gw.fiord.net (62.140.245.190)  41.311 ms  41.385 ms  41.128 ms
11  cerber-eth0-vlan17.neocomms.ru (217.150.192.3)  41.563 ms  41.941 ms  41.590 ms
12  cat6509-vlan27.neocomms.ru (217.150.192.56)  42.062 ms  41.732 ms  41.824 ms
13  neoserver.ru (217.150.193.198)  41.776 ms  41.670 ms  41.717 ms

Бывает, что трассировка с помощью UDP не работает, это может произойти потому, что фаервол блокирует все лишние пакеты. Можно воспользоваться ICMP с помощью опции -I:

$ traceroute neoserver.ru 
traceroute to neoserver.ru (217.150.193.198), 30 hops max, 60 byte packets
 1  core1.trkgok.net (91.207.88.1)  0.746 ms  0.732 ms  0.738 ms
 2  rumba.trkgok.net (91.207.88.101)  0.199 ms  0.209 ms  0.222 ms
 3  edgein.trkgok.net (91.207.88.113)  1.706 ms  2.341 ms  3.009 ms
 4  * * *
 5  80.93.125.173.ett.ua (80.93.125.173)  5.343 ms  3.689 ms  3.684 ms
 6  kv-kh.ett.ua (80.93.127.141)  9.459 ms  10.023 ms  9.435 ms
 7  fiord.net (62.140.239.185)  27.783 ms  26.769 ms  26.752 ms
 8  kiev-nt-b1-ae8-vlan3100.fiord.net (62.140.245.156)  9.440 ms  10.050 ms  9.931 ms
 9  msk-m9-b1-ae16-vlan3877.fiord.net (80.77.167.16)  19.906 ms  20.503 ms  20.519 ms
10  rim2000-gw.fiord.net (62.140.245.190)  42.009 ms  41.296 ms  41.687 ms
11  cerber-eth0-vlan17.neocomms.ru (217.150.192.3)  41.662 ms  41.676 ms  41.480 ms
12  cat6509-vlan27.neocomms.ru (217.150.192.56)  58.127 ms  48.170 ms  47.025 ms
13  * * *
14  * * *
15  * * *
16  * * *
17  * * *
18  * * *
19  * * *
20  * * *
21  * * *
$ sudo traceroute -I neoserver.ru 
traceroute to neoserver.ru (217.150.193.198), 30 hops max, 60 byte packets
 1  core1.trkgok.net (91.207.88.1)  0.706 ms  0.745 ms  0.749 ms
 2  rumba.trkgok.net (91.207.88.101)  0.309 ms  0.306 ms  0.341 ms
 3  edgein.trkgok.net (91.207.88.113)  1.177 ms * *
 4  * * *
 5  * * *
 6  * kv-kh.ett.ua (80.93.127.141)  10.123 ms  10.333 ms
 7  fiord.net (62.140.239.185)  379.003 ms  378.168 ms  378.121 ms
 8  kiev-nt-b1-ae8-vlan3100.fiord.net (62.140.245.156)  9.381 ms  9.288 ms  9.441 ms
 9  msk-m9-b1-ae16-vlan3877.fiord.net (80.77.167.16)  19.811 ms  19.819 ms  19.744 ms
10  rim2000-gw.fiord.net (62.140.245.190)  41.311 ms  41.385 ms  41.128 ms
11  cerber-eth0-vlan17.neocomms.ru (217.150.192.3)  41.563 ms  41.941 ms  41.590 ms
12  cat6509-vlan27.neocomms.ru (217.150.192.56)  42.062 ms  41.732 ms  41.824 ms
13  neoserver.ru (217.150.193.198)  41.776 ms  41.670 ms  41.717 ms

 Рассмотреных выше простых примеров, вполне достаточно для первичной диагностики сети как для обычныз пользователей, так и для начинающих администраторов.

Утилита MTR

MTR – это альтернатива программе traceroute. Объединяя функции ping и traceroute, mtr позволяет постоянно опрашивать удаленный сервер и отслеживать изменения задержки и производительности с течением времени.

Синтаксис утилиты также несложный:

$ mtr опции адрес_узла

Например:

$ mtr neoserver.ru

mtr_1_0.png

Вывод похож на traceroute, но mtr имеет существенное преимущество – ее вывод постоянно обновляется. Это позволяет собирать средние показатели, а также отслеживать тенденции и изменения производительности сети. Как и с утилитой ping, mtr будет работать бесконечно. Чтобы прервать работу команды, нужно нажать специальную клавиатурную комбинацию <Ctrl+C>.

Пояснение вывода:

host — имя хоста;
Loss% — процент потерь пакетов;
Snt — количество отправленных пакетов;
Last — время задержки последнего отправленного пакета в миллисекундах;
Avg — среднее время задержки;
Best — минимальное время задержки;
Wrst — максимальное время задержки;
StDev — среднеквадратичное отклонение времени задержки;

Полезные опции:

-c <число> - Количество циклов проверки (количество отправленных пакетов по сути);
-r - Режим отчета. Программа выполнит указанное при помощи параметра -c количество циклов, выведет отчет и завершит свою работу;
-w - Режим расширенного отчета. Результат такой же, как и при использовании опции -r, но длинные имена хостов обрезаться не будут;
-s <количество-байт> - Установить размер пакетов для отправки; 
-n - Не использовать DNS для разрешения имен хостов и отображать вместо них IP-адреса;
-o «список-полей» -	Отображать только указанные поля и в таком порядке, в котором они были указаны;
-p - Выводить информацию построчно, без перерисовки экрана, с разделением полей пробелом. Этот формат удобен, если вы используете какую-то дополнительную программу-парсер или скрипт для анализа, которому передаются данные.
-a <IP-адрес> -	Указать адрес интерфейса, с которого будут отправляться пакеты;
-i <число-секунд> - Интервал между отправляемыми запросами;
-u	Использовать протокол UDP для отправки пакетов;
-4	Использовать только IPv4;
-6	Использовать только IPv6.