LinuxRuLinux без лишней теории
Сеть

Как посмотреть открытые порты в Linux и найти процесс на порту

Редакция LinuxRu7 мин чтенияИнструкции

Открытые порты в Linux показывает команда sudo ss -tulpn: TCP и UDP, только слушающие, с именем процесса и PID. Узнать, какой процесс занимает конкретный порт, помогут sudo ss -tulpn 'sport = :8080' и sudo lsof -i :8080. Ниже разбор вывода, освобождение порта и проверка снаружи через nmap.

Как посмотреть открытые порты в Linux и найти процесс на порту
Фото: Simon A. Eugster, CC BY-SA 3.0, Wikimedia Commons
Содержание
  1. Команда ss -tulpn
  2. Адрес и доступность
  3. Что слушает система
  4. Кто занял порт
  5. Освободить порт
  6. netstat и lsof
  7. Проверка снаружи
  8. Порт закрыт снаружи
  9. Частые вопросы

Открытые порты одной командой: ss -tulpn

Утилита ss из пакета iproute2 есть в любом современном дистрибутиве из коробки и заменила устаревший netstat. Список портов, на которых система ждёт подключений:

sudo ss -tulpn

Ключи складываются в легко запоминаемое слово:

  • -t - TCP-сокеты, -u - UDP-сокеты;
  • -l - только слушающие (listening), то есть открытые для входящих подключений;
  • -p - показать процесс и его PID;
  • -n - числа вместо имён: 22, а не ssh, и без медленного обратного DNS.

Без sudo команда тоже работает, но колонка процесса будет заполнена только для ваших собственных программ. Пример строки вывода:

Netid State  Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp   LISTEN 0      4096         0.0.0.0:22        0.0.0.0:*     users:(("sshd",pid=1012,fd=3))

Здесь порт 22 по TCP слушает процесс sshd с PID 1012 на всех IPv4-адресах. Колонки Recv-Q и Send-Q для слушающих сокетов показывают очередь подключений, при обычной диагностике на них можно не смотреть.

Полезные варианты

# только TCP и только IPv4
sudo ss -4 -tlnp
# все установленные TCP-соединения с процессами
sudo ss -tnp state established
# кто подключён к SSH этого сервера
ss -tn state established '( sport = :22 )'
# сводка по количеству сокетов
ss -s

Наблюдение и проверки в скриптах

Чтобы увидеть, когда сервис откроет порт после перезапуска, обновляйте список раз в секунду. Для скриптов мониторинга удобен ключ -H, который убирает строку заголовка: пустой вывод значит, что порт никто не слушает.

# обновлять вывод каждую секунду, выход Ctrl+C
sudo watch -n1 ss -tlnp
# проверка в скрипте: слушает ли кто-нибудь 5432
if ss -Htln 'sport = :5432' | grep -q .; then
  echo "PostgreSQL слушает"
else
  echo "порт 5432 закрыт" >&2
fi

Кому доступен порт: читаем Local Address

Сам по себе номер порта ничего не говорит о безопасности. Важно, на каком адресе он открыт:

  • 0.0.0.0:порт и [::]:порт или *:порт - слушает на всех интерфейсах, к сервису можно подключиться по сети (если не мешает файрвол).
  • 127.0.0.1:порт и [::1]:порт - только локальные подключения с этой же машины. Так обычно настроены базы данных и панели разработки.
  • 192.168.1.50:порт - только через конкретный интерфейс с этим адресом.
  • 127.0.0.53%lo:53 - характерный адрес встроенного DNS-кэша systemd-resolved.

Отдельный случай - [::]:80. В Linux по умолчанию (net.ipv6.bindv6only = 0) такой сокет принимает и IPv6, и IPv4-подключения, поэтому nginx или sshd часто видны одной строкой на [::] и второй на 0.0.0.0, а иногда только первой.

