Аналог netstat в linux

Обновлено: 05.07.2024

Иногда бывает необходимо посмотреть какие сетевые подключения Linux открыты, какие IP адреса используются или какие порты прослушиваются. Раньше для таких целей использовалась утилита netstat. Её, без сомнения, знают все системные администраторы и специалисты по безопасности. Но она больше не поставляется по умолчанию в новых дистрибутивах. Вместо неё используется новая утилита под названием ss.

Netstat сканирует директорию /proc для получения необходимой информации, но в новых версиях ядра была реализована специальная подсистема для мониторинга сети в Linux. Её и использует ss, с помощью этой утилиты вы можете получить больше информации о сетевых подключениях и работает она гораздо быстрее.

Как вы уже поняли в этой статье мы рассмотрим мониторинг сетевых подключений в Linux с помощью утилиты из пакета iproute - ss linux. Начнем, как обычно, с синтаксиса и основных опций.

Общая информация

Как уже было сказано работает утилита ss в Linux на основе подсистемы ядра. Синтаксис очень простой - сама команда и ее опции:

$ ss опции [ фильтр_состояния] [фильтр_адреса]

Для удобства вывод команды ss можно фильтровать с помощью grep:

$ ss опции | grep шаблон

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

Опции утилиты ss

Для сетевых подключений в Linux с помощью утилиты ss можно использовать такие опции:

  • -V - Version показать версию утилиты.
  • -n - Numeric не определять имена служб.
  • -r - Resolve определять сетевые имена адресов с помощью DNS.
  • -a - All отобразить все сокеты (открытые соединения).
  • -l - Listening показать только прослушиваемые сокеты.
  • -o - Options показать информацию таймера.
  • -e - Extended выводить расширенную информацию о сокете.
  • -p - Processes, показать процессы, использующие сокет.
  • -i - Internal, посмотреть внутреннюю информацию TCP.
  • -s - Summary, статистика использования сокета.
  • -D - экспортировать текущее состояние TCP сокетов в файл.
  • -F - работать с информацией, взятой из файла.

Кроме того, можно вывести сокеты только нужного протокола:

  • -4, --ipv4 - только сокеты протокола IP версии 4.
  • -6 --ipv6 - только сокеты протокола IP версии 6.
  • -0, --packet - только PACKET сокеты.
  • -t, --tcp - TCP сокеты.
  • -u, --udp - UDP сокеты.
  • -d, --dhcp - DHCP сокеты.
  • -r, --raw - RAW сокеты.
  • -x, --unix - UNIX сокеты.

Для фильтрации протоколов можно использовать не только эти опции, но и универсальную опцию -f, передав ей в параметре название протокола. Здесь собраны самые основные опции, если вам нужно больше информации - смотрите справку команды.

Примеры использования

А теперь давайте рассмотрим примеры использования утилиты ss Linux. Возможно, из описания опций вы мало что поняли, но с примерами все встанет на свои места.

Мониторинг сетевых подключений

Сначала смотрим все сетевые подключения:


Посмотрим только TCP соединения:


Теперь только Unix:


Для отображения UDP сокетов используйте опцию u. По умолчанию будут показаны только подключенные соединения. Если хотите получить все, нужно использовать опцию a. Поскольку UDP, это протокол без постоянного соединения, то без опции -a мы ничего не увидим:


По умолчанию утилита не пытается определять имена хостов через dns, но можно ее попросить делать это опцией -r:

Обратная опция -n, не будет выполняться не только dns резолвинг, но и определение протоколов портов, зато мониторинг сети в Linux работать будет быстрее:


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


Здесь мы видим только имена служб, это не всегда удобно, указав опцию n, мы получим номера портов. Так же само можно посмотреть прослушиваемые udp сокеты:


Также мы можем попытаться узнать название и PID процесса, использующего сокет:


Просмотр статистики статистики сетевых подключений

Для просмотра статистики по использованию сетевых подключений наберите:


С помощью опции -о можно посмотреть информацию о таймере и состоянии подключения.


Фильтрация по протоколу

Мы можем отображать только нужный нам протокол. Например только ipv4:

sudo ss -tl -f inet4


