Открыли порт — не работает. Служба запущена — но кто-то уже занял нужный порт. Соединений много — но непонятно откуда. ss отвечает на все эти вопросы быстро и без лишних зависимостей.
Одна команда которая нужна чаще всего
Прежде чем изучать флаги — вот то что реально используется каждый день. Все слушающие TCP-порты с именами процессов:
ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=892,fd=3))
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1203,fd=6))
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1891,fd=21))
Четыре буквы в флаге: -t TCP, -l только listening, -n числа без DNS, -p показать процесс.
Что означает Local Address
0.0.0.0:80 — nginx принимает соединения на всех интерфейсах. Виден снаружи.
127.0.0.1:3306 — MySQL слушает только на localhost. Снаружи недоступен. Так и должно быть на большинстве серверов.
:::22 — IPv6-адрес, SSH слушает на всех интерфейсах включая IPv6.
Установка
ss входит в пакет iproute2 который стоит по умолчанию на всех современных дистрибутивах. Если по каким-то причинам его нет:
sudo apt install iproute2
Флаги по типу протокола
Только TCP:
ss -t
Только UDP:
ss -u
Unix-сокеты — межпроцессное взаимодействие:
ss -x
Все типы, все соединения:
ss -a
Найти что занимает конкретный порт
Порт 8080 занят — узнать чем:
ss -tlnp sport = :8080
Или через grep если флаги уже запомнились:
ss -tlnp | grep :8080
Колонка Process покажет имя и PID. Порт свободен — вывод будет пустым.
Посмотреть все соединения конкретного процесса
Найти PID процесса:
pgrep nginx
Все соединения этого PID:
ss -p | grep pid=1203
Фильтрация по адресам
Все соединения с конкретным удалённым хостом:
ss -tn dst 185.10.20.30
Соединения идущие с конкретного локального адреса:
ss -tn src 10.0.0.5
Соединения только с нестандартных портов:
ss -tn sport gt :1024
Комбинировать условия через and:
ss -tn dst 185.10.20.30 and dport = :443
Состояния TCP: диагностика нагрузки
TCP-соединение проходит через несколько состояний. На перегруженном сервере их накопление говорит о конкретных проблемах.
Только активные соединения:
ss -tn state established
Зависшие после завершения — при высокой нагрузке их бывает тысячи:
ss -tn state time-wait
Ожидают закрытия на стороне приложения:
ss -tn state close-wait
Посчитать количество TIME_WAIT:
ss -tn state time-wait | wc -l
Если цифра в тысячах — проблема с keep-alive или агрессивным открытием соединений.
Сводная статистика
Быстрый срез по всем протоколам:
ss -s
Total: 156
TCP: 89 (estab 12, closed 71, orphaned 0, timewait 71)
Здесь сразу видно соотношение established к time-wait. orphaned — соединения без привязанного процесса, могут указывать на утечку.
Мониторинг в реальном времени
ss сам по себе не обновляется — передать в watch:
Обновлять список портов каждую секунду:
watch -n 1 ss -tlnp
Только счётчики:
watch -n 1 ss -s
Заменить netstat: таблица соответствия
| Привычная netstat | Эквивалент ss |
|---|---|
netstat -tlnp |
ss -tlnp |
netstat -an |
ss -an |
netstat -s |
ss -s |
netstat -rn |
ip route |
netstat из пакета net-tools — в Ubuntu 20.04+ не установлен по умолчанию. ss из iproute2 — есть всегда.
Шпаргалка
| Задача | Команда |
|---|---|
| Listening порты с процессами | ss -tlnp |
| Все UDP | ss -uanp |
| Найти процесс на порту | ss -tlnp sport = :порт |
| Соединения с хостом | ss -tn dst IP |
| Только established | ss -tn state established |
| Количество TIME_WAIT | ss -tn state time-wait | wc -l |
| Статистика | ss -s |
| Мониторинг | watch -n 1 ss -tlnp |