Если вы поставили PostgreSQL или Redis и видите его на 0.0.0.0, это повод проверить конфиг и файрвол. Обратная ситуация тоже частая: разработчик запускает веб-сервер, а с другого компьютера он не открывается, потому что приложение слушает 127.0.0.1. Решается параметром вида --host 0.0.0.0 или listen в конфиге сервиса.

Какие порты открыты на обычной системе

На свежеустановленном десктопе список не пустой, и это нормально. Вот что встречается чаще всего:

Порт и адресПроцессНазначение
22/tcpsshdСервер SSH, если установлен openssh-server
53/tcp, 53/udp на 127.0.0.53 и 127.0.0.54systemd-resolvedЛокальный DNS-кэш (Ubuntu, Fedora)
5355/tcp, 5355/udpsystemd-resolvedLLMNR, поиск имён в локальной сети
5353/udpavahi-daemonmDNS: имена .local, поиск принтеров
631/tcp на 127.0.0.1cupsdСлужба печати CUPS
323/udp на 127.0.0.1chronydУправление синхронизацией времени
68/udpNetworkManager, dhclientПолучение адреса по DHCP
22000/tcp, 21027/udpsyncthingСинхронизация файлов, если установлен

Набор зависит от дистрибутива: в Ubuntu 26.04 и Fedora 44 по умолчанию есть systemd-resolved, в Debian 13 его обычно нет. Сервер SSH на десктопных версиях не ставится, пока вы сами не установите openssh-server. В Ubuntu ssh запускается через сокет-активацию systemd, поэтому в колонке процесса на порту 22 может стоять systemd с PID 1: порт держит systemd и передаёт подключение sshd. Слушающие сокеты systemd перечисляет команда systemctl list-sockets.

Какой процесс занимает порт

Типичная ситуация: nginx или Docker не стартует с ошибкой Address already in use. Нужно найти, кто занял порт. Три способа, выбирайте любой:

# ss с фильтром по порту
sudo ss -tulpn 'sport = :8080'
# lsof: процесс, пользователь, PID
sudo lsof -nP -i :8080
# только слушающий TCP-сокет
sudo lsof -nP -iTCP:8080 -sTCP:LISTEN
# fuser из пакета psmisc
sudo fuser -v 8080/tcp

Получили PID, теперь выясните, что это за программа и какой службой она запущена:

ps -fp 2345
# если процесс принадлежит юниту systemd, команда покажет его имя
systemctl status 2345
# путь к исполняемому файлу
sudo readlink /proc/2345/exe

Если systemctl status показал юнит, управляйте процессом через systemd, как описано в статье про systemctl. Процесс в контейнере покажется как docker-proxy или rootlessport; тогда смотрите docker ps или podman ps и колонку PORTS.

Как освободить занятый порт

Порядок действий от мягкого к жёсткому:

  1. Если это служба, остановите её: sudo systemctl stop apache2. Чтобы не запускалась после перезагрузки: sudo systemctl disable --now apache2.
  2. Если служба запускается сокетом, отключать нужно и его: sudo systemctl disable --now cups.socket cups.service, иначе systemd снова откроет порт.
  3. Если это ваш процесс без службы, завершите его по PID: kill 2345, а если он не реагирует, kill -9 2345.
  4. Быстрый, но грубый вариант: sudo fuser -k 8080/tcp завершит все процессы, использующие порт.

Перед kill -9 посмотрите ps -fp PID. Убить по ошибке sshd на удалённом сервере - верный способ потерять доступ. Часто правильнее сменить порт своего приложения, а не останавливать чужой сервис.

Если после остановки программа сразу не может снова занять порт, сокет может висеть в состоянии TIME-WAIT до минуты. Это видно в ss -tan, оно проходит само. Порты ниже 1024 обычный пользователь занять не может: приложению нужны права root или capability CAP_NET_BIND_SERVICE. Мониторить процессы удобно в htop.

netstat и lsof: старые и универсальные способы

netstat входит в пакет net-tools, который давно не ставится по умолчанию. Если вы привыкли к нему или выполняете старую инструкцию, установите его:

