Linux #Linux #Ubuntu #Терминал #Сеть #Сервер #Безопасность

Как посмотреть открытые порты в Linux: ss, lsof и nmap

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

16 минут 2
Открытые порты в Linux: ss, lsof и nmap
Содержание
  1. 1ss: все открытые порты
  2. Как читать Local Address
  3. Только TCP, только один порт
  4. Активные соединения
  5. 2Какой процесс занял порт: lsof и fuser
  6. 3А как же netstat?
  7. 4Проверить порт снаружи: nc
  8. 5nmap: просканировать свой сервер
  9. 6Порт слушается, но снаружи не открывается
  10. 7Как закрыть лишний порт
  11. 8Популярные порты
  12. 9Шпаргалка
  13. 10Главные советы
  14. 11Частые вопросы
  15. Как посмотреть открытые порты в Linux?
  16. Как узнать, какой процесс занимает порт?
  17. Чем 0.0.0.0 отличается от 127.0.0.1 в выводе ss?
  18. Как проверить, открыт ли порт на удалённом сервере?
  19. Что делать с ошибкой «Address already in use»?
  20. Почему порт открыт на сервере, но недоступен из интернета?
  21. Как закрыть открытый порт в 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 :80
Вывод
COMMAND  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 3306
Вывод
Connection 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 server
Пример вывода
Nmap 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 server
Вывод
PORT   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 с другого компьютера — нет, проверьте по порядку:

  1. 🏠 Адрес в Local Address. Если там 127.0.0.1, служба принимает подключения только с самого сервера. Поменяйте в её настройках адрес на 0.0.0.0 или адрес нужного интерфейса.
  2. 🧱 Брандмауэр на сервере. В Ubuntu это обычно UFW: sudo ufw status. Если он включён, откройте порт: sudo ufw allow 8080/tcp. Подробно — в статье Защита Ubuntu Server.
  3. 🛜 Роутер. Для домашнего сервера нужен проброс порта (port forwarding) с роутера на внутренний адрес сервера.
  4. 🌍 Провайдер. Если у вас «серый» адрес или CGNAT, входящие подключения из интернета до вас не дойдут, как ни настраивай. Проверить свой внешний адрес можно в проверке IP, а разобраться с адресами и масками — в калькуляторе подсетей.
  5. ☁️ Хостинг. У многих облачных провайдеров есть свой брандмауэр в панели управления — «группы безопасности» или «сетевые правила». Он работает до сервера, и 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.

Популярные порты

ПортЧто обычно на нём
22SSH
80, 443веб-сервер: HTTP и HTTPS
25, 465, 587почта (SMTP)
53DNS
139, 445Samba, общие папки Windows
3306MySQL, MariaDB
5432PostgreSQL
6379Redis
8006веб-интерфейс Proxmox
51820/udpWireGuard

Порты ниже 1024 могут открывать только программы с правами root. Поэтому nginx стартует от root, а потом передаёт работу процессам www-data — это видно в выводе lsof выше.

Шпаргалка

ЗадачаКоманда
Все открытые порты с программамиsudo ss -tulpn
Только TCPsudo ss -tlnp
Кто слушает порт 80sudo 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 сервер
Открыть порт в UFWsudo 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.

Статья помогла?

Комментарии

Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.

Комментарий появится после проверки. Ссылки и реклама не публикуются.