Укрощение ss: Как быстро проверить, какие порты слушают твои сервисы в Linux

Представьте бытовую ситуацию: вы пришли домой, вставляете ключ в замок, а там внутри уже торчит чей-то чужой ключ и дверь заперта. Приятного мало. В сетевом мире Linux происходит ровно то же самое.

Каждый раз, когда вы разворачиваете новый проект — будь то еще один инстанс онлайн-радио или почтовый сервер — программа пытается занять свой «домик» в сети (порт). И классическая проблема, с которой сталкивается каждый: сервис тупо отказывается запускаться, выплевывая в логи ошибку Address already in use (адрес уже используется). Это значит, что какой-то другой процесс в системе уже занял этот порт, и ядро Linux чисто физически не позволяет перехватить на себя поток данных.

Старые учебники и статьи до сих пор советуют использовать утилиту netstat. Забудьте про неё. В современных дистрибутивах (включая Debian 13) древний пакет net-tools признан устаревшим, а сам netstat безбожно тормозит на нагруженных серверах, потому что медленно выковыривает данные из виртуальной файловой системы /proc. На замену ему пришел чистый, быстрый и беспощадный инструмент из пакета iproute2 — утилита ss (Socket Statistics). Она берет данные напрямую из подсистемы ядра и отрабатывает мгновенно. Сегодня разберем базовые приемы сетевой гигиены.

Анатомия флагов: Разбираем главную комбинацию на пальцах

Если вы просто введете команду ss в терминале, система вывалит на вас полотно из тысяч строк активных соединений. Разбирать это глазами невозможно. Чтобы сузить поиск до сервисов, которые тихо сидят и ждут гостей (слушают сеть), админы используют стандартную «золотую» комбинацию флагов: -tulpn.

Давайте разберем физику каждой буквы без академической нудятины:

  • t (TCP) — показывать только TCP-сокеты. Это протокол с гарантией доставки данных (как заказное письмо с уведомлением): веб-сайты, API, базы данных, SSH.
  • u (UDP) — показывать только UDP-сокеты. Протокол быстрой отправки без подтверждений (как обычная рация): стриминг аудио/видео, DNS, голосовые каналы, VPN.
  • l (Listening) — показывать только слушающие сокеты. Все активные исходящие соединения (например, когда ваш сервер сам куда-то качает бэкап или обновляется) будут отсечены. Останутся только те, кто ждет входящих подключений.
  • p (Processes) — важнейший флаг. Показывает конкретное имя программы и её PID (номер процесса в системе), которая заняла порт. **Важно:** требует прав sudo, иначе ядро из соображений безопасности скроет имена владельцев портов.
  • n (Numeric) — выводить номера портов цифрами, а не словами. Без этого флага система попытается додумать за вас и напишет http вместо 80, или https вместо 443. Флаг n исключает путаницу и экономит ресурсы сервера.

Практическая магия: Читаем вывод команды

Выводим полный список всех локальных сервисов, которые открыли порты и ждут трафик:

sudo ss -tulpn

Перед вами появится чистая таблица. Чтобы не пугаться колонок, смотрите на две самые главные: Local Address:Port (какую «дверь» заняли) и Users / Process (кто именно там сидит).

Адресная инспекция (Куда смотрит ваш порт?):
Обращайте внимание на IP-адрес перед двоеточием в колонке Local Address:Port. Это важнейший момент безопасности:

  • 127.0.0.1:8080 или [::1]:8080 — сервис «спрятан» внутри сервера (на интерфейсе loopback). Снаружи из интернета до него никто не достучится напрямую. Это идеально, когда перед вашим приложением стоит реверс-прокси (например, Nginx или Apache), а сам скрипт изолирован.
  • 0.0.0.0:8000 или *:8000порт открыт для всего мира! Сервис виден на всех сетевых картах сервера. Если там висит незащищенная база данных или тестовый скрипт — к вам в гости может зайти любой сканер из сети.

Точечный поиск конкретного виновника через grep:
Допустим, ваш бот не может стартовать, потому что порт 8000 чем-то занят. Не нужно читать всю таблицу. Перенаправляем вывод через конвейер в утилиту поиска grep:

sudo ss -tulpn | grep :8000

Система моментально выдаст одну конкретную строку. В конце строки ищите блок users. Там будет написано что-то вроде: users:(("python3",pid=12345,fd=5)).

Расшифровка: порт занят Python-скриптом, которому система присвоила уникальный номер (PID) 12345. Цель обнаружена!

Что делать с процессом-нарушителем?

Вы нашли, кто занял ваш порт. У вас есть два пути решения проблемы:

1. Путь инженера (Штатная остановка): Если порт занят системным сервисом или демоном, корректно останавливаем его через системный менеджер:

sudo systemctl stop имя_сервиса

2. Путь ликвидатора (Жесткая зачистка): Если это зависший скрипт, фоновый процесс из screen/tmux или непонятный «зомби», который не реагирует на команды, выбиваем его из памяти по найденному ранее PID (номеру процесса):

sudo kill -9 12345

Команда kill -9 отправляет ядру сигнал SIGKILL — это мгновенное уничтожение процесса без возможности затянуть закрытие. Порт освобождается секунда в секунду.

Шпаргалка: Быстрые команды ss на все случаи жизни

Сохраняйте себе готовую таблицу для ежедневной работы с сервером:

Команда в терминале Что показывает система Зачем это нужно (простым языком)
ss -s Общая сводка по сокетам Мгновенно показывает: сколько всего соединений открыто. Полезно, если кажется, что сервер «ложится» под нагрузкой.
sudo ss -tulpn Все слушающие порты и их процессы Главная команда админа. Показывает, кто и какие порты занял прямо сейчас.
ss -ta Все TCP-соединения (и слушающие, и активные) Показывает не только открытые порты, но и тех клиентов, кто прямо сейчас обменивается данными с вашим сервером.
sudo ss -ti Глубокая статистика TCP-трафика Технический режим: показывает задержки (RTT), потери пакетов и скорость конкретных сетевых сессий.

Заключение

Контроль открытых портов — это не просто способ запустить падающий скрипт. Это базовая сетевая гигиена и ваша первая линия обороны. На боевом сервере не должно висеть ни одного забытого, бесхозного или случайно выпяченного в интернет порта.

Возьмите за правило: развернули новый сервис — сделайте sudo ss -tulpn, проверьте привязку IP и убедитесь, что все работает ровно так, как задумывалось.

👁️ 14

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

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

два × четыре =

root@phoenix901:~# connect
[×]

Получай дайджест раз в неделю.
Без спама.