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

Содержание
Открытые порты одной командой: 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/tcp | sshd | Сервер SSH, если установлен openssh-server |
| 53/tcp, 53/udp на 127.0.0.53 и 127.0.0.54 | systemd-resolved | Локальный DNS-кэш (Ubuntu, Fedora) |
| 5355/tcp, 5355/udp | systemd-resolved | LLMNR, поиск имён в локальной сети |
| 5353/udp | avahi-daemon | mDNS: имена .local, поиск принтеров |
| 631/tcp на 127.0.0.1 | cupsd | Служба печати CUPS |
| 323/udp на 127.0.0.1 | chronyd | Управление синхронизацией времени |
| 68/udp | NetworkManager, dhclient | Получение адреса по DHCP |
| 22000/tcp, 21027/udp | syncthing | Синхронизация файлов, если установлен |
Набор зависит от дистрибутива: в 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.
Как освободить занятый порт
Порядок действий от мягкого к жёсткому:
- Если это служба, остановите её:
sudo systemctl stop apache2. Чтобы не запускалась после перезагрузки:sudo systemctl disable --now apache2. - Если служба запускается сокетом, отключать нужно и его:
sudo systemctl disable --now cups.socket cups.service, иначе systemd снова откроет порт. - Если это ваш процесс без службы, завершите его по PID:
kill 2345, а если он не реагирует,kill -9 2345. - Быстрый, но грубый вариант:
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, в Fedorasudo 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.
Документация и источники
- ss(8) manual page, Linux man-pages / iproute2, 2026
- Nmap Reference Guide, Nmap Project, 2026
- lsof(8), lsof-org, 2026
Читайте также
- systemctl в Linux: управление службами и автозагрузкой
- Настройка UFW: включаем firewall в Ubuntu и открываем нужные порты
- Nftables: понятный firewall для домашнего компьютера и сервера
- htop и процессы Linux: как найти нагрузку и правильно убить процесс
- Защита SSH-сервера в Linux: ключи, ограничения и журналирование
- Настройка сети в Linux: статический IP через nmcli, netplan и ip
Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.