ss vs netstat: какая команда для портов нужна в Linux
ss против netstat: на современном Linux netstat устарел, а ss заменяет его один в один. Таблица соответствий флагов, поиск процесса по порту, шпаргалка.
Ставьте на ss — это текущий стандарт в любом современном дистрибутиве Linux, а netstat там остался в наследство. В Ubuntu, Fedora и Debian бинарник netstat теперь живёт в опциональном пакете net-tools, тогда как ss встроен в iproute2 и установлен везде. ss ещё и быстрее на нагруженных серверах: он читает статистику сокетов напрямую из ядра, а не обходит _/proc_ по файлу за раз. Подвох — синтаксис: -tulpn не означает одно и то же везде, поэтому в этом руководстве — точная карта флагов, команды, которые стоит запомнить, и ответы на вопросы, возникающие посреди инцидента в два ночи.
Устарел ли netstat?
На Linux — фактически да. Пакет net-tools с netstat, ifconfig и route годами не поспевает за возможностями ядра и больше не ставится по умолчанию ни в одном крупном дистрибутиве. Он существует, работает, удалять ничего не нужно — но новые функции появляются только в iproute2 (пакет за ss и ip).
Три практических следствия:
- Нет на свежих установках. У дефолтного сервера Ubuntu 24.04 или Fedora нет
netstat, пока вы руками не поставитеnet-tools. Именно поэтому столько людей ищут «netstat equivalent» — бинарника просто нет. - Никакой современной информации о сокетах.
netstatстарше TCP fast open, статистики сокетов на уровне subflow и привязки сокетов к cgroup.ssсообщает всё это нативно. - Исключение — 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 кроссплатформенным скриптам и старой мышечной памяти, а эту страницу — для карты флагов.