Так же само можно отобразить только соединения ipv6:


Фильтрация по состоянию соединения

В синтаксисе команды мы описали два дополнительных параметра. Фильтрация состояния и фильтрация по адресу. Рассмотрим теперь как ими пользоваться. Сокет TCP может находиться в одном из нескольких состояний. Например, так утилита ss linux выведет только подключенные сокеты.

ss -t4 state established


Или сокеты в состоянии ожидания:

sudo ss -t4 state time-wait


В параметр state можно передать одно из следующих значений:

  • established
  • syn-sent
  • syn-recv
  • fin-wait-1
  • fin-wait-2
  • time-wait
  • closed
  • close-wait
  • last-ack
  • closing
  • all - все состояния
  • connected - все кроме прослушиваемых и закрытых
  • synchronized - все кроме syn-sent
  • bucket - time-wait и syn-recv
  • big - все кроме bucket

Не все состояния подключений можно увидеть просто выполнив команду. Например, syn-sent и syn-recv вряд ли получиться словить, потому что соединения находятся в этом состоянии очень короткое время. Для их отображения удобно использовать команду watch:

watch -n 1 "ss -t4 state syn-sent"

После запуска команды откройте любой сайт в браузере. Вы увидите как появится одно или несколько соединений на несколько секунд.

Фильтрация по адресу и номеру порта

Кроме фильтрации по состоянию, tcp сокеты можно фильтровать по адресам или портам соединений.

Например, отберем все сетевые подключения linux с портом источником или приемником ssh, то есть все входящие и исходящие соединения ssh:

ss -at '( dport = :ssh or sport = :ssh )'


Или сокеты с портом назначения 80 или 443:

ss -nt '( dst :443 or dst :80 )'

Такой синтаксис тоже будет работать:

ss -nt dst :443 or dst :80

Еще несколько примеров фильтрации:

Фильтрация по адресу:

ss -nt dst 74.125.236.178

Фильтрация по адресу и подсети:

ss -nt dst 74.125.236.178/16

И по адресу и порту:

ss -nt dst 74.125.236.178:80

Если вы хотите фильтровать сетевые соединения по порту, перед портом ставьте двоеточие:

ss -nt dport = :80

Можно использовать такие операторы сравнения:

Выводы

Вот и всё. Основную информацию о том, как выполнять мониторинг сети в Linux с помощью утилиты ss рассмотрели. Если вам нужно больше информации и примеров смотрите документацию по утилитам набора iproute.

Не секрет, что Net-Tools пора на почетную отставку. Да, многим админам и мне в том числе, до условного рефлекса Павлова знакомы команды ifconfig , route , netstat . На первый взгляд нет причин что-то менять, а лучшее как всегда враг хорошего.





Давайте узнаем почему Net-Tools уже не тот и как безболезненно с него перейти на iproute2 .

Что не так с ifconfig-ом?

Какие есть претензии к Net-Tools и насколько они обоснованны?

  • Использует устаревший ioctl , в то время как iproute2 использует актуальный netlink .
  • ifconfig показывает вторичные IP адреса как отдельные интерфейсы.
  • ifconfig не видит вторичные IP адреса без маркировки. Попробуйте запустить следующую команду и проверьте затем вывод в ifconfig . На интерфейсе eth0 IP адрес уже должен быть сконфигурен.
  • ifconfig не знает о существовании CIDR. Только традиционные IPv4 адреса.
  • ifconfig не умеет показывать физический адрес туннельных интерфейсов tun , tap , вместо адреса сплошные нули.
  • ifconfig не позволяет создавать создавать tun , tap устройства и статичные l2tp , ipip , gre тунели.
  • ifconfig не показывает одноранговые IP адреса, (peer IP). Можно сконфигурировать одноранговую сеть на eth0 , но ifconfig не покажет удаленный IP.
  • netstat , пытается быть дружественным в режиме показа статистики, показывая описание SNMP переменных, но не всегда это оправданно. По ссылке история о том, как понять, что такое timeout in transit . Кроме того такой вывод статистики нелегко скормить обработчику регулярных выражений.
  • netstat не выдает полную статистику, так как показывает только те SNMP переменные из /proc/net/ , которые определены в файле statistics.c.

Все перечисленные недостатки обусловлены тем, что проект слишком долго не развивался — последний релиз был в 2011 г, а ядро и сетевой стек за это время ушли далеко вперед. Справедливости ради надо отметить, что в последнее время работа над проектом возобновилась, но вряд ли это приведет к существенным изменениям в кодовой базе.

Переучиваемся на iproute2

С iproute2 можно получить все то же, что с Net-Tools и даже больше, но только синтаксис и вывод команд на терминал будут отличаться. Если честно, читабельность некоторых команд ip наводит на мысль, что новое не всегда лучшее.




Следующие две команды призваны заменить ifconfig без дополнительных ключей.

С ключем -c вывод будет цветным и более читабельным.

Просмотреть таблицу маршрутизации кратко.

Вся таблица маршрутизации.

Обратите внимание, что вывод команд из набора iproute2 зачастую не тривиально парсить в скрипте. Это не добавляет популярности мейнтейнерам, которые пытаются выкинуть Net-Tools из дистрибутива.

Просмотреть физические адреса соседних узлов из ARP кэша. Для наглядности варианты с Net-Tools и iproute2 пишем рядом.

Перейдем теперь к настройкам. Поднять интерфейс.

Задать IP адрес.

В отличии от Net-Tools, iproute2 позволяет также удалить IP адрес.

Добавить вторичный адрес.

И удаляем его же.

Добавляем маршрут по умолчанию (a. k. a. gateway).

Мы рассмотрели только базовые команды мониторинга и настройки, чуть менее чем полный список команд iproute2 по ссылке.

Nstat вместо netstat

Nstat в отличие от своего более старого аналога выдает только SNMP метрики в строго определенном порядке и выдает их все.

Еще одно отличие состоит в том, что netstat показывает кумулятивное значение метрик с момента запуска ОС, в то время как nstat по умолчанию показывает дельту значений и поэтому при первом запуске обеих команд значения будут одинаковы. Для того, чтобы nstat повел себя привычно, надо запускать его с ключем -s .

С ключем --zero получаем только нулевые значения.

Не знаю, хорошо ли это или плохо, но еще nstat умеет выдавать результат в формате json .

Ss вместо netstat

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

Отрадно, что синтаксис у обеих команд схожий, поэтому привыкать долго не придется.

Однако ss позволяет залезть буквально под капот tcp соединениям.

Тут есть все: таймеры подтверждения доставки, дорога туда-обратно, механизм контроля перегрузки канала cubic и много чего еще.

Тяни-толкай вокруг Net-Tools

По этому вопросу консенсуса в Linux сообществе пока нет. В OpenSuse в 2009 г. состоялся пленум завязалась дискуссия по этому вопросу, но на жесткие меры не пошли, а вот RedHat и Fedora в 2011 г. решили, что с них хватит, и уже начиная с 7-й версии RHEL не ставит Net-Tools. В 7.1 была безуспешная попытка его вернуть, что показывает неизбывную популярность Net-Tools. В Debian Linux после неудачной попытки в 2009 г. объявить Net-Tools устаревшим и начать процесс его замены, несколько лет об этом не вспоминали, и вот недавно спор возобновился с новой силой. Дело в том, что в Debian до сих пор значительное количество пакетов от него зависит. В Gentoo как всегда решаешь ты, ставить или нет, однако зависимостей по сабжу нет.

Мне лично кажется, что пока нет причин отказываться от Net-Tools там, где это возможно. Если у вас два с половиной сетевых интерфейса на локалхосте, включая loopback, вы спокойно можете продолжать использовать эти программы, но на приличном боевом или даже на тестовом сервере iproute2 все же будет предпочтительнее, как бы пальцы ни дергались набрать привычные старые команды. Рано или поздно все Linux дистрибутивы и даже Debian перестанут ставить этот пакет по умолчанию, и тогда знание команд из набора iproute2 вполне пригодится, хотя этот момент может наступить еще не скоро.


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

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

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

Пример 1

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

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

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

Пример 2

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

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

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

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

Заключение

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

Product Site
Documentation Site

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 ) и идентификаторы пользователей (ids, а не имя учётной записи пользователя);

