Netstat и аналоги

19/07/2020


У каждого администратора, IT инженера или программиста наверняка есть несколько десятков базовых утилит или команд, которые постоянно применяются в работе. У меня также есть такой набор базовых инструментов, который является неотъемлемой частью моей профессии. Среди них можно назвать wget, curl, ping, vim, tree, git, ip ну и конечно же netstat. Последняя являлась незаменимой утилитой при работе на абсолютно разных платформах, начиная от всевозможных версий Linux, Unix, BSD и заканчивая MacOS, а так же Microsoft Windows. С помощью нее можно получать информацию о сетевых соединениях, интерфейсах, таблицах маршрутизации. Утилитка позволяет получать обширнейшую информацию, которая бывает полезна во время траублшутинга, дебагинга или настройки чего-то нового.

В последние несколько лет отчетливо прослеживается тенденция на замену утилиты netstat на более новые ее аналоги — ss и lsof. Так уже в Centos по умолчанию Вы не найдете netstat, Вам предлагается использовать уже именно ss, а также lsof. Можно конечно же устанавливать netstat из пакетов и не париться о новых его аналогах. Мне однако такой путь кажется не правильным. Время идет, технологии развиваются, и надо обязательно изучать новинки, даже если они на первый взгляд кажутся бесполезными. При написании этой статьи не ставил цели сделать какое-то наглядное пособие по использованию новых аналогов netstat. Хотел скорее показать, как безболезненно перейти на новые утилиты, расширив свой профессиональный кругозор и функциональные возможности.

Практические примеры

Сразу оговорюсь, что ss и lsof не являются полными аналогами утилиты netstat. В какой-то мере они уступают своему предшественнику по широте охвата. Так утилита ss нацелена строго на отображение разнообразной статистики по сетевым соединениям на хосте. Команда же lsof предназначена для отображения статистики по открытым файлам теми или иными процессами. Кроме того, как частный вариант использования она позволяет отображать информацию по сетевым подключениям.

Пример 1

Итак, давайте рассмотрим часто встречающиеся случаи использования команды netstat, а также варианты получения этой информации с помощью ss и lsof. Например, чтобы узнать какие TCP порты у нас прослушиваются в системе (здесь и далее мы используем примеры в ОС Ubuntu Linux) с помощью netstat, мы выполняем следующую команду.

root@www:~# netstat -nat | grep LISTEN
tcp        0      0 192.168.0.1:444         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN
tcp        0      0 192.168.0.1:857         0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN 

Если же в Вашей системе netstat не имеется, то эту полезную информацию можно получить следующими путями.

root@www:~# ss -nat state listening
Recv-Q          Send-Q            Local Address:Port             Peer Address:Port
0               1                  192.168.0.1:444                    0.0.0.0:*
0               80                    127.0.0.1:3306                  0.0.0.0:*
0               128                     0.0.0.0:80                    0.0.0.0:*
0               128               127.0.0.53%lo:53                    0.0.0.0:*
0               128                192.168.0.1:857                    0.0.0.0:*
0               20                    127.0.0.1:25                    0.0.0.0:*
0               128                     0.0.0.0:443                   0.0.0.0:*

root@www:~# lsof -i -sTCP:LISTEN -P -n
COMMAND     PID            USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
systemd-r   369 systemd-resolve   13u  IPv4   12867      0t0  TCP 127.0.0.53:53 (LISTEN)
sshd        475            root    3u  IPv4 1445266      0t0  TCP 192.168.0.1:857 (LISTEN)
mysqld      485           mysql   24u  IPv4   15708      0t0  TCP 127.0.0.1:3306 (LISTEN)
openvpn     571          nobody    8u  IPv4   15311      0t0  TCP 192.168.0.1:444 (LISTEN)
exim4       859     Debian-exim    3u  IPv4   16476      0t0  TCP 127.0.0.1:25 (LISTEN)
nginx      4962        www-data    8u  IPv4  851347      0t0  TCP *:443 (LISTEN)
nginx      4962        www-data    9u  IPv4  851348      0t0  TCP *:80 (LISTEN)
nginx      4963        www-data    8u  IPv4  851347      0t0  TCP *:443 (LISTEN)
nginx      4963        www-data    9u  IPv4  851348      0t0  TCP *:80 (LISTEN)
nginx     25097            root    8u  IPv4  851347      0t0  TCP *:443 (LISTEN)
nginx     25097            root    9u  IPv4  851348      0t0  TCP *:80 (LISTEN)

Как видим, утилита ss очень похожа на netstat, кроме того она позволяет без использования grep и прочих сторонних фильтров отображать соединения, которые находятся в состоянии LISTEN. Команда lsof обладает другим синтаксисом, как видно из примера. Кроме информации по открытым портам она сразу же в общем скопе предоставляет данные по приложениям, которые используют те или иные порты, а также номера PID процессов этих приложений.

Пример 2

Еще одной часто встречающейся задачей является выяснение программы, которая слушает тот или иной сокет в системе. Netstat это позволяет сделать с помощью следующей комбинации команд в сочетании с утилитой grep.

root@www:~# netstat -natp | grep LISTEN | grep :443
tcp        0      0 0.0.0.0:443    0.0.0.0:*      LISTEN      8673/nginx: worker

Чтобы получить аналогичнюу информацию в системе с помощью ss или lsof нужно выполнить эти команды со следующими параметрами.

root@www:~# ss -natp state listening 'sport = :443'
Recv-Q    Send-Q       Local Address:Port        Peer Address:Port
0         128                0.0.0.0:443              0.0.0.0:*     users:(("nginx",pid=25097,fd=8),("nginx",pid=8674,fd=8),("nginx",pid=8673,fd=8)) 

root@www:~# lsof -i :443 -sTCP:LISTEN -P -n
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx    8673 www-data    8u  IPv4 851347      0t0  TCP *:443 (LISTEN)
nginx    8674 www-data    8u  IPv4 851347      0t0  TCP *:443 (LISTEN)
nginx   25097     root    8u  IPv4 851347      0t0  TCP *:443 (LISTEN)

Как видно из этого примера, обе последние команды позволяют выводить и сортировать более избирательно нужную информацию. При этом, если netstat позволяет получить PID только родительского процесса, то ss и lsof дают более подробную информацию о том, кто и под каким пользователем использует данный сокет.

Из пары приведенных примеров хорошо прослеживается прогресс в возможностях более новых утилит по сравнению с netstat. Я думаю, что каждый инженер или администратор выполняет подобные команды десятки раз в течении рабочей недели. Поэтому как минимум знать о существовании и возможностях ss и lsof на сегодняшний день нужно каждому ITшнику.

Заключение

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

А какие утилиты коммандной строки в Linux/Nix являются фаворитами у Вас? Что приходится часто использовать в работе? Пишите в комментариях и делитесь Вашими соображениями! Буду очень признателен за это.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *