Команда ss: проверка портов и процессов в Linux, сравнение с netstat
Какие порты на сервере Linux открыты и кто к нему подключён, вы проверяете командой ss. ss — это инструмент iproute2 для просмотра сокетов, который заменяет netstat. Проверка прослушиваемых (LISTEN) портов и соединений командой ss на сервере Debian 12 показала, что под обычной учётной записью имена программ, запущенных другими учётными записями, не появляются в столбце Process даже с -p.
Вывод ниже получен с английской locale. Адреса сервера и другой стороны указаны как примерные.
1️⃣ Основы работы с командой ss и столбцы вывода
Если запустить ss без параметров, прослушиваемые порты в вывод не попадут, и останутся только сокеты с установленным соединением. На тестовом сервере первые строки были сплошь Unix-сокетами (u_str, u_dgr), через которые программы внутри сервера обмениваются данными.
ss | head -n 5Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 1013903 * 1013904
u_dgr ESTAB 0 0 * 1013960 * 13394
u_str ESTAB 0 0 * 1013907 * 1013908
u_str ESTAB 0 0 * 46066198 * 46066199Поэтому, чтобы увидеть только TCP-соединения, добавьте -t. Unix-сокеты исчезнут, а на месте порта вместо номера появятся имена служб, например ssh и https.
ss -tState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:ssh 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:https
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:httpsЕсли добавить ещё и -n, номера портов останутся как есть и не будут заменяться именами служб.
ss -tnState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:22 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Столбцы Recv-Q и Send-Q означают разное в зависимости от состояния сокета. У подключённого сокета Recv-Q — это число принятых байт, которые программа ещё не прочитала, а Send-Q — число отправленных байт, получение которых другая сторона ещё не подтвердила.
У прослушивающего сокета Recv-Q означает число соединений в очереди, а Send-Q — максимальный размер очереди. Эти значения взяты из описания на странице man netstat(8) из net-tools.
2️⃣ Проверка портов в Linux (-tln, -uln, -tulpn)
В выводе без параметров нет портов, ожидающих соединений, поэтому для проверки открытых портов добавьте -l, который отбирает только прослушивающие сокеты. [ss -tln] выводит прослушиваемые TCP-порты в виде номеров.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Если в Local Address стоит 0.0.0.0, сокет принимает соединения на все IPv4-адреса сервера, а при 127.0.0.1 подключиться можно только изнутри сервера. [::] означает все адреса IPv6, поэтому порты 22, 80 и 443 открыты и по IPv4, и по IPv6.
Без -n номера портов заменяются именами служб. Порт 8080 отображается как http-alt.
ss -tlState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
LISTEN 0 511 127.0.0.1:http-alt 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 511 [::]:http [::]:*
LISTEN 0 511 [::]:https [::]:*UDP не устанавливает соединений, поэтому даже у прослушивающих сокетов нет состояния LISTEN. В столбце состояния вывода [ss -uln] везде было UNCONN. Порт 68 (bootpc) — это DHCP-клиент, а порт 123 (ntp) служит для синхронизации времени.
ss -ulnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
UNCONN 0 0 [::1]:123 [::]:*
UNCONN 0 0 [::]:123 [::]:*Чтобы увидеть TCP и UDP сразу, объедините параметры, как в [ss -tulpn]. Когда видов больше одного, в начале добавляется столбец Netid.
ss -tulpnNetid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
udp UNCONN 0 0 [::1]:123 [::]:*
udp UNCONN 0 0 [::]:123 [::]:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 511 [::]:80 [::]:*
tcp LISTEN 0 511 [::]:443 [::]:*3️⃣ Проверка процессов командой ss (-p)
-p — параметр, который выводит в столбце Process программу, использующую сокет. Однако при запуске [ss -tlnp] под обычной учётной записью на тестовом сервере столбец Process оказался пустым, как ниже, будто параметр не сработал.
ss -tlnpState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*ss находит процесс, использующий сокет, читая папку fd каждого процесса в /proc. Обычная учётная запись не может открыть папку fd процесса, запущенного другой учётной записью, поэтому имя этой программы в столбец не попадает. Если открыть под обычной учётной записью папку процесса 1, запущенного root, возникнет ошибка доступа.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedПрограммы, запущенные под вашей собственной учётной записью, появляются в столбце Process и у обычной учётной записи. Это проверено запуском простого веб-сервера python3 на порту 8000 адреса 127.0.0.1.
python3 -m http.server 8000 --bind 127.0.0.1 &После запуска добавьте [sport = :8000], чтобы вывести только строку порта 8000.
ss -tlnp sport = :8000State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:* users:(("python3",pid=343015,fd=3))В скобках после users по порядку указаны имя программы, pid и номер файлового дескриптора (fd).
Закончив проверку, остановите простой веб-сервер командой [kill %1]. Если после этого снова выполнить [ss -tln sport = :8000], останется только строка заголовка, а строки порта 8000 уже не будет.
Под учётной записью root ss может прочитать сведения обо всех процессах, поэтому столбец Process заполняется. Если на одном порту одновременно слушают несколько процессов, в скобках users идёт по записи на каждый из них. Имена программ и pid в выводе root ниже — примерные значения.
ss -tlnp sport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0 511 [::]:443 [::]:* users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))Чтобы найти программу по номеру порта, можно также использовать команду lsof в виде [lsof -i :443].
Как столбец Process меняется в зависимости от учётной записи, можно сравнить на схеме ниже, переключая учётные записи.
4️⃣ Параметры фильтрации ss по состоянию и порту
Даже после проверки открытых портов нужно отдельно отобрать, кто подключён к ним прямо сейчас. ss оставляет только нужные строки, если после параметров добавить условия фильтра.
Если после state указать имя состояния, останутся только сокеты в этом состоянии. Вывод [ss -tn state established] не содержит столбца State и начинается со столбца Recv-Q.
ss -tn state establishedRecv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114
0 0 203.0.113.10:26676 192.0.2.15:443
0 0 203.0.113.10:29714 192.0.2.16:443Порты фильтруются через dport (порт другой стороны) и sport (свой порт). Исходящие соединения сервера к внешним https-серверам отбираются через [dport = :443].
ss -tn dport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Если использовать sport вместе с -l, можно проверить только то, слушает ли этот порт.
ss -tln sport = :22State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*Несколько условий объединяются скобками и or и заключаются в одинарные кавычки, чтобы оболочка не разобрала скобки раньше. Ниже результат отбора только ssh-соединений по примеру со страницы man.
ss -tn state established '( dport = :ssh or sport = :ssh )'Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114TIME-WAIT — состояние, в котором соединение ненадолго остаётся после разрыва. В выводе по умолчанию его нет, поэтому увидеть его можно, только отобрав отдельно через [state time-wait].
ss -tn state time-waitRecv-Q Send-Q Local Address:Port Peer Address:PortProcess
0 0 127.0.0.1:28750 127.0.0.1:80
0 0 127.0.0.1:57698 127.0.0.1:8080
0 0 [::1]:31936 [::1]:80Если ошибиться в имени состояния, команда сразу завершится, оставив одну строку ошибки [wrong state name]. Ниже результат с намеренно введённым foo. Допустимые имена перечислены в строке TCP-STATES вывода [ss -h].
ss -tn state fooss: wrong state name: foo📌 Основные опции: результаты из этой статьи
| Опция | Назначение | Результат в этой статье | |
|---|---|---|---|
| -t | Выводит только TCP-сокеты | Unix-сокеты исчезают, на месте порта появляются имена служб, например ssh и https | |
| -n | Выводит номера портов вместо имён служб | В ss -tn ssh отображается как 22, а https как 443 | |
| -l | Выводит только прослушивающие (LISTEN) сокеты | ss -tln показывает прослушиваемые порты, например 22, 80 и 443 | |
| -u | Выводит только UDP-сокеты | В столбце состояния ss -uln везде UNCONN | |
| -p | Выводит в столбце Process программу, использующую сокет | Под обычной учётной записью имя и pid есть только у python3, запущенного моей учётной записью, а программы других учётных записей пусты | |
| -s | Подводит итог по числу сокетов каждого вида вместо списка | estab 9 в строке TCP совпадает с 9 строками вывода state established без заголовка | |
| -4 | Выводит только IPv4-сокеты | В ss -t4ln исчезают строки, начинающиеся с [::] | |
| -6 | Выводит только IPv6-сокеты | В ss -t6ln исчезают строки, начинающиеся с 0.0.0.0 и 127.0.0.1 | |
| -H | Выводит только строки сокетов без заголовка | Число строк ss -H -tln | wc -l не включает заголовок | |
| state СОСТОЯНИЕ | Оставляет только сокеты в этом состоянии | Вывод state established начинается с Recv-Q без столбца State, несуществующее имя даёт [wrong state name: foo] | |
| dport = :ПОРТ | Фильтрует по порту другой стороны | dport = :443 показывает две строки исходящих соединений к внешним https-серверам | |
| sport = :ПОРТ | Фильтрует по своему порту | sport = :22 вместе с -l показывает две прослушивающие строки порта 22, IPv4 и IPv6 | |
| src АДРЕС | Оставляет только сокеты этого адреса | ss -tln src 127.0.0.1 показывает только порты на 127.0.0.1, которые принимают соединения лишь изнутри сервера |
📎 Другие опции: по официальному руководству
| Опция | Назначение | |
|---|---|---|
| -a, --all | Выводит вместе прослушивающие и подключённые сокеты | |
| -r, --resolve | Преобразует адреса и номера портов в имена | |
| -e, --extended | Выводит подробные сведения о каждом сокете, например uid и inode | |
| -o, --options | Выводит сведения о таймерах, например о повторной передаче TCP и keepalive | |
| -m, --memory | Выводит память, которую использует каждый сокет | |
| -i, --info | Выводит внутренние сведения TCP (rtt, cwnd и т. д.) | |
| -x, --unix | Выводит только сокеты домена Unix | |
| -w, --raw | Выводит только RAW-сокеты | |
| -f СЕМЕЙСТВО | Отбирает по семейству сокетов, например unix, inet, inet6, link или netlink | |
| -Q, --no-queues | Выводит без столбцов Recv-Q и Send-Q | |
| -K, --kill | Принудительно закрывает сокеты, подходящие под фильтр; сокеты без поддержки ядра пропускаются | |
| -E, --events | Непрерывно выводит закрывающиеся сокеты | |
| -V, --version | Выводит сведения о версии |
🔲 Симулятор команды ss
В симуляторе ниже вы можете сами ввести рассмотренные параметры и фильтры и сравнить вывод с [netstat -tln].
5️⃣ Сводка по сокетам в ss (-s)
-s вместо списка сокетов выводит сводку по числу сокетов каждого вида. Согласно странице man, он не пересчитывает список по одному, а собирает числа из разных статистик.
ss -sTotal: 340
TCP: 48 (estab 9, closed 15, orphaned 0, timewait 13)
Transport Total IP IPv6
RAW 0 0 0
UDP 8 4 4
TCP 33 25 8
INET 41 29 12
FRAG 0 0 0estab в строке TCP — число соединений, установленных в данный момент. Поэтому его можно сверить с числом строк, которые выводит [state established] в тот же момент.
ss -tn state established | wc -l10Если из 10 строк вывода убрать одну строку заголовка, останется 9 — столько же, сколько estab 9 у -s. timewait 13 — число сокетов TIME-WAIT, которые были видны только при отборе через [state time-wait].
6️⃣ Команда ss в сравнении с netstat
netstat входит в пакет net-tools, на странице man которого netstat назван почти вышедшей из употребления программой (mostly obsolete) и рекомендуется использовать ss. Однако скрипты, написанные под формат вывода netstat, не смогут прочитать вывод ss без изменений, потому что порядок столбцов и запись адресов отличаются.
При выводе прослушиваемых TCP-портов одного и того же сервера обеими командами netstat поставил состояние в самый конец и записал IPv6-адреса как :::22.
netstat -tlnActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::443 :::* LISTENВ ss состояние идёт в самом начале, а IPv6-адреса заключаются в квадратные скобки, например [::]:22.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Часто используемые параметры netstat соответствуют следующим командам ss и ip.
| netstat | Команда-замена / что показывает |
|---|---|
| netstat -tln | ss -tlnПрослушиваемые TCP-порты в виде номеров |
| netstat -tulpn | ss -tulpnПрослушиваемые TCP- и UDP-порты с программами |
| netstat -tan | ss -tanВсе TCP-сокеты в виде номеров |
| netstat -r | ip routeТаблица маршрутизации |
| netstat -i | ip -s linkСтатистика сетевых интерфейсов |
🔢 FAQ & рекомендуемые материалы











ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.