-p , перечисляет уже запущенные на данной машине процессы; этот параметр будет более полезен при запуске netstat от лица суперпользователя, поскольку обычные пользователи увидят только те процессы, которые они сами запустили;

Другие параметры, описанные в страницах руководства netstat (8) , позволяют более тонко настроить отображаемый программой результат. На практике, первые пять параметров (описываемые чуть выше) настолько часто используются вместе, что системные и сетевые администраторы практически рефлексивно используют netstat -tupan в своей работе. На несильно загруженной машине, типичный результат вывода команды будет выглядеть следующим образом:

Как и ожидалось, перечисляются установленные соединения, два соединения SSH в этом случае, и приложения, ожидающие входящие соединения (перечислены как СЛУШАЕТ - "LISTEN"), в частности почтовый сервер Exim4 прослушивает порт 25.

10.9.2. Удалённая диагностика: nmap

Команда nmap (в пакете с похожим именем) выполняет те же функции, что и netstat , только для удалённого диагностирования машин. Она может просканировать все "широко известные" порты на одном или на нескольких удалённых серверах, и перечислить порты, на которых приложения готовы дать ответ входящим соединениям. Кроме того, nmap имеет возможность определить некоторые из тех приложений, иногда даже и их номер версии. Недостатком данного инструмента является то, что поскольку он работает удалённо, то не может предоставить информацию о процессах или пользователях; однако, он может работать по нескольким целям одновременно.

Типичный вызов программы выглядит следующим образом: nmap и далее параметр -A (таким образом nmap пытается определить версию програмного обеспечения найденного сервера), а следом указываются один или более адресов IP или имён DNS машин для сканирования. Кроме этого, ещё много других параметров существует для тонкой настройки поведения программы nmap ; пожалуйста руководствуйтесь документацией, размещённой в страницах руководства - nmap (1) .

Как и ожидалось, приложения SSH и Exim4 слушают. Запомните, что не все приложения слушают на всех адресах IP. Пример: поскольку имеется возможность запустить Exim4 только на закольцованном интерфейсе lo , то эта программа появится в перечне в случае анализа локального хоста localhost , а не когда прослушивается mirtuel (это буквенное имя соответствует интерфейсу eth0 на той же машине).

10.9.3. Снифферы (перехватчики пакетов и анализаторы кадров): tcpdump and wireshark

Иногда, необходимо посмотреть, что фактически происходит в сети, пакет за пакетом. В таких случаях вызываются “анализаторы кадров”, более широко известные под именем сниффер . Такие инструменты просматривают все пакеты, проходящие по указанному сетевому интерфейсу, и отображают их в удобном для пользователя виде.

Давним и хорошо зарекомендовавшим себя инструментом в этой области является программа tcpdump , доступная как стандартный инструмент для большого количества разнообразных платформ. Она позволяет использовать многие разновидности перехвата трафика в сети, но представление этого трафика (для просмотра) остаётся довольно непонятным. Поэтому мы не будем в деталях описывать её далее.

Анализатор сетевого трафика wireshark

Рисунок 10.1. Анализатор сетевого трафика wireshark

In our example, the packets traveling over SSH are filtered out (with the !tcp.port == 22 filter). The packet currently displayed was developed at the transport layer of the SSHv2 protocol.

СОВЕТ Аналогом программы wireshark без графического интерфейса является: tshark

Когда невозможно запустить графический интерфейс, или не желаете делать этого по каким-то причинам, текстовая версия программы wireshark также существует под именем tshark (в отдельном пакете с именем tshark ). Большинство перехватывающих и декодирующих функций по прежнему доступны, но отсутствие графического интерфейса обязательно ограничит возможности по взаимодействию с программой (фильтрация пакетов после их перехвата, отслеживание указанного соединения TCP, и так далее). Эту программу можно использовать на первых порах - для целей перехвата трафика. Если вы намериваетесь в дальнейшем ещё как-то работать с перехваченными данными и вам для этого понадобится графический интерфейс, вывод работы программы может быть сохранён в файл, а далее этот файл можно открыть из графического интерфейса программы wireshark , запущенной на другой машине.

Читайте также: