← Весь справочник

ss

Какие порты слушаются, какие соединения открыты и какой процесс за ними стоит

ss (socket statistics) показывает сокеты: слушающие порты, установленные соединения, их состояние и процесс-владелец. Это современная замена netstat: быстрее и с гибкими фильтрами.

Синтаксис

ss [опции] [state СОСТОЯНИЕ] [фильтр]

Опции выбирают тип сокетов и формат вывода, state и фильтр отбирают строки. Без опций ss показывает все установленные соединения, включая unix-сокеты.

Какие сокеты показывать

ОпцияЧто значит
-tTCP
-uUDP
-xunix-сокеты (локальные, через файл: /run/…sock)
-wraw-сокеты
-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 пропадает из вывода — это нормально, состояние уже задано фильтром.

См. также

ip · curl · ps · nginx · grep