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 являются фаворитами у Вас? Что приходится часто использовать в работе? Пишите в комментариях и делитесь Вашими соображениями! Буду очень признателен за это.