ss vs netstat: какая команда для портов нужна в Linux

ss против netstat: на современном Linux netstat устарел, а ss заменяет его один в один. Таблица соответствий флагов, поиск процесса по порту, шпаргалка.

HUMANавтор @mrsaynothing51d4 мин чтения

Ставьте на ss — это текущий стандарт в любом современном дистрибутиве Linux, а netstat там остался в наследство. В Ubuntu, Fedora и Debian бинарник netstat теперь живёт в опциональном пакете net-tools, тогда как ss встроен в iproute2 и установлен везде. ss ещё и быстрее на нагруженных серверах: он читает статистику сокетов напрямую из ядра, а не обходит _/proc_ по файлу за раз. Подвох — синтаксис: -tulpn не означает одно и то же везде, поэтому в этом руководстве — точная карта флагов, команды, которые стоит запомнить, и ответы на вопросы, возникающие посреди инцидента в два ночи.

Устарел ли netstat?

На Linux — фактически да. Пакет net-tools с netstat, ifconfig и route годами не поспевает за возможностями ядра и больше не ставится по умолчанию ни в одном крупном дистрибутиве. Он существует, работает, удалять ничего не нужно — но новые функции появляются только в iproute2 (пакет за ss и ip).

Три практических следствия:

  1. Нет на свежих установках. У дефолтного сервера Ubuntu 24.04 или Fedora нет netstat, пока вы руками не поставите net-tools. Именно поэтому столько людей ищут «netstat equivalent» — бинарника просто нет.
  2. Никакой современной информации о сокетах. netstat старше TCP fast open, статистики сокетов на уровне subflow и привязки сокетов к cgroup. ss сообщает всё это нативно.
  3. Исключение — Windows. Там netstat жив-здоров: netstat -ano по-прежнему стандартный способ сопоставить PID со слушающим портом. История с устареванием касается только Linux.

Что делает команда ss в Linux?

ss расшифровывается как «socket statistics». Она выгружает взгляд ядра на каждый TCP-, UDP- и Unix-сокет: состояние, адреса, порты, процессы, таймеры и глубину очередей. Рабочая форма:

# Всё, что слушает, вместе с владеющим процессом
sudo ss -tulpn

Флаг за флагом это читается: TCP (-t), UDP (-u), только слушающие сокеты (-l), показать процессы (-p), числовой вывод без DNS-запросов (-n). sudo важно для -p: без root вы увидите порты, но не получите имён процессов чужих сокетов.

Ещё два однострочника, покрывающих большую часть работы:

# Все установленные соединения с портом 443 и обратно, с процессами
sudo ss -tnp 'sport = :443 or dport = :443'

# Сводная таблица: сколько сокетов в каждом состоянии
ss -s

Синтаксис фильтров — настоящее преимущество перед netstat-овским «грепай и молись»: фильтр исполняется внутри ядра, поэтому он точный, а не текстовый.

Как проверить, какой процесс занял порт?

Самая частая причина достать любой из этих инструментов. С ss:

sudo ss -ltnp 'sport = :8080'

Пример вывода на машине с dev-сервером:

State   Recv-Q  Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN  0       511     *:8080              *:*               users:(("node",pid=214113,fd=18))

Поле users:(...) сразу даёт имя процесса и PID — вторая команда не нужна. Если порт занят, а процесса не видно, обычно перед вами сокет в другом network namespace (контейнер). С хоста выполните sudo ss -ltnp, найдите порт с пустой колонкой Process, а затем сверьте с docker ps или зайдите в namespace контейнера через nsenter.

Предпочитаете специализированные инструменты? sudo lsof -i :8080 -sTCP:LISTEN делает то же самое и одинаково работает на macOS и большинстве BSD — потому и доживает в runbook'ах. Но на Linux ss уже установлен.

Чем ss отличается от netstat?

Работа одна, сантехника разная: netstat скребёт _proc/net/tcp_ в userspace, а ss через netlink спрашивает ядро напрямую — поэтому ss отвечает за миллисекунды на сервере с 50 тысячами открытых сокетов, а netstat нет. В повседневности разница — во флагах. Вот карта, которую стоит приклеить к монитору:

Вам нужно netstat ss
Слушающие TCP-порты + процесс netstat -tlpn ss -tlpn
Все TCP + UDP соединения netstat -tulpna ss -tulpna
Таблица маршрутизации netstat -r ip route
Статистика интерфейсов netstat -i ip -s link
Сводка по сокетам ядра — ss -s
Фильтр по порту внутри ядра — ss -tnp 'sport = :22'

Обратите внимание: первые две строки идентичны — по счастливой случайности короткие флаги ss совпали с netstat-овскими для базовых случаев, так что мышечная память в основном переживёт переезд. Нижние строки — там, где netstat нечего ответить: задачи маршрутизации и интерфейсов уехали в команду ip, а сводке и фильтру аналога нет вовсе.

Когда netstat всё ещё нужен?

Два честных случая. Первый — переносимость: в разнородном парке из Linux, AIX или старых BSD netstat — единственный синтаксис, который есть везде. Второй — непрерывность мышечной памяти в старых runbook'ах: если там написано netstat -tlpn, а на машине стоит net-tools, команда всё ещё работает.

В остальных случаях по умолчанию ss — и обновите runbook. Полезный напарник при переписывании runbook'ов на сервере — шпаргалка по journalctl, которая естественно сочетается с проверкой портов, когда вы диагностируете сервис, не желающий стартовать: /en/blog/2026-09-02/journalctl-cheat-sheet.

Почему команда ss не найдена?

Потому что вы либо на очень старом дистрибутиве (до ~2007 года, до эпохи iproute2), либо — куда вероятнее — вообще не на Linux. ss — не команда macOS: там есть lsof и netstat, но нет ss. С BSD в основном та же история. На Windows используйте netstat -ano или Get-NetTCPConnection из PowerShell.

Если вы точно на Linux и ss отсутствует, поставьте iproute2:

sudo apt install iproute2    # Debian/Ubuntu
sudo dnf install iproute2    # Fedora/RHEL

Ответ за 30 секунд

На Linux всегда ss вместо netstat: предустановлена, быстрее и умеет фильтровать внутри ядра. netstat -tlpn превращается в ss -tlpn, охота за процессом — в sudo ss -ltnp 'sport = :PORT', а таблицы маршрутизации теперь принадлежат ip route. Оставьте netstat кроссплатформенным скриптам и старой мышечной памяти, а эту страницу — для карты флагов.