Команда ss: проверка портов и процессов в Linux, сравнение с netstat

Тестовая средаСемейство DebianDebian 12iproute2 6.1.0обычная учётная запись пользователяПроверено 2026-11-04
Сетевые командыssРасположение/usr/bin/ss

Какие порты на сервере Linux открыты и кто к нему подключён, вы проверяете командой ss. ss — это инструмент iproute2 для просмотра сокетов, который заменяет netstat. Проверка прослушиваемых (LISTEN) портов и соединений командой ss на сервере Debian 12 показала, что под обычной учётной записью имена программ, запущенных другими учётными записями, не появляются в столбце Process даже с -p.

Вывод ниже получен с английской locale. Адреса сервера и другой стороны указаны как примерные.

1️⃣ Основы работы с командой ss и столбцы вывода

Если запустить ss без параметров, прослушиваемые порты в вывод не попадут, и останутся только сокеты с установленным соединением. На тестовом сервере первые строки были сплошь Unix-сокетами (u_str, u_dgr), через которые программы внутри сервера обмениваются данными.

ss | head -n 5
Netid 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 -t
State 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 -tn
State 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 -tln
State  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 -tl
State  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 -uln
State  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 -tulpn
Netid 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 -tlnp
State  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/fd
ls: 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 = :8000
State  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 = :443
State  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 меняется в зависимости от учётной записи, можно сравнить на схеме ниже, переключая учётные записи.

🧭 ss -p и учётные записи: когда заполняется столбец Process
Поясняющая схема
👤 Учётная запись
$# ss -tlnp
Прослушивающий сокетСведения о процессеСтолбец Process
0.0.0.0:22LISTEN
➜
/proc/812/fdВладелец: root
➜
Процессы других учётных записей: не читаютсяroot: читает все процессыСтолбец Process пустusers:(("sshd",pid=812,fd=3))
127.0.0.1:8080LISTEN
➜
/proc/2100/fdВладелец: root
➜
Процессы других учётных записей: не читаютсяroot: читает все процессыСтолбец Process пустusers:(("app",pid=2100,fd=3))
127.0.0.1:8000LISTEN
➜
/proc/343015/fdВладелец: user
➜
Процессы моей учётной записи: читаютсяroot: читает все процессыusers:(("python3",pid=343015,fd=3))
Обычная учётная запись не может прочитать сведения /proc о процессах других учётных записей, поэтому столбец Process в этих строках пуст, а заполняется только строка python3, запущенного под вашей учётной записью.
root может прочитать сведения обо всех процессах, поэтому для каждого прослушивающего сокета в столбце Process выводятся имя программы и pid.

4️⃣ Параметры фильтрации ss по состоянию и порту

  • ↪️ state, dport, sport

Даже после проверки открытых портов нужно отдельно отобрать, кто подключён к ним прямо сейчас. ss оставляет только нужные строки, если после параметров добавить условия фильтра.

Если после state указать имя состояния, останутся только сокеты в этом состоянии. Вывод [ss -tn state established] не содержит столбца State и начинается со столбца Recv-Q.

ss -tn state established
Recv-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 = :443
State 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 = :22
State  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:51114

TIME-WAIT — состояние, в котором соединение ненадолго остаётся после разрыва. В выводе по умолчанию его нет, поэтому увидеть его можно, только отобрав отдельно через [state time-wait].

ss -tn state time-wait
Recv-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 foo
ss: 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].

Симулятор команды ssiproute2 6.1.0
[root@server work]#
Это экран обычной учётной записи (user), который работает только в браузере; клавиши ↑↓ возвращают ранее введённые команды.

5️⃣ Сводка по сокетам в ss (-s)

-s вместо списка сокетов выводит сводку по числу сокетов каждого вида. Согласно странице man, он не пересчитывает список по одному, а собирает числа из разных статистик.

ss -s
Total: 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         0

estab в строке TCP — число соединений, установленных в данный момент. Поэтому его можно сверить с числом строк, которые выводит [state established] в тот же момент.

ss -tn state established | wc -l
10

Если из 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 -tln
Active 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 -tln
State  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 -tlnss -tlnПрослушиваемые TCP-порты в виде номеров
netstat -tulpnss -tulpnПрослушиваемые TCP- и UDP-порты с программами
netstat -tanss -tanВсе TCP-сокеты в виде номеров
netstat -rip routeТаблица маршрутизации
netstat -iip -s linkСтатистика сетевых интерфейсов
Команды ip, заменяющие netstat -r и netstat -i, указаны в разделе NOTES страницы man netstat(8) из net-tools.

🔢 FAQ & рекомендуемые материалы

С -4 остаются только IPv4-сокеты, с -6 — только IPv6-сокеты. В [ss -t4ln] пропали строки, начинающиеся с [::], а в [ss -t6ln] — строки, начинающиеся с 0.0.0.0 и 127.0.0.1.

Если после src указать адрес, останутся только прослушивающие сокеты этого адреса. [ss -tln src 127.0.0.1] вывел только порты на 127.0.0.1, к которым нельзя подключиться снаружи сервера.

С -H выводятся только строки сокетов без заголовка. При подсчёте строк, как в [ss -H -tln | wc -l], строка заголовка не учитывается.

🧭 Рекомендуемые материалы о сетевых командах 13 статей · 3 источника
🗂️ Сетевые команды
📄 Команда ip 📄 Команды netstat · ifconfig 📄 Команда nmtui 📄 Команда ss
📄 Команда SSH 📄 Команда rsync 📄 Команда wget 📄 Команды rz · sz
📄 Команда host 📄 Команда nslookup
📄 Команда iptables 📄 Команда firewall-cmd 📄 Команда certbot

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Докажите, что вы человек: 10   +   1   =