тестирования сети в Линукс
Эта заметка выросла из шпаргалки для самого себя. Мне по работе приходится отлавливать баги в сети. Как проверить скорость в 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
Несколько полезных команд, позволяющих быстро выполнить диагностику сайта.
Ping
Это самый простой вариант:
$ ping pctuner.club PING pctuner.club (31.184.252.207) 56(84) bytes of data. 64 bytes from d1mon.com (31.184.252.207): icmp_seq=1 ttl=55 time=36.1 ms 64 bytes from d1mon.com (31.184.252.207): icmp_seq=2 ttl=55 time=37.3 ms 64 bytes from d1mon.com (31.184.252.207): icmp_seq=3 ttl=55 time=36.9 ms 64 bytes from d1mon.com (31.184.252.207): icmp_seq=4 ttl=55 time=36.2 ms ^C --- pctuner.club ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3004ms rtt min/avg/max/mdev = 36.136/36.670/37.333/0.509 ms
Показывает не только доступность сайта, но и собирает статистику, насколько связь с сайтом качественная. Статистика собирается до тех пор, пока вы сами это не остановите, «Ctrl+C».
Traceroute
Если ответы от сайта приходят с заметной задержкой или иногда не приходят вовсе, то бывает полезно посмотреть весь маршрут. Утилита traceroute — аналог tracert в Windows.
$ traceroute pctuner.club traceroute to pctuner.club (31.184.252.207), 30 hops max, 60 byte packets 1 192.168.254.1 (192.168.254.1) 5.119 ms 7.653 ms 8.916 ms 2 192.168.249.1 (192.168.249.1) 7.302 ms 8.334 ms 10.421 ms 3 212.46.230.25 (212.46.230.25) 11.045 ms 12.726 ms 12.731 ms 4 pe26.Moscow.gldn.net (79.104.225.59) 28.446 ms pe26.Moscow.gldn.net (79.104.225.57) 29.417 ms 30.821 ms 5 mx.vicigroup.ru (194.186.124.146) 35.698 ms 35.692 ms 35.666 ms 6 80-64-100-81.rascom.as20764.net (80.64.100.81) 39.825 ms 80-64-100-97.rascom.as20764.net (80.64.100.97) 36.661 ms 80-64-100-82.rascom.as20764.net (80.64.100.82) 32.558 ms 7 81-27-252-147.rascom.as20764.net (81.27.252.147) 35.306 ms 46.628 ms 37.286 ms 8 188.93.17.137 (188.93.17.137) 36.900 ms 34.609 ms 33.725 ms 9 d1mon.com (31.184.252.207) 42.136 ms 34.529 ms 34.517 ms
Установка в Ubuntu/Debian, если утилиты еще нет в системе:
sudo apt install inetutils-traceroute
cURL
Позволяет не только проверить доступность, но и получить код состояния:
$ curl -Is https://pctuner.club | head -n 1 HTTP/2 200
$ curl -Is http://pctuner.club | head -n 1 HTTP/1.1 301 Moved Permanently
Аналогично на сайте можно проверить доступность страницы или файла:
$ curl -Is https://pctuner.club/robots.txt | head -n 1 HTTP/2 200
Сетевые команды
Примечание: Обратите внимение, что это не официальная документация, а попытка начинающего админа объяснить материал начинающим админам.
При миграции с Windows на Linux первое время непривычно пользоваться системой из-за отличающихся сетевых команд. На данной странице будет список аналогов Win-Lin команд.
Команда Win | Команда Lin | Назначение | Пакет | Использование в Linux |
---|---|---|---|---|
ping | ping | Проверка доступности сети и ее качества | iputils | ping ya.ru ping 8.8.8.8 |
tracert | tracepath | Определение маршрута сетевых пакетов | iputils | tracepath ya.ru tracepath 8.8.8.8 |
traceroute | traceroute | traceroute ya.ru traceroute 8.8.8.8 | ||
arp -a | arp | Просмотр ARP-таблицы | net-tools | arp arp -a |
ipconfig | ifconfig | Просмотр IP-адресов сетевых карт | net-tools | ifconfig |
ip | iproute2 | ip a | ||
nslookup | nslookup | Просмотр IP-адреса по доменному имени | bind-utils | nslookup ya.ru |
host | host ya.ru | |||
echo %COMPUTERNAME% | hostname | Просмотр сетевого имени компьютера | coreutils | hostname |
netstat | netstat | Просмотр активных сетевых соединений | net-tools | netstat -a |
whois | Получение информации об IP-адресе и домене | whois | whois ya.ru | |
route print | route | Просмотр таблицы маршрутизации | net-tools | route -n |
ip | iproute2 | ip route show ip r ip neighbour |