10.8. Инструменты Диагностики Сети
Когда какое-либо сетевое приложение не работает как ожидалось, очень важно вникнуть в суть дела и разобраться почему это происходит. И даже в случаях видимости нормальной работы, без сбоев, очень важно дополнительно получить подтверждение этого от сетевых диагностических средств. Для решения данных вопросов существует несколько диагностических инструментов; при этом каждый из этих инстументов работает на своём (разном) уровне.
10.8.1. Диагностика локального узла: netstat
Давайте сначала рассмотрим команду netstat
(в пакете net-tools package); она показывает мгновенный срез суммарной информации о сетевой активности данной машины. Запущенная без параметров, программа показывает все открытые соединения; этот перечень может быть очень подробный, поскольку он включает в себя много сокетов Unix-домена (широко используемые демоны), которые не связаны с сетью вообще (например, соединение dbus
, трафик X11
, и соединения между виртуальными файловыми системами и рабочего стола).
Поэтому наиболее распространено применение команды netstat
с параметрами, которые изменяют поведение программы. Наиболее часто используются следующие параметры:
-t
, отфильтровывает результат и показывает только соединения TCP;
-u
, которая работает также, только для соединений UDP; эти параметры не являются взаимоисключающими, и одного из них достаточно, чтобы остановить отображение части Unix-домен соединений);
-a
, также перечисляет прослушиваемые сокеты (ожидающие входящие соединения);
-n
, отображает результат в цифровом (небуквенном) виде: адреса IP (а не DNS разрешение), номер порта (а не псевдонимы, как определено в файле /etc/services
) и идентификаторы пользователей (ids, а не имя учётной записи пользователя);
-p
, перечисляет уже запущенные на данной машине процессы; этот параметр будет более полезен при запуске netstat
от лица суперпользователя, поскольку обычные пользователи увидят только те процессы, которые они сами запустили;
-c
, непрерывно обновлять перечень подключений.
Другие параметры, описанные в страницах руководства netstat(8), позволяют более тонко настроить отображаемый программой результат. На практике, первые пять параметров (описываемые чуть выше) настолько часто используются вместе, что системные и сетевые администраторы практически рефлексивно используют netstat -tupan
в своей работе. На несильно загруженной машине, типичный результат вывода команды будет выглядеть следующим образом:
#
netstat -tupan
Активные соединения Интернет (сервера и общепринятые)
Прото Полv-Q Посл-Q Локальный Адрес Внешний Адрес Состояние PID/Имя программы
tcp 0 0 0.0.0.0:111 0.0.0.0:* СЛУШАЕТ 397/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* СЛУШАЕТ 431/sshd
tcp 0 0 0.0.0.0:36568 0.0.0.0:* СЛУШАЕТ 407/rpc.statd
tcp 0 0 127.0.0.1:25 0.0.0.0:* СЛУШАЕТ 762/exim4
tcp 0 272 192.168.1.242:22 192.168.1.129:44452 ОБЩЕПРИНЯТЫЕ 1172/sshd: roland [
tcp6 0 0 :::111 :::* СЛУШАЕТ 397/rpcbind
tcp6 0 0 :::22 :::* СЛУШАЕТ 431/sshd
tcp6 0 0 ::1:25 :::* СЛУШАЕТ 762/exim4
tcp6 0 0 :::35210 :::* СЛУШАЕТ 407/rpc.statd
udp 0 0 0.0.0.0:39376 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:996 0.0.0.0:* 397/rpcbind
udp 0 0 127.0.0.1:1007 0.0.0.0:* 407/rpc.statd
udp 0 0 0.0.0.0:68 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:48720 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:111 0.0.0.0:* 397/rpcbind
udp 0 0 192.168.1.242:123 0.0.0.0:* 539/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:39172 0.0.0.0:* 407/rpc.statd
udp6 0 0 :::996 :::* 397/rpcbind
udp6 0 0 :::34277 :::* 407/rpc.statd
udp6 0 0 :::54852 :::* 916/dhclient
udp6 0 0 :::111 :::* 397/rpcbind
udp6 0 0 :::38007 :::* 451/avahi-daemon: r
udp6 0 0 fe80::5054:ff:fe99::123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:a:123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:5:123 :::* 539/ntpd
udp6 0 0 ::1:123 :::* 539/ntpd
udp6 0 0 :::123 :::* 539/ntpd
udp6 0 0 :::5353 :::* 451/avahi-daemon: r
Как и ожидалось, перечисляются установленные соединения, два соединения SSH в этом случае, и приложения, ожидающие входящие соединения (перечислены как СЛУШАЕТ
- "LISTEN"), в частности почтовый сервер Exim4 прослушивает порт 25.
10.8.2. Удалённая диагностика: nmap
Команда nmap
(в пакете с похожим именем) выполняет те же функции, что и netstat
, только для удалённого диагностирования машин. Она может просканировать все "широко известные" порты на одном или на нескольких удалённых серверах, и перечислить порты, на которых приложения готовы дать ответ входящим соединениям. Кроме того, nmap
имеет возможность определить некоторые из тех приложений, иногда даже и их номер версии. Недостатком данного инструмента является то, что поскольку он работает удалённо, то не может предоставить информацию о процессах или пользователях; однако, он может работать по нескольким целям одновременно.
Типичный вызов программы выглядит следующим образом: nmap
и далее параметр -A
(таким образом nmap
пытается определить версию програмного обеспечения найденного сервера), а следом указываются один или более адресов IP или имён DNS машин для сканирования. Кроме этого, ещё много других параметров существует для тонкой настройки поведения программы nmap
; пожалуйста руководствуйтесь документацией, размещённой в страницах руководства - nmap(1).
#
nmap mirtuel
Запуск Nmap 6.47 ( http://nmap.org ) at 2015-03-09 16:46 CET
Отчёт о сканировании nmap для mirtuel (192.168.1.242)
Хост запущен (0.000013s задержка).
Записи rDNS для 192.168.1.242: mirtuel.internal.placard.fr.eu.org
Не показаны: 998 закрытых порта
ПОРТ СОСТОЯНИЕ СЕРВИС
22/tcp open ssh
111/tcp open rpcbind
Nmap завершила работу : 1 адрес IP (1 хост запущен) просканирован за 2.41 секунды
#
nmap -A localhost
Запуск Nmap 6.47 ( http://nmap.org ) at 2015-03-09 16:46 CET
Отчёт о сканировании nmap для локального хоста (127.0.0.1)
Хост запущен (0.000013s задержки).
Другие адреса для локального хоста (не сканированы): 127.0.0.1
Не показаны: 997 закрытых портов
ПОРТ СОСТОЯНИЕ СЕРВИС ВЕРСИЯ
22/tcp открыт ssh OpenSSH 6.7p1 Debian 3 (протокол 2.0)
|_ssh-hostkey: ОШИБКА: Сценарий закончился с ошибкой (используйте -d для отладки)
25/tcp открыт smtp Exim smtpd 4.84
| smtp-commands: mirtuel Привет хост [127.0.0.1], РАЗМЕР 52428800, 8BITMIME, PIPELINING, HELP,
|_ Поддерживаемые команды: AUTH HELO EHLO MAIL RCPT DATA NOOP QUIT RSET HELP
111/tcp открыт rpcbind 2-4 (RPC #100000)
| rpcinfo:
| програма версия порт/протокол сервис
| 100000 2,3,4 111/tcp rpcbind
| 100000 2,3,4 111/udp rpcbind
| 100024 1 36568/tcp status
|_ 100024 1 39172/udp status
Тип устройства: общего назначения
Запущено: Linux 3.X
OS CPE: cpe:/o:linux:linux_kernel:3
OS детали: Linux 3.7 - 3.15
Расстояние по Сети: 0 hops
Информация о запущенных сервисах: Хост: mirtuel; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Определение OS and Сервисов выполнено. Пожалуйста отправьте нам сообщение о любых неверных результатах по адресу - http://nmap.org/submit/ .
Nmap завершил работу: 1 адрес IP (1 хост запущен) сканирование выполнено за 11.54 секунд
Как и ожидалось, приложения SSH и Exim4 слушают. Запомните, что не все приложения слушают на всех адресах IP. Пример: поскольку имеется возможность запустить Exim4 только на закольцованном интерфейсе lo
, то эта программа появится в перечне в случае анализа локального хоста localhost
, а не когда прослушивается mirtuel
(это буквенное имя соответствует интерфейсу eth0
на той же машине).
10.8.3. Снифферы (перехватчики пакетов и анализаторы кадров): tcpdump
and wireshark
Иногда, необходимо посмотреть, что фактически происходит в сети, пакет за пакетом. В таких случаях вызываются “анализаторы кадров”, более широко известные под именем сниффер. Такие инструменты просматривают все пакеты, проходящие по указанному сетевому интерфейсу, и отображают их в удобном для пользователя виде.
Давним и хорошо зарекомендовавшим себя инструментом в этой области является программа tcpdump
, доступная как стандартный инструмент для большого количества разнообразных платформ. Она позволяет использовать многие разновидности перехвата трафика в сети, но представление этого трафика (для просмотра) остаётся довольно непонятным. Поэтому мы не будем в деталях описывать её далее.
Более поздним (и более современным) инструментом является программа wireshark
(в пакете wireshark), которая в настоящее время более рекомендуется для перехвата сетевого трафика из-за его многочисленных декодирующих модулей, что позволяет упростить сам процесс последующего анализа перехваченных пакетов. Отображение перехватываемых пакетов выполняется графически с организацией просмотра по принципу слоёв протокола. Это позволяет пользователю отчётливо представить себе (видеть глазами) все протоколы, используемые в пакете. Для примера, пакет, содержащий запрос HTTP, wireshark
отобразит отдельно: информацию касающуюся физического слоя, слой Ethernet, информацию о пакете IP, параметры соединения TCP, и наконец сам запрос HTTP.
В нашем примере, пакеты перемещающиеся по протоколу SSH отфильтрованы (с фильтром !tcp.port == 22
). Показываемый выделением пакет на картинке, был разработан на уровне HTTP.