Утилита netstat

В статье разбирается утилита netstat, которая предназначена для получения информации о сетевых подключениях к серверу или от него.

Об утилите

Эта утилита используется для вывода информации о сетевых подключениях. Также она может показать таблицы маршрутизации, статистику по интерфейсам и другое. Я использую эту утилиту только для вывода сетевых подключений.

Вообще эта утилита считается устаревшей и была заменена на утилиту ss, которую мы рассмотрим в следующей статье.

Получить справку об этой утилите можно здесь.

Установка netstat

Эта утилита входит в пакет net-tools, поэтому необходимо установить именно этот пакет, чтобы у вас в системе появилась утилита netstat. В пакет net-tools также включены следующие инструменты: arp, ifconfig, rarp, nameif и route. Все они считаются устаревшими, но иногда используются по привычке системного администратора.

И так, чтобы установить net-tools выполните:

$ sudo apt install net-tools

Работа утилиты

Если мы выполним netstat без дополнительных опций, то увидим активные сетевые соединения (Active Internet connections) и активные соединения с помощью сокетов (Active UNIX domain sockets).

$ netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0    216 192.168.0.35:ssh        pc-adm:64743 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ]         DGRAM                    799      /run/user/1000/systemd/notify
unix  3      [ ]         DGRAM                    11402    /run/systemd/notify
unix  2      [ ]         DGRAM                    11418    /run/systemd/journal/syslog
unix  7      [ ]         DGRAM                    11424    /run/systemd/journal/dev-log
unix  7      [ ]         DGRAM                    11426    /run/systemd/journal/socket
unix  3      [ ]         STREAM     CONNECTED     12270    /run/systemd/journal/stdout
***

Выводимая информация для интернет соединений и соединений с помощью сокетов отличается.

Выводимые поля для интернет соединений:

  • Proto — протокол (tcp, udp).
  • Recv-Q — количество байтов, помещённых в буфер приёма TCP/IP, но не переданных приложению. Если это число высокое, то нужно проверить работоспособность приложения, которое работает с данным портом.
  • Send-Q — количество байтов, помещённых в буфер отправки TCP/IP, но не отправленных, или отправленных, но не подтверждённых. Высокое значение может быть связано с перегрузкой сети сервера.
  • Local Address — локальный адрес сервера. В обычных соединения, это адрес сервера на который пришло соединение. В прослушиваемых портах (LISTEN) — это диапазон адресов. Так 0.0.0.0:port — значит подключаться можно ко всем адресам сервера, а 192.168.0.35:port — значит подключаться можно только к этому адресу сервера.
  • Foreign Address — адрес второй стороны. В обычных соединения, это адрес с которого пришло соединение. В прослушиваемых портах (LISTEN) — это диапазон адресов. Так 0.0.0.0:* — значит подключаться можно с любых адресов и с любых портов, а например 192.168.0.50:* — значит подключаться можно только с этого адреса и с любых портов.
  • State — состояние подключения, или прослушивания.

Выводимые поля для соединений с помощью сокетов:

  • Proto — протокол (unix);
  • RefCnt — счётчик подключенных к этому сокету процессов;
  • Flags — флаги, я их не буду рассматривать;
  • Type — тип сокета
    • DGRAM — работает без установки соединения;
    • STREAM — с предварительной установкой соединения;
  • State — состояние коннекта
    • LISTENING — сокет ожидает запроса на подключение;
    • CONNECTED — сокет подключен;
    • DISCONNECTING — сокет отключен;
    • (пусто) — сокет не подключен к другому.
  • I-Node — номер i-node файла сокета;
  • Path — путь к файлу сокета.

 

Примеры работы и дополнительные опции

Активные подключения и прослушиваемые порты

Если утилита netstat без опций выводила все активные подключения, то с опцией -a она дополнительно выведет все прослушиваемые порты.

Дополнительно можно отфильтровать информацию по типу протокола:

  • -t — выводить только tcp;
  • -u — выводить только udp;
  • -x — выводить только сокеты.

Эти опции можно совмещать, например следующая команда покажет все активные подключения и прослушиваемые порты только для tcp и udp соединений:

$ netstat -atu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp        0    268 192.168.0.35:ssh        pc-adm:64743            ESTABLISHED
tcp6       0      0 [::]:http               [::]:*                  LISTEN
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN
tcp6       0      0 [::]:https              [::]:*                  LISTEN

Из вывода выше мы видим что у нас есть tcp соединения и нет udp. В tcp соединениях видно одно в состоянии ESTABLISHED, это я подключен к серверу по протоколу ssh. Остальные имеют состояние LISTEN — это прослушиваемые порты. Наш сервер слушает следующие порты: ssh (22 порт), https (443 порт), http (80 порт).

Только прослушиваемые порты или сокеты

Перечислить все прослушиваемые порты, в том числе и сокеты можно с помощью опции -l. Здесь вы также можете ограничить вывод tcp, udp или linux сокетами.