# Debian, Ubuntu
sudo apt install net-tools
# Fedora
sudo dnf install net-tools
# Arch
sudo pacman -S net-tools
# те же ключи, что у ss
sudo netstat -tulpn

Ключи -tulpn у netstat означают то же самое, что у ss, вывод похож. Новых возможностей в net-tools не появляется, поэтому в скриптах лучше сразу писать ss.

lsof показывает открытые файлы, а сетевой сокет для ядра тоже файл. Это удобно, когда начинаешь не с порта, а с программы:

# все сетевые соединения и порты процесса
sudo lsof -nP -a -p 2345 -i
# все слушающие TCP-порты системы
sudo lsof -nP -iTCP -sTCP:LISTEN
# сетевая активность пользователя
sudo lsof -nP -a -u www-data -i

В минимальных системах lsof тоже может отсутствовать: пакет называется lsof во всех основных дистрибутивах.

Проверка порта снаружи: nmap и nc

ss показывает, что слушает сама машина. Но доступен ли порт из сети, решает ещё и файрвол, поэтому проверяйте с другого компьютера:

# установка: пакет nmap в apt, dnf и pacman
sudo apt install nmap
# основные порты сервера
nmap -p 22,80,443 192.168.1.50
# все 65535 TCP-портов
nmap -p- 192.168.1.50
# версии сервисов на открытых портах
nmap -sV -p 22,80 192.168.1.50
# UDP медленнее и требует root
sudo nmap -sU --top-ports 20 192.168.1.50
# быстрая проверка одного порта
nc -zv 192.168.1.50 22

Статус open значит, что порт принимает подключения, closed - хост доступен, но на порту никто не слушает, filtered - ответа нет, пакеты режет файрвол. Сканируйте только свои машины и сети, где у вас есть разрешение: сканирование чужих серверов может нарушать правила хостинга.

Утилита nc в Debian и Ubuntu ставится пакетом netcat-openbsd, в Fedora входит в nmap-ncat, в Arch пакет openbsd-netcat. Если нет ни того, ни другого, проверить TCP-порт может сам bash: timeout 3 bash -c '</dev/tcp/192.168.1.50/22' && echo open.

Порт слушается, но снаружи не открывается

  • Сервис слушает 127.0.0.1. Смотрите колонку Local Address в ss -tlnp и меняйте адрес в конфиге программы.
  • Файрвол системы. В Ubuntu проверьте sudo ufw status, в Fedora sudo firewall-cmd --list-all, в остальных sudo nft list ruleset. Настройка разобрана в статьях про ufw и про nftables.
  • Docker и файрвол. Опубликованные через -p порты контейнеров Docker добавляет в свои правила мимо ufw, поэтому они могут быть открыты, даже если ufw их запрещает. Публикуйте как -p 127.0.0.1:8080:80, если доступ снаружи не нужен.
  • Роутер и провайдер. Из интернета домашний сервер не виден без проброса порта на роутере, а за CGNAT провайдера проброс не поможет. У облачных VPS дополнительно проверьте группы безопасности в панели.

Полный список фильтров ss описан в man ss.

Частые вопросы

Как узнать, какой процесс слушает порт 80?

sudo ss -tlnp 'sport = :80' или sudo lsof -nP -i :80. В выводе будет имя программы и PID, дальше systemctl status PID покажет службу.

Почему ss не показывает имя процесса?

Без sudo видны только ваши собственные процессы. Запустите команду с sudo.

Чем ss лучше netstat?

ss входит в iproute2 и установлен по умолчанию, работает быстрее и поддерживает фильтры. netstat из net-tools больше не развивается, но ключи -tulpn у них совпадают.

Что значит 0.0.0.0 в списке портов?

Сервис слушает на всех IPv4-интерфейсах и доступен по сети, если не закрыт файрволом. 127.0.0.1 означает доступ только с этой машины.

Как закрыть открытый порт?

Остановите и отключите службу через systemctl disable --now, либо запретите порт файрволом ufw, firewalld или nftables.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.