Как посмотреть открытые порты в Linux: ss, lsof и nmap
Как в терминале Linux узнать, какие порты открыты и какая программа их слушает: ss -tulpn, lsof и fuser. Чем 0.0.0.0 отличается от 127.0.0.1, как проверить порт с другого компьютера через nc и nmap и что делать, если порт занят или недоступен снаружи.

Содержание
- 1ss: все открытые порты
- Как читать Local Address
- Только TCP, только один порт
- Активные соединения
- 2Какой процесс занял порт: lsof и fuser
- 3А как же netstat?
- 4Проверить порт снаружи: nc
- 5nmap: просканировать свой сервер
- 6Порт слушается, но снаружи не открывается
- 7Как закрыть лишний порт
- 8Популярные порты
- 9Шпаргалка
- 10Главные советы
- 11Частые вопросы
- Как посмотреть открытые порты в Linux?
- Как узнать, какой процесс занимает порт?
- Чем 0.0.0.0 отличается от 127.0.0.1 в выводе ss?
- Как проверить, открыт ли порт на удалённом сервере?
- Что делать с ошибкой «Address already in use»?
- Почему порт открыт на сервере, но недоступен из интернета?
- Как закрыть открытый порт в Linux?
Вопрос «какие порты открыты» возникает в двух ситуациях. Первая — что-то не работает: nginx не запускается с ошибкой Address already in use, сайт не открывается снаружи, игровой сервер не видят друзья. Вторая — безопасность: вы подняли VPS и хотите убедиться, что наружу смотрит только то, что должно, а не база данных без пароля.
В обоих случаях ответ дают три команды. ss показывает, кто слушает порты на самом сервере. lsof и fuser отвечают на вопрос «какой процесс занял этот порт». А nc и nmap проверяют порт со стороны — так, как его видит интернет. Все выводы ниже — с Ubuntu 24.04, на котором я запустил SSH, nginx и пару тестовых служб.
ss: все открытые порты
ss — современная замена netstat, она есть в любом свежем дистрибутиве из коробки. Главная команда, которую стоит запомнить целиком:
sudo ss -tulpnБуквы ключей:
- 🔌
-t— TCP,-u— UDP. - 👂
-l— только слушающие порты (те, что ждут подключений). Без него вы увидите и все текущие соединения. - ⚙️
-p— какая программа слушает. Для чужих процессов нуженsudo, иначе колонка будет пустой. - 🔢
-n— номера портов вместо названий (22, а неssh).
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 0.0.0.0:51820 0.0.0.0:* users:(("python3",pid=2175,fd=3))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2216,fd=5),("nginx",pid=2215,fd=5),("nginx",pid=2214,fd=5))
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1822,fd=3))
tcp LISTEN 0 5 127.0.0.1:8000 0.0.0.0:* users:(("python3",pid=2173,fd=3))Что здесь видно:
- 🌐 sshd на 22 и nginx на 80 слушают
0.0.0.0— к ним можно подключиться из любой сети, где доступен сервер. - 🏠 python3 на 8000 слушает
127.0.0.1— к нему можно подключиться только с самого сервера. Снаружи этот порт закрыт, даже если брандмауэр выключен. - 📡 UDP 51820 — состояние
UNCONN, а неLISTEN. У UDP нет соединений, поэтому так выглядит открытый UDP-порт. - 👥 nginx записан трижды с разными PID: это главный процесс и рабочие процессы, все они слушают один и тот же порт.
Как читать Local Address
Это самая важная колонка. Она говорит не только номер порта, но и на каком адресе его слушают:
| Local Address | Кто может подключиться |
|---|---|
0.0.0.0:80 | все по IPv4: локальная сеть и интернет, если сервер в нём виден |
*:80 или [::]:80 | все по IPv4 и IPv6 |
127.0.0.1:8000 | только программы на этом же сервере |
[::1]:8000 | то же для IPv6 |
192.168.1.25:3306 | только через этот сетевой интерфейс |
Отсюда правило: базы данных, Redis, панели управления и всё, что не должно торчать наружу, должны слушать 127.0.0.1. Тогда их не найдёт ни один сканер, даже если вы забыли настроить брандмауэр.
Только TCP, только один порт
На сервере с десятком служб полный список длинный. Сузить его можно фильтром:
sudo ss -tlnp 'sport = :80'State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=2216,fd=5),("nginx",pid=2215,fd=5),("nginx",pid=2214,fd=5))Если в ответ пришла только строка заголовков — порт никто не слушает. Попроще и без синтаксиса фильтров: sudo ss -tlnp | grep :80.
Активные соединения
Без ключа -l ss покажет не порты, а текущие подключения. Например, кто сейчас подключён по SSH:
ss -tn state established '( dport = :22 or sport = :22 )'Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 127.0.0.1:52538 127.0.0.1:22
0 0 127.0.0.1:22 127.0.0.1:52538В моём примере я подключился к серверу с него же, поэтому соединение видно с обеих сторон. На настоящем сервере в колонке Peer Address будут адреса тех, кто подключён. Если среди них незнакомые — их можно проверить в проверке IP-адреса.
Какой процесс занял порт: lsof и fuser
Классическая ситуация: вы запускаете службу, а она падает с ошибкой:
OSError: [Errno 98] Address already in useУ nginx это выглядит как bind() to 0.0.0.0:80 failed (98: Address already in use). Значит, порт уже кто-то занял. Найти кого — lsof:
sudo lsof -i :80COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 2214 root 5u IPv4 9255 0t0 TCP *:80 (LISTEN)
nginx 2215 www-data 5u IPv4 9255 0t0 TCP *:80 (LISTEN)
nginx 2216 www-data 5u IPv4 9255 0t0 TCP *:80 (LISTEN)Тут видно и программу, и PID, и пользователя: главный процесс nginx работает от root, рабочие — от www-data.
Все слушающие порты через lsof:
sudo lsof -i -P -n | grep LISTENКлюч -P выводит номера портов вместо названий, -n не тратит время на поиск имён хостов.
fuser даёт ту же информацию короче:
sudo fuser -v 80/tcp USER PID ACCESS COMMAND
80/tcp: root 2214 F.... nginx
www-data 2215 F.... nginx
www-data 2216 F.... nginxС ключом -k fuser сразу завершит все процессы на этом порту: sudo fuser -k 80/tcp. Удобно, но грубо. Если порт занимает служба, правильнее остановить её через sudo systemctl stop имя — иначе systemd просто перезапустит её снова. Как корректно завершать процессы — в статье Процессы в Linux: ps, top и kill.
А как же netstat?
Во многих инструкциях вы встретите netstat -tulpn. Команда работает и выдаёт почти то же самое, что ss, но входит в пакет net-tools, который в новых Ubuntu по умолчанию не ставится:
sudo apt install net-tools
sudo netstat -tulpnКлючи у них совпадают, поэтому привычка переносится один в один. Но ss быстрее и умеет больше — лучше привыкнуть к нему.
Проверить порт снаружи: nc
ss показывает, что порт слушается на сервере. Но открыт ли он для вас — зависит ещё от брандмауэра, роутера и провайдера. Проверить это можно только с другого компьютера. Самый простой способ — nc (netcat), он есть в Ubuntu и macOS:
nc -zv server 22
nc -zv server 3306Connection to server (127.0.0.1) 22 port [tcp/ssh] succeeded!
nc: connect to server (127.0.0.1) port 3306 (tcp) failed: Connection refused- ✅ succeeded — порт открыт и до него можно достучаться.
- 🚫 Connection refused — сервер доступен, но этот порт никто не слушает.
- ⏳ Долгое молчание, потом timeout — пакеты не доходят: их, скорее всего, отбрасывает брандмауэр или роутер.
Ключ -z — только проверить, ничего не отправляя, -v — подробный вывод. Для UDP добавьте -u, но учтите: проверка UDP ненадёжна, «succeeded» там часто означает лишь отсутствие явного отказа.
nmap: просканировать свой сервер
nmap проверяет сразу много портов и показывает картину так, как её видит атакующий. Установка — sudo apt install nmap, на Mac — brew install nmap.
nmap serverNmap scan report for server (192.168.1.25)
Host is up (0.0010s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
Nmap done: 1 IP address (1 host up) scanned in 0.07 secondsПо умолчанию nmap проверяет тысячу самых популярных портов. Все 65 535 — ключ -p-, определённые — -p 22,80,443. Узнать, что именно работает на порту и какой версии, — ключ -sV:
nmap -sV -p 22,80 serverPORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 9.6p1 Ubuntu 3ubuntu13.20 (Ubuntu Linux; protocol 2.0)
80/tcp closed http
Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernelСостояния портов в nmap:
| STATE | Что означает |
|---|---|
open | порт открыт, служба отвечает |
closed | сервер доступен, но порт никто не слушает |
filtered | ответа нет — порт закрыт брандмауэром |
Хорошая привычка после настройки VPS — запустить nmap -p- адрес_сервера со своего компьютера. В списке open должны остаться только те порты, которые вы открывали сознательно: обычно 22 (или ваш порт SSH), 80 и 443.
Порт слушается, но снаружи не открывается
Если ss на сервере показывает порт, а nc с другого компьютера — нет, проверьте по порядку:
- 🏠 Адрес в Local Address. Если там
127.0.0.1, служба принимает подключения только с самого сервера. Поменяйте в её настройках адрес на0.0.0.0или адрес нужного интерфейса. - 🧱 Брандмауэр на сервере. В Ubuntu это обычно UFW:
sudo ufw status. Если он включён, откройте порт:sudo ufw allow 8080/tcp. Подробно — в статье Защита Ubuntu Server. - 🛜 Роутер. Для домашнего сервера нужен проброс порта (port forwarding) с роутера на внутренний адрес сервера.
- 🌍 Провайдер. Если у вас «серый» адрес или CGNAT, входящие подключения из интернета до вас не дойдут, как ни настраивай. Проверить свой внешний адрес можно в проверке IP, а разобраться с адресами и масками — в калькуляторе подсетей.
- ☁️ Хостинг. У многих облачных провайдеров есть свой брандмауэр в панели управления — «группы безопасности» или «сетевые правила». Он работает до сервера, и
ufwо нём ничего не знает.
Как закрыть лишний порт
Есть три способа, от лучшего к худшему:
- 🛑 Не нужна служба — отключите её.
sudo systemctl disable --now имя. Нет программы — нет и порта. - 🏠 Нужна только локально — привяжите к 127.0.0.1. Для MySQL и MariaDB это
bind-address = 127.0.0.1в конфиге, для Redis —bind 127.0.0.1. После правки перезапустите службу и проверьтеss. - 🧱 Должна работать, но не для всех — закройте брандмауэром. Например, разрешить SSH только из домашней сети:
sudo ufw allow from 192.168.1.0/24 to any port 22.
Популярные порты
| Порт | Что обычно на нём |
|---|---|
| 22 | SSH |
| 80, 443 | веб-сервер: HTTP и HTTPS |
| 25, 465, 587 | почта (SMTP) |
| 53 | DNS |
| 139, 445 | Samba, общие папки Windows |
| 3306 | MySQL, MariaDB |
| 5432 | PostgreSQL |
| 6379 | Redis |
| 8006 | веб-интерфейс Proxmox |
| 51820/udp | WireGuard |
Порты ниже 1024 могут открывать только программы с правами root. Поэтому nginx стартует от root, а потом передаёт работу процессам www-data — это видно в выводе lsof выше.
Шпаргалка
| Задача | Команда |
|---|---|
| Все открытые порты с программами | sudo ss -tulpn |
| Только TCP | sudo ss -tlnp |
| Кто слушает порт 80 | sudo ss -tlnp 'sport = :80' |
| Какой процесс занял порт | sudo lsof -i :80 или sudo fuser -v 80/tcp |
| Активные соединения | ss -tn state established |
| Проверить порт с другого компьютера | nc -zv сервер порт |
| Просканировать свой сервер | nmap сервер, все порты — nmap -p- сервер |
| Версии служб | nmap -sV -p 22,80 сервер |
| Открыть порт в UFW | sudo ufw allow 8080/tcp |
Главные советы
- Запомните
ss -tulpn. Одна команда показывает все открытые порты и программы, которые их слушают. - Смотрите на адрес, а не только на порт.
127.0.0.1— доступно только с сервера,0.0.0.0— всем. - Базы данных — только на 127.0.0.1. Тогда их не найдёт ни один сканер, даже без брандмауэра.
- Проверяйте снаружи.
ssговорит, что слушает сервер, аncиnmapс другого компьютера — что видит интернет. - Ненужное — выключить. Лучший способ закрыть порт — остановить службу, которая его открыла.
- Сканируйте только своё. nmap по чужим адресам легко приводит к жалобе от хостера.
Частые вопросы
Как посмотреть открытые порты в Linux?
Выполните sudo ss -tulpn. Команда покажет все TCP- и UDP-порты, которые ждут подключений, и программы, которые их открыли. Без sudo колонка с программами будет пустой для чужих процессов. В старых инструкциях вместо этого встречается netstat -tulpn — он работает так же, но требует пакета net-tools.
Как узнать, какой процесс занимает порт?
sudo lsof -i :порт или sudo ss -tlnp 'sport = :порт'. Обе команды покажут имя программы и её PID. Короче всего — sudo fuser -v порт/tcp.
Чем 0.0.0.0 отличается от 127.0.0.1 в выводе ss?
127.0.0.1 значит, что служба принимает подключения только с самого компьютера. 0.0.0.0 — со всех сетевых интерфейсов, то есть из локальной сети и интернета, если до сервера можно достучаться. * и [::] — то же для IPv4 и IPv6 вместе.
Как проверить, открыт ли порт на удалённом сервере?
С другого компьютера выполните nc -zv адрес порт. Ответ succeeded — порт открыт, Connection refused — никто не слушает, долгое ожидание и timeout — порт закрыт брандмауэром. Для проверки многих портов сразу используйте nmap адрес.
Что делать с ошибкой «Address already in use»?
Порт уже занят другой программой. Найдите её через sudo lsof -i :порт и остановите — если это служба, через sudo systemctl stop имя. Либо настройте свою программу на другой порт.
Почему порт открыт на сервере, но недоступен из интернета?
Чаще всего служба слушает только 127.0.0.1, порт закрыт брандмауэром UFW или в панели хостинга, на роутере нет проброса порта или у провайдера серый IP. Проверяйте по порядку: адрес в ss, sudo ufw status, роутер, внешний IP.
Как закрыть открытый порт в Linux?
Лучше всего — остановить и отключить службу: sudo systemctl disable --now имя. Если служба нужна только локально, настройте её слушать 127.0.0.1. Если нужна, но не всем — ограничьте доступ брандмауэром, например sudo ufw deny 3306.
Если статья пригодилась — отметьте, это помогает выбирать темы
Статья помогла?
Комментарии
Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.