Например, следующая команда выведет все прослушиваемые порты и сокеты, так как я не ограничиваю вывод определённым протоколом:

$ netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:ssh             0.0.0.0:*               LISTEN
tcp6       0      0 [::]:http               [::]:*                  LISTEN
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN
tcp6       0      0 [::]:https              [::]:*                  LISTEN
Active UNIX domain sockets (only servers)
Proto RefCnt Flags       Type       State         I-Node   Path
unix  2      [ ACC ]     STREAM     LISTENING     211      /run/systemd/journal/io.systemd.journal
unix  2      [ ACC ]     STREAM     LISTENING     802      /run/user/1000/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     811      /run/user/1000/gnupg/S.dirmngr
unix  2      [ ACC ]     STREAM     LISTENING     813      /run/user/1000/gnupg/S.gpg-agent.browser
unix  2      [ ACC ]     STREAM     LISTENING     815      /run/user/1000/gnupg/S.gpg-agent.extra
unix  2      [ ACC ]     STREAM     LISTENING     817      /run/user/1000/gnupg/S.gpg-agent.ssh
unix  2      [ ACC ]     STREAM     LISTENING     819      /run/user/1000/gnupg/S.gpg-agent
unix  2      [ ACC ]     STREAM     LISTENING     11882    /run/dbus/system_bus_socket
unix  2      [ ACC ]     STREAM     LISTENING     11405    /run/systemd/private
unix  2      [ ACC ]     STREAM     LISTENING     11407    /run/systemd/userdb/io.systemd.DynamicUser
unix  2      [ ACC ]     STREAM     LISTENING     11408    /run/systemd/io.system.ManagedOOM
unix  2      [ ACC ]     STREAM     LISTENING     11420    /run/systemd/fsck.progress
unix  2      [ ACC ]     STREAM     LISTENING     11428    /run/systemd/journal/stdout
unix  2      [ ACC ]     SEQPACKET  LISTENING     11430    /run/udev/control

 

Получение статистики

Для получения статистики по сетевым протоколам нужно использовать опцию -s. Здесь также можно ограничивать вывод по определённым протоколам, но нельзя использовать опцию -x.

Например следующая команда выведет статистику по протоколу udp:

$ netstat -su
Udp:
    314 packets received
    0 packets to unknown port received
    0 packet receive errors
    317 packets sent
    0 receive buffer errors
    0 send buffer errors
    IgnoredMulti: 3856905
UdpLite:
IpExt:
    InBcastPkts: 3856905
    InOctets: 424191584
    OutOctets: 6605615
    InBcastOctets: 229159529
    InNoECTPkts: 4157300
    InECT0Pkts: 10507

Формат вывода

Утилита netstat, используя dns, пытается присвоить имена ip-адресам. Так, какой-нибудь, условный компьютер, с адресом 192.168.0.14 будет назван как pc-adm. Мы можем выключить такое именование хостов используя опцию -n.

А ещё утилита netstat именует стандартные порты в имена протоколов, например порт 22 будет назван ssh, 80 — http, 443 — https. Но мы можем выключить это поведение используя опцию -nn.

Также эта утилита умеет выводить имена процессов, которые обслуживают подключения, или слушают порты. Для этого нужно использовать опцию -p. Но чтобы мы увидели названия процессов, нужно запускать утилиту netstat используя sudo.

Например:

  • netstat -ltnnp — вывести только прослушиваемые tcp порты. При этом не переводить ip адреса в имена хостов и не переводить номера портов в названия протоколов. Дополнительно вывести название процессов.
  • netstat -atunnpвывести все порты (прослушиваемые и активные). При этом выводить только сетевые порты (tcp и udp), а не сокеты. Не переводить ip адреса в имена хостов и не переводить номера портов в имена протоколов. А также вывести названия процессов участвующих в соединениях.

Пример последней команды показан здесь:

$ sudo netstat -atnnp
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:22              0.0.0.0:*               LISTEN      402/sshd: /usr/sbin
tcp        0     52 192.168.0.35:22         192.168.0.14:64743      ESTABLISHED 4121/sshd: alex [pr
tcp6       0      0 :::80                   :::*                    LISTEN      403/apache2
tcp6       0      0 :::22                   :::*                    LISTEN      402/sshd: /usr/sbin
tcp6       0      0 :::443                  :::*                    LISTEN      403/apache2

Итог

Мы познакомились с утилитой netstat, которая позволяет посмотреть информацию о сетевых подключениях к серверу или от него.

Рассмотрели следующие опции:

  • -a — посмотреть все порты (прослушиваемые и используемые в подключении);
  • -l — посмотреть только прослушиваемые порты;
  • -t — выводить только tcp порты;
  • -u — выводить только udp порты;
  • -x — выводить информацию только по unix сокетам;
  • -p — к выводу добавить информацию о процессе (имя и pid процесса);
  • -n — отключить преобразование ip адреса в имя компьютера;
  • -nn — отключить преобразование номера порта в имя протокола;
  • -s — отобразить статистику по различным сетевым протоколам.