тестирования сети в Линукс
Эта заметка выросла из шпаргалки для самого себя. Мне по работе приходится отлавливать баги в сети. Как проверить скорость в VPN-туннеле? Почему сервер не пингуется? Или пингуется, но не доступен. Кто забил весь канал торрентами? Где пропадают пакеты? Почтовый клиент выдает непонятную ошибку, что произошло на самом деле? Эти и многие другие вопросы периодически возникают у любого пользователя. Под катом описание программ входящих во все современные дистрибутивы, начиная от пинга и до таких экзотических как ngrep. А так же картинками, если картинками можно назвать, копии дампа с консоли.
ping
rt94:~# ping -n -i 0.2 -s 512 -I eth0 ya.ru
PING ya.ru (93.158.134.8) from 10.0.94.2 eth0: 512(540) bytes of data.
520 bytes from 93.158.134.8: icmp_seq=1 ttl=59 time=17.5 ms
520 bytes from 93.158.134.8: icmp_seq=2 ttl=59 time=15.0 ms
520 bytes from 93.158.134.8: icmp_seq=3 ttl=59 time=14.7 ms
3/3 packets, 0% loss, min/avg/ewma/max = 14.757/15.777/16.899/17.512 ms
520 bytes from 93.158.134.8: icmp_seq=4 ttl=59 time=14.7 ms
^C
Ключ -n означает, что надо выводить IP адреса вместо доменных имен, это полезно если пингуете по IP, тогда не будет тратится время на разрешение доменого имя, а еще, если DNS сервер не доступен это приведет к паузе в несколько секунд. Ключ -i задает интервал между отправкой пакетов, а -s размер пакета. Размер не может быть больше, чем MTU интерфейса. При помощи комбинации ключей -i и -s можно загрузить канал на любую ширину. -I задает имя интерфейса, через который будет отправлен пакет, полезно, если надо обойти таблицу маршрутизации. Чтобы вывести статистику, как я сделал я после третьего пакета, надо послать пингу сигнал SIGQUIT, с клавиатуры это делается Cntr+\
traceroute
rt94:~#traceroute -N 16 -q 1 -A ya.ru
traceroute to ya.ru (77.88.21.8), 30 hops max, 60 byte packets
1 10.94.171.1 (10.94.171.1) [AS65534] 1.402 ms
2 1.32.108.213.hl.ru (213.108.32.1) [AS47333] 1.618 ms
3 94.122.dsl.westcall.net (195.177.122.94) [AS20485/AS25408] 2.859 ms
4 b0-152.mrouter.r.westcall.net (84.52.109.161) [AS25408] 3.021 ms
5 GW-Yandex.retn.net (87.245.250.102) [AS9002] 3.266 ms
6 aluminium-vlan901.yandex.net (77.88.56.111) [AS13238] 14.037 ms
7 gallium-vlan901.yandex.net (77.88.56.126) [AS13238] 16.517 ms
8 hummer-vlan2.yandex.net (87.250.228.136) [AS13238] 16.443 ms
9 ya.ru (77.88.21.8) [AS13238] 15.809 ms
traceroute показывает маршрут до удаленного хоста. По умолчанию он работает довольно медленно, так как опрашивает каждый роутер на пути пакета, по очереди и по три раза. Вы видите три времени ответа рядом с каждым хостом или три звездочки, если он не отвечает. Но traceroute можно ускорить. Ключ -N показывает сколько шагов пути пакета, они называются хопами, найти за 1 цикл, а -q количество запросов, которые будут отправлены к хосту. Ключ -A показывает номер автономной системы. Автономная система — блок IP сетей, выделенных одному оператору.
mtr
rt94:~#mtr ya.ru
Приведет к такому экрану.
mtr это помесь пинга с трейсроутом. Наглядно видно, где проседает канал. В дебиан-образных дистрибутивах консольная версия ставится из пакета mtr-tiny
tcpdump
Иногда полезно глубже заглянуть, что же происходит в сети. Какие пакеты приходят и уходят. Например, чтобы удостовериться, что пакеты все таки уходят, а не блокируются фаерволом.
Вот что происходит при команде
В соседнем терминале запущен tcpdump
%sudo tcpdump -ni eth1 udp and port 53 and host 10.0.1.1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 96 bytes
13:09:39.038766 IP 10.94.171.10.41440 > 10.0.1.1.53: 24708+ A? ya.ru. (23)
13:09:39.040403 IP 10.0.1.1.53 > 10.94.171.10.41440: 24708 3/2/0 A 77.88.21.8,[|domain]
Расшифровываю вывод. С хоста 10.94.171.10 порт 41440 на 10.0.1.1 порт 53 пошел запрос А записи для адреса ya.ru. 53 порт это протокол DNS следующая строчка это ответ DNS сервера, по адресу 10.0.1.1
Не смотря на название, tcpdump знает множество сетевых протоколов. Ключ -i показывает какой интерфейс будем слушать, -n не запрашивать имена в DNS для IP адресов. Дальше в командной строке идет описание какие именно пакеты мы будем отлавливать. Здесь я не буду описывать команды фильтрации — их множество, остановлюсь только на возможностях. И так можно выбирать с какого и на какой хост идет пакет, с какого и на какой порт и даже диапазон портов. Можно группировать фильтры при помощи скобок и логических слов and, or, not. Выбирать протоколы icmp, arp, tcp, udp подробности в мане.
ngrep
Несмотря на всю мощь иногда возможностей tcpdump не хватает, например посмотреть, что происходит внутри пакетов, особенно это актуально для текстовых протоколов, таких как smtp, imap, SIP и тд. Тут на помощь приходит ngrep.
Например, чтобы отловить пакеты идущие с/или на порт 5060, в которых присутствует слово NOTIFY
rt94:~#ngrep -W byline -d eth0 NOTIFY port 5060
interface: eth0 (213.108.32.94/255.255.255.255)
filter: (ip or ip6) and ( port 5060 )
match: NOTIFY
#
U 213.108.33.128:5060 -> 85.114.2.44:5060
NOTIFY sip:85.114.2.44 SIP/2.0.
Via: SIP/2.0/UDP 192.168.1.2:5060;branch=z9hG4bK-2c32804.
From: 8126221842 ;tag=4751f3b994a4aca8o0.
To: .
Call-ID: a85b76bd-dc9f6574@192.168.1.2.
CSeq: 22858 NOTIFY.
Max-Forwards: 70.
Event: keep-alive.
User-Agent: Linksys/PAP2T-5.1.6(LS).
Content-Length: 0.
Ключ -W byline форматирует вывод по знакам переноса строки внутри пакета. Это очень удобно для почтовых протоколов или SIP, как в примере. Строка фильтра пакетов формируется так же, как и в tcpdump. Если не указывать какую подстроку ищем, то ngrep будет дампить все подходящие по условую пакеты. Если внутри пакета нет текстовой информации, тогда он обозначается решеткой (#)
И несколько простых утилиток, про которые нужно знать, что они существуют.
Как узнать, через какую запись в таблице маршрутизации пойдет трафик на IP адрес.
rt94:~# ip route get 10.94.171.10
10.94.171.10 dev eth1.173 src 10.94.171.1
cache mtu 1500 advmss 1460 hoplimit 64
Как посмотреть кто или что забивает канал?
Для этого есть утилита iptraf c интерфейсом основанным на ncurses. При запуске без параметров выводит меню.
Для того, чтобы посмотреть суммарную статистику по интерфейсу
iptraf -d eth0
Для статистики по соединениям
iptraf -i eth0
Например у вас есть VPN туннель. Как проверить его ширину? Самый простой способ это утилита iperf. На одном хосте запускаем ее с ключем -s это будет сервер, который повиснет по умолчанию на порт 5001. С другой стороны запускаем с единственным параметром — адресом нашего сервера.
mii-tool
rt94:~# mii-tool eth0
eth0: negotiated 100baseTx-FD flow-control, link ok
Утилитка из пакета net-tools. Показывает скорость физлинка. При ее помощи можно выловить проблему, когда две сетевые карточки не могут автоматически договориться о скорости и в результате будет что-то типа 10 мбит полудуплекс. Редкая проблема, но до сих пор встречается.
За рамками обзора остались nmap и hping. Жду в камментах ссылки на другие полезные программы. Может имеет смысл перенести в какой-нибудь подходящий блог?
Команды Linux для тестирования подключения и скорости передачи данных
Вот несколько команд Linux, которые могут проверять скорость соединения, анализировать задержки и проверять, доступны ли другие системы.
Существует довольно много инструментов, которые могут помочь проверить ваше подключение в командной строке Linux. В этой статье мы рассмотрим ряд команд, которые могут помочь оценить скорость вашего соединения, проверить, можете ли вы связаться с другими системами, проанализировать задержки соединения и определить, доступны ли определенные службы.
Ping
Команда ping-это самая простая и наиболее часто используемая команда для выполнения базового тестирования подключения. Он посылает пакеты, называемые эхо-запросами, и это пакеты, которые запрашивают ответ. Команда ищет ответы и отображает их вместе с тем, сколько времени занял каждый ответ, а затем сообщает, какой процент запросов был получен.
Время отклика будет в значительной степени зависеть от того, сколько маршрутизаторов должны пересечь запросы и перегружена ли ваша сеть. Пингинг локальной системы может выглядеть так. Обратите внимание на небольшое количество миллисекунд, необходимых для каждого ответа, и потерю пакетов в 0%.
В системах Linux эхо-запросы будут продолжаться, пока вы не наберете ^c (CTRL+C), чтобы их остановить. Некоторые системы, включая Windows, выдают четыре эхо-запроса, а затем останавливаются самостоятельно. Удаленная система будет реагировать значительно дольше. Отсутствие потери пакетов — это всегда хороший знак, и даже когда вы проверяете связь с удаленной системой, вы, как правило, ожидаете получить ответ от нее, если только не возникнет проблема.
Команда ping обеспечивает простой способ проверки сетевого подключения для домашней сети. Отправляйте запросы в общедоступную систему, и вы должны ожидать 0% потери пакетов. Если у вас возникли проблемы, команда ping, скорее всего, покажет значительную потерю пакетов.
Traceroute
Предварительно установите пакет traceroute
Traceroute-это гораздо более сложная команда, поскольку она выполняет серию проверок, чтобы увидеть, сколько времени занимает каждый переход между маршрутизаторами, и сообщает об этом обратно. Если общая проверка занимает много времени, это может означать, что один или два прыжка перегружены. Если сообщенные результаты сводятся к последовательности звездочек, то последний достигнутый маршрутизатор не может ответить на используемый тип пакета (UDP по умолчанию в системах Linux).
Команда traceroute использует хитроумную технику для определения времени каждого прыжка. Он использует параметр времени жизни (TTL), который уменьшается с каждым прыжком, чтобы гарантировать, что каждый маршрутизатор на маршруте в какой-то момент отправит обратно сообщение об ошибке. Это позволяет traceroute сообщать о продолжительности времени между каждым переходом.
Вот пример использования traceroute для доступа к локальной системе (один переход и быстрый ответ):
В следующем примере, команда traceroute пытается связаться с удаленной системой, но не может сообщить о каждом прыжке (те, которые показывают звездочки), потому что маршрутизаторы на некоторых прыжках не отвечают на тип используемого пакета. В этом нет ничего необычного.
По умолчанию максимальное количество переходов для traceroute составляет 30. Обратите внимание, что этот параметр отображается в первой строке вывода. Его можно изменить с помощью аргумента -m (например, traceroute -m 50 merionet.ru).
Netcat
Предварительно установите пакет netcat
Команда netcat-это многофункциональная сетевая утилита для записи данных по сети из командной строки, но в форме, показанной ниже, позволяет просто определить, можно ли подключиться к определенной службе. Первоначально он был написан для nmap (the network mapper).
Отправляя нулевые байты (параметр -z) на конкретный порт в удаленной системе, мы можем определить, доступна ли соответствующая служба, не прибегая к фактическому использованию соединения.
Как вы, наверное, заметили, команду netcat можно вызвать с помощью nc или ncat.
Speedtest
Предварительно установите пакет speedtest-cli
Инструмент speedtest проверяет скорость вашего соединения с вашим интернет-провайдером. Обратите внимание, что скорость загрузки нередко бывает значительно ниже скорости выгрузки (отдачи). Интернет-провайдеры понимают, что большинство людей загружают значительно больше данных, чем отправляют. Инструмент speedtest выделит любые различия. В приведенном ниже тесте скорость загрузки не намного превышает скорость загрузки.
Результаты команд будут несколько отличаться от теста к тесту.
Вы также можете использовать утилиту speedtest через браузер, зайдя на сайт speedtest.net.
nethogs
Команда methods использует совершенно иной подход, чем команды, описанные выше. Он группирует использование полосы пропускания по процессам, чтобы помочь вам точно определить конкретные процессы, которые могут вызвать замедление сетевого трафика. Другими словами, он помогает вам точно определить «net hogs«.