Что такое ss и зачем ключи tulpn
Утилита ss (socket statistics) из набора iproute2 заменила устаревший netstat: работает быстрее и умеет больше. Она показывает сетевые сокеты: слушающие порты, установленные соединения и их состояния. Команда ss -tulpn выводит слушающие порты вместе с программами, которые их занимают.
Расшифровка ключей по буквам:
| Ключ | Назначение |
|---|---|
| -t | Показывать TCP |
| -u | Показывать UDP |
| -l | Только слушающие сокеты (в ожидании соединений) |
| -p | Показывать процесс, владеющий сокетом |
| -n | Числовые адреса и порты, без разрешения имён |
| -a | Все сокеты, не только слушающие |
| -4, -6 | Ограничить IPv4 или IPv6 |
Порядок букв не важен: ss -lntup даст тот же результат. Ключ -n стоит указывать всегда, иначе утилита будет заменять номера портов на названия служб и запрашивать имена узлов, что замедляет вывод и путает при чтении.
Для быстрых проверок хватает трёх вариантов: ss -tln для слушающих TCP-портов, ss -uln для UDP и ss -tulpn, когда важны процессы. Если вы работаете на удалённом сервере, полезно сохранить результат перед изменениями и сравнить его после: так сразу видно, какие службы добавились или пропали.
Как читать вывод
Пример (пример, адреса из блока документации):
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=812,fd=3)) tcp LISTEN 0 4096 127.0.0.1:5432 0.0.0.0:* users:(("postgres",pid=990,fd=6)) tcp LISTEN 0 511 *:443 *:* users:(("nginx",pid=1204,fd=7)) udp UNCONN 0 0 192.0.2.10:68 0.0.0.0:* users:(("dhclient",pid=640,fd=6))
Столбец Local Address:Port определяет, где и на каком порту слушает программа. Здесь три разных случая.
- 0.0.0.0:22 или [::]:22 или *:22: слушает на всех интерфейсах, доступна из сети (если не закрыта брандмауэром).
- 127.0.0.1:5432: слушает только на петле, доступна лишь с этого же компьютера. Так настраивают базы данных и служебные интерфейсы.
- 192.0.2.10:68: привязана к конкретному адресу интерфейса.
Столбец Process показывает имя программы, её PID и дескриптор. Для UDP состояние отображается как UNCONN: соединения в привычном смысле нет. Столбцы Recv-Q и Send-Q для слушающего сокета показывают текущую длину очереди принятых соединений и её максимум.
Для адресов IPv6 квадратные скобки вокруг адреса отделяют его от номера порта: [::]:22 означает порт 22 на всех IPv6-интерфейсах. Многие службы слушают одновременно и на 0.0.0.0, и на [::], поэтому одна программа может занимать две строки в выводе. Это не дублирование.
Фильтры и полезные варианты
Для точной проверки вывод можно сузить. Вот проверенные приёмы.
- ss -tln: только слушающие TCP-порты без процессов (не нужны права root).
- ss -tlnp 'sport = :443': кто слушает порт 443.
- ss -tn state established: установленные TCP-соединения.
- ss -s: краткая сводка по числу сокетов разных типов.
- ss -tan | grep :8080: поиск нужного порта простым фильтром.
- ss -o state established: с таймерами соединений.
Фильтр в кавычках соответствует синтаксису ss: sport означает порт источника, то есть локальный порт слушающего сервиса, а dport порт назначения. Кавычки нужны, чтобы оболочка не разбирала символы. Если фильтр не срабатывает, воспользуйтесь простым grep по выводу: он менее изящен, но надёжен.
Для просмотра процессов других пользователей команду выполняйте с sudo, иначе столбец Process останется пустым для чужих сокетов, и это частая причина недоумения.
Как понять, что порт доступен снаружи
Факт, что программа слушает порт, ещё не значит, что до неё можно достучаться из сети. Нужно учесть несколько уровней.
- Адрес прослушивания. Если это 127.0.0.1, снаружи служба недоступна. Чтобы открыть, нужно менять настройку самой программы.
- Брандмауэр на компьютере (ufw, nftables, firewalld). Он может блокировать порт даже при 0.0.0.0.
- Роутер и NAT. Для доступа из интернета к домашней машине необходим проброс порта.
- Правила провайдера или облачной платформы для серверов.
Проверяйте изнутри с помощью ss, а снаружи с другого компьютера подключением к порту. Как проверить порт удалённо, описано на страницах про nc и Test-NetConnection. Если на вашем сервере обнаружились неожиданные открытые порты, найдите процесс по PID и разберитесь, кто его запустил: лишние слушающие службы это лишняя поверхность для атак.
Сканирование портов чужих серверов без разрешения недопустимо. Проверяйте только свои машины.
Перед выводом о том, что порт «открыт в интернет», обязательно проверьте с внешней точки. Локальный вывод ss показывает лишь то, что программа готова принимать соединения, а фактическая доступность зависит от цепочки брандмауэров и правил трансляции адресов на пути.
Сравнение с netstat и lsof
Netstat из пакета net-tools делает похожее, но устарел и часто не установлен. Привычная команда netstat -tulpn даёт близкий по смыслу вывод, но работает медленнее на системах с большим числом соединений. Ss читает информацию напрямую от ядра.
Lsof -i тоже показывает сетевые сокеты по процессам и есть в Linux и macOS, о нём рассказывает отдельная страница. В macOS команды ss нет: там используют netstat и lsof.
Для Windows аналог задачи: netstat -ano, описано на соседней странице. Когда нужно найти, кто занял конкретный порт, во всех системах порядок тот же: определить порт, найти процесс, решить, останавливать его или менять настройку. Начинайте с ss -tulpn, а если программа не видна, повторите с sudo.