ss
Какие порты слушаются, какие соединения открыты и какой процесс за ними стоит
ss (socket statistics) показывает сокеты: слушающие порты, установленные соединения, их состояние и процесс-владелец. Это современная замена netstat: быстрее и с гибкими фильтрами.
Синтаксис
ss [опции] [state СОСТОЯНИЕ] [фильтр]
Опции выбирают тип сокетов и формат вывода, state и фильтр отбирают строки. Без опций ss показывает все установленные соединения, включая unix-сокеты.
Какие сокеты показывать
| Опция | Что значит |
|---|---|
-t | TCP |
-u | UDP |
-x | unix-сокеты (локальные, через файл: /run/…sock) |
-w | raw-сокеты |
-l | только слушающие (LISTEN, у UDP — UNCONN) |
-a | все: и слушающие, и соединения |
-4 / -6 | только IPv4 / только IPv6 |
Что показывать о каждом сокете
| Опция | Что значит |
|---|---|
-n | числа вместо имён: :80, а не :http |
-r | наоборот, превращать IP в имена хостов |
-p | процесс-владелец: users:(("nginx",pid=812,fd=6)) |
-e | расширенно: uid, inode сокета, cgroup |
-o | таймеры TCP: keepalive, повторы передачи |
-i | внутренняя информация TCP: RTT, окно, алгоритм перегрузки |
-m | использование памяти сокетом |
-H | без строки заголовка — для wc -l и скриптов |
-O | каждая запись в одну строку (удобно с -i, -p) |
-s | только сводка: сколько сокетов какого типа и в каком состоянии |
Самые ходовые сочетания: ss -tlnp — кто слушает TCP-порты, ss -tunap — все TCP и UDP сокеты с процессами, ss -s — общая картина.
Колонки вывода
| Колонка | Что значит |
|---|---|
Netid | тип сокета: tcp, udp, u_str… (видна, когда выбрано несколько типов) |
State | состояние: LISTEN, ESTAB, TIME-WAIT, UNCONN… |
Recv-Q | у соединения — байты, пришедшие, но ещё не прочитанные программой; у LISTEN — соединения в очереди на accept() |
Send-Q | у соединения — отправленные, но не подтверждённые байты; у LISTEN — максимальный размер очереди (backlog) |
Local Address:Port | свой адрес и порт; 0.0.0.0 / [::] / * — все интерфейсы |
Peer Address:Port | адрес собеседника; * у слушающих сокетов |
Process | владелец (только с -p) |
Состояния TCP
| Состояние | Что значит |
|---|---|
LISTEN | ждёт входящих соединений |
ESTAB | соединение установлено |
SYN-SENT | ждём ответа на попытку подключиться — сервер не отвечает или фаервол режет |
SYN-RECV | входящее соединение на полпути |
TIME-WAIT | соединение закрыто нами, сокет выжидает (до минуты) — это нормально |
CLOSE-WAIT | собеседник закрыл, а программа ещё нет; если их много — утечка в приложении |
FIN-WAIT-1/2, LAST-ACK, CLOSING | промежуточные стадии закрытия |
В фильтре state имена пишутся строчными: established, listening, time-wait, close-wait, syn-sent. Есть группы: connected (все, кроме listening и closed), all. Обратный фильтр — exclude состояние.
Фильтры по адресу и порту
| Фильтр | Что значит |
|---|---|
sport = :80 | локальный порт (source port) |
dport = :5432 | удалённый порт — например, исходящие соединения к базе |
src 127.0.0.1 / dst 10.0.0.0/8 | локальный / удалённый адрес или подсеть |
sport > :1024, dport != :22 | сравнения: =, !=, <, >, <=, >= |
and, or, not, ( … ) | логика; скобки отделяй пробелами |
Фильтр бери в одинарные кавычки целиком: > и скобки иначе перехватит оболочка.
Примеры
# кто слушает TCP-порты: адрес, порт, процесс
ss -tlnp
# все TCP и UDP сокеты с процессами
ss -tunap
# слушает ли кто-то порт 8080
ss -tlnp 'sport = :8080'
# несколько портов сразу
ss -tlnp '( sport = :80 or sport = :443 )'
# слушающие порты выше 1024
ss -tln 'sport > :1024'
# установленные соединения к PostgreSQL
ss -tn state established '( dport = :5432 )'
# сколько сейчас установленных TCP-соединений
ss -Htn state established | wc -l
# зависшие соединения, которые приложение не закрывает
ss -tnp state close-wait
# какие UDP-порты открыты
ss -ulnp
# unix-сокеты, которые слушают (docker.sock, php-fpm и т.п.)
ss -xlp
# сводка по всем сокетам
ss -s
Подводные камни
grep :80ловит лишнее::8080,:8000. Фильтрsport = :80точный, а вgrepставь пробел после порта (':80 ').- Без
-nпорты показываются именами из/etc/services(:http,:ssh), иgrepпо номеру ничего не находит. - Колонка процессов пустая без прав.
-pпоказывает только процессы, к которым у тебя есть доступ; чужие видны от root. 0.0.0.0:80и127.0.0.1:80— разное. Первый принимает соединения со всех интерфейсов, второй — только с этой машины. Если сервис «не доступен снаружи», проверь адрес в колонкеLocal Address.[::]:80— отдельный IPv6-сокет. У nginx обычно две строки на порт: для IPv4 и для IPv6.- UDP не бывает в
LISTEN. Открытый UDP-порт имеет состояниеUNCONN;ss -ulпоказывает именно их. - Код выхода всегда
0, даже если под фильтр ничего не попало. В скрипте проверяй вывод:ss -Htln 'sport = :8080' | grep -q .. - После
state …колонкаStateпропадает из вывода — это нормально, состояние уже задано фильтром.