10.9. Инструменты Диагностики Сети
Если сетевое приложение не работает должным образом, важно иметь возможность заглянуть под его капот. Даже если кажется, что всё идёт гладко, диагностика сети может помочь убедиться, что всё работает должным образом. Для этой цели существует несколько инструментов диагностики; каждый из них действует на разном уровне. Обсуждение всех инструментов выходит за рамки этой книги, поэтому в следующих разделах мы сосредоточимся на более известных и часто используемых инструментах.
10.9.1. Диагностика локального узла: netstat
Давайте сначала рассмотрим команду netstat
(в пакете net-tools package); она показывает мгновенный срез суммарной информации о сетевой активности данной машины. Запущенная без параметров, программа показывает все открытые соединения; этот список может быть очень подробным, поскольку он включает в себя много Unix-домен сокетов (широко используемых демонами), которые не связаны с сетью вообще (например, коммуникация dbus
, трафик X11
, и соединения между виртуальными файловыми системами и рабочим столом).
Поэтому наиболее распространено применение команды netstat
с параметрами, которые изменяют поведение программы. Наиболее часто используемые параметры:
-t
, отфильтровывает результат и показывает только соединения TCP;
-u
, которая работает также, только для соединений UDP; эти параметры не являются взаимоисключающими, и одного из них достаточно, чтобы остановить отображение части Unix-домен соединений);
-a
, также перечисляет прослушиваемые сокеты (ожидающие входящие соединения);
-n
, отображает результат в цифровом (небуквенном) виде: адреса IP (а не DNS резолвинга), номер порта (а не псевдонимы, как определено в файле /etc/services
) и идентификаторы пользователей (id, а не имя учётной записи пользователя);
-p
, перечисляет уже запущенные на данной машине процессы; этот параметр будет более полезен при запуске netstat
от лица суперпользователя, поскольку обычные пользователи увидят только те процессы, которые они сами запустили;
-c
, непрерывно обновлять список подключений.
Другие параметры, описанные в страницах руководства netstat(8), позволяют более тонко настроить отображаемый программой результат. На практике, первые пять параметров (описываемые чуть выше) настолько часто используются вместе, что системные и сетевые администраторы практически рефлекторно используют netstat -tupan
в своей работе. Типичные результаты на слегка загруженной машине могут выглядеть следующим образом:
#
netstat -tupan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 397/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 431/sshd
tcp 0 0 0.0.0.0:36568 0.0.0.0:* LISTEN 407/rpc.statd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 762/exim4
tcp 0 272 192.168.1.242:22 192.168.1.129:44452 ESTABLISHED 1172/sshd: roland [
tcp6 0 0 :::111 :::* LISTEN 397/rpcbind
tcp6 0 0 :::22 :::* LISTEN 431/sshd
tcp6 0 0 ::1:25 :::* LISTEN 762/exim4
tcp6 0 0 :::35210 :::* LISTEN 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.9.2. Удалённая диагностика: nmap
Команда nmap
(в пакете с похожим именем) выполняет те же функции, что и netstat
, только для удалённого диагностирования машин. Она может просканировать все "широко известные" порты на одном или на нескольких удалённых серверах, и перечислить порты, на которых приложения готовы дать ответ входящим соединениям. Кроме того, nmap
имеет возможность определить некоторые из тех приложений, иногда даже и их номер версии. Недостатком данного инструмента является то, что поскольку он работает удалённо, то не может предоставить информацию о процессах или пользователях; однако, он может работать по нескольким целям одновременно.
Типичный вызов программы выглядит следующим образом: nmap
и далее параметр -A
(таким образом nmap
пытается определить версию программного обеспечения найденного сервера), а следом указываются один или более адресов IP или имён DNS машин для сканирования. Кроме этого, ещё много других параметров существует для тонкой настройки поведения программы nmap
; пожалуйста руководствуйтесь документацией в nmap(1).
#
nmap debian
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:58 CET
Nmap scan report for debian (192.168.122.57)
Host is up (0.000087s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
79/tcp open finger
80/tcp open http
113/tcp open ident
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
#
nmap -A localhost
nmap -A localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:56 CET
Stats: 0:01:16 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 83.33% done; ETC: 20:57 (0:00:15 remaining)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5 (protocol 2.0)
|_auth-owners: foobar
25/tcp open smtp Postfix smtpd
|_auth-owners: foobar
|_smtp-commands: debian, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING,
| ssl-cert: Subject: commonName=debian
| Subject Alternative Name: DNS:debian
| Not valid before: 2022-02-22T14:48:42
|_Not valid after: 2032-02-20T14:48:42
|_ssl-date: TLS randomness does not represent time
79/tcp open finger?
|_auth-owners: foobar
|_finger: ERROR: Script execution failed (use -d to debug)
80/tcp open http Apache httpd 2.4.52 ((Debian))
|_auth-owners: foobar
|_http-server-header: Apache/2.4.52 (Debian)
|_http-title: Apache2 Debian Default Page: It works
113/tcp open ident Liedentd (Claimed user: foobar)
|_auth-owners: foobar
631/tcp open ipp CUPS 2.3
|_auth-owners: foobar
| http-robots.txt: 1 disallowed entry
|_/
|_http-server-header: CUPS/2.3 IPP/2.1
|_http-title: Home - CUPS 2.3.3op2
Service Info: Host: debian; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 87.91 seconds
Как и ожидалось, приложения SSH и Exim4 прослушивают порты. Запомните, что не все приложения слушают на всех адресах IP. Пример: поскольку имеется возможность запустить Postfix только на loopback интерфейсе lo
, то эта программа появится в списке в случае анализа localhost
, а не когда сканируется debian
(это имя соответствует интерфейсу enp1s0
на той же машине).
10.9.3. Снифферы (перехватчики пакетов и анализаторы кадров): tcpdump
и wireshark
Иногда, необходимо посмотреть, что фактически происходит в сети, пакет за пакетом. В таких случаях вызываются “анализаторы кадров”, более широко известные под именем sniffer (сниффер). Такой инструмент отслеживает все пакеты, достигающие данного сетевого интерфейса, и отображает их в удобной для пользователя форме.
Давним и хорошо зарекомендовавшим себя инструментом в этой области является программа tcpdump
, доступная как стандартный инструмент для большого количества разнообразных платформ. Она позволяет использовать многие разновидности перехвата трафика в сети, но представление этого трафика (для просмотра) остаётся довольно непонятным. Поэтому мы не будем в деталях описывать её далее.
Более поздним (и более современным) инструментом является программа wireshark
(в пакете wireshark), которая в настоящее время более рекомендуется для перехвата сетевого трафика из-за его многочисленных декодирующих модулей, что позволяет упростить сам процесс последующего анализа перехваченных пакетов. Отображение перехватываемых пакетов выполняется графически с организацией просмотра по принципу слоёв протокола. Это позволяет пользователю отчётливо представить себе (видеть глазами) все протоколы, используемые в пакете. Для примера, пакет, содержащий запрос HTTP, wireshark
отобразит отдельно: информацию касающуюся физического слоя, слой Ethernet, информацию о пакете IP, параметры соединения TCP, и наконец сам запрос HTTP.
В нашем примере пакеты, проходящие через SSH, отфильтровываются (с фильтром !tcp.port == 22
). Отображаемый сейчас пакет был создан на транспортном уровне протокола SSHv2.