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

Порт слушает, а снаружи недоступен? Как проверить через ss изнутри и nmap снаружи, понять результат и открыть порт в ufw. Выводы с живого сервера.

Сервис может слушать порт и всё равно оставаться недоступным из интернета. Работает ли порт, решают два разных обстоятельства: слушает ли его программа и пускает ли к нему трафик межсетевой экран. В этой инструкции мы проверяем оба: изнутри сервера командой ss и снаружи командой nmap, разбираем три результата (open, closed, filtered) и открываем порт в ufw. Всё запущено на настоящем сервере.

Коротко. Изнутри: ss -tlnp показывает, что слушает. Снаружи: nmap -Pn -p ПОРТ сервер с другой машины показывает, что отвечает. «Filtered» — межсетевой экран отбрасывает трафик, «closed» — сервер ответил, что порт никто не слушает, «open» — ответила программа. Открывайте порт командой ufw allow ПОРТ/tcp, закрывайте командой ufw delete allow ПОРТ/tcp.

Тестовый сервер — VPS HIP-HOSTING с Ubuntu 24.04.5 и 2 vCPU. Межсетевой экран ufw включён и по умолчанию блокирует входящие, а правила разрешают порты 22, 80 и 443. Мы сканировали его со второго сервера. В выводах адрес сервера заменён на 203.0.113.20. На новом сервере ufw может быть выключен; прежде чем что-то делать, посмотрите ufw status. Сканируйте только свои серверы.

Шаг 1. Посмотрите, что слушает на сервере

Чтобы было что проверять, запустим два маленьких веб-сервера: один слушает все адреса (0.0.0.0) на порту 8000, другой — только сам сервер (127.0.0.1) на порту 8001. Амперсанд в конце оставляет их работать в фоне.

python3 -m http.server 8000 --bind 0.0.0.0 --directory /tmp &
python3 -m http.server 8001 --bind 127.0.0.1 --directory /tmp &

Теперь спросим систему, какие программы слушают TCP-порты. ss — современная замена netstat. Ключи: -t — TCP, -l — только слушающие сокеты, -n — числа вместо имён, -p — показать программу (нужны права root). Часть в кавычках ограничивает список нужными нам портами. Подробнее про сам ss, в том числе про то, кто подключён к вашему серверу, в нашей статье ss вместо netstat.

Смотрите на столбец Local Address:Port. 0.0.0.0:8000 означает «слушает все IPv4-адреса», поэтому порт достижим снаружи, если ничто не мешает. 127.0.0.1:8001 означает «только с самого сервера»: обычное разрешающее правило межсетевого экрана не сделает такой порт доступным из интернета. [::]:22 — то же, что 0.0.0.0, но для IPv6. Последний столбец называет программу: так видно, что именно вы открыли бы наружу.

Шаг 2. Посмотрите правила межсетевого экрана

Слушание — только половина дела. Кто может дойти до порта, решает межсетевой экран. Вот правила для портов 22, 80 и 443 на нашем сервере:

Порты 22, 80 и 443 разрешены. Портов 8000 и 8001 в списке нет, а раз для входящих по умолчанию стоит «запретить», они заблокированы, хотя на 8000 программа слушает.

Шаг 3. Проверьте снаружи: open, closed, filtered

Надёжная проверка — только с другой машины, не с самого сервера. Мы сканировали со второго сервера. nmap опрашивает порты и сообщает, что увидел; -Pn пропускает проверку пингом (многие серверы на пинг не отвечают), а -p задаёт порты. nc -vz -w 3 — более простая проверка одного порта с лимитом 3 секунды.

Три состояния, которые нужно знать:

  • open — ответила программа. Порты 22 и 80.
  • closed — сервер ответил «здесь никто не слушает». Трафик дошёл, значит, межсетевой экран не мешает.
  • filtered — ответа нет совсем (или пришло сообщение об ошибке, которое nmap не может истолковать). Что-то блокирует трафик, чаще всего межсетевой экран. Порт 8000 — ловушка: на нём слушает программа (шаг 1), но снаружи он выглядит мёртвым. Это не проблема сервиса, это проблема правила.

Команда nc согласна: через 3 секунды она сдаётся с «timed out», так выглядит отброшенное соединение.

Шаг 4. Откройте порт в ufw

ufw allow 8000/tcp пропускает TCP-трафик на порт 8000. Слово comment необязательно и помогает потом вспомнить, зачем нужно правило. Порт 8001 мы тоже открыли нарочно, чтобы увидеть, что меняется для порта, который слушает только сам сервер:

«Rule added (v6)» значит, что ufw добавил такое же правило и для IPv6. Порт 8000 из filtered стал open, а настоящий запрос вернул HTTP 200. Порт 8001 из filtered стал closed: межсетевой экран теперь пропускает трафик, но на внешнем адресе никто не слушает, потому что программа привязана к 127.0.0.1. curl завершается с кодом 7 («не удалось подключиться»). Чинить такой порт нужно в самой программе, а не в межсетевом экране: пусть слушает 0.0.0.0, и только если он действительно должен быть публичным.

Шаг 5. Закройте порт обратно

Ненужное правило — это открытая дверь. Список правил показывает ufw status numbered, а удалить правило можно теми же словами, которыми вы его добавляли:

Оба порта снова filtered. Затем мы остановили тестовые серверы. Чтобы пускать на порт только с одного адреса, ufw понимает форму вроде ufw allow from 203.0.113.50 to any port 8000 proto tcp; здесь мы её не проверяли.

Если порт слушает, но недоступен

  1. Снаружи filtered. Сначала посмотрите ufw status: есть ли правило allow для этого порта и протокола (TCP или UDP)? Если межсетевой экран системы открыт, а порт всё равно filtered, трафик может отбрасывать что-то перед сервером. Такой случай мы не проверяли; обратитесь в поддержку.
  2. Снаружи closed. С межсетевым экраном всё в порядке. Программа не запущена, слушает другой порт или слушает только 127.0.0.1. Вернитесь к ss -tlnp.
  3. По IPv4 работает, по IPv6 нет. Посмотрите на [::] в выводе ss: программа может слушать только одно семейство адресов.

Одно предупреждение: никогда не открывайте порты баз данных (3306, 5432, 6379) всему интернету. Держите их на 127.0.0.1 или пускайте только нужные адреса. Если правило отрезало вас самих, вернуться поможет веб-консоль.

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

Как проверить, открыт ли порт на сервере?

С другой машины выполните nmap -Pn -p ПОРТ адрес-сервера или nc -vz -w 3 адрес-сервера ПОРТ. «Open» значит, что программа отвечает. Проверка с самого сервера показывает лишь, слушает ли программа, а не доберётся ли до неё интернет.

Что значит «filtered» в nmap?

Ответа на запрос не было, обычно потому, что межсетевой экран отбрасывает трафик. В нашем тесте порт 8000 был filtered, хотя на нём слушала программа, пока мы не добавили правило allow.

Чем отличаются closed и filtered?

Closed — сервер ответил, что порт никто не слушает: трафик дошёл. Filtered — ответа не было совсем, значит, что-то заблокировало трафик по дороге.

Как открыть порт на Ubuntu?

Выполните ufw allow ПОРТ/tcp и проверьте снаружи через nmap. Если порт остаётся closed, программа не слушает публичный адрес.

Нужен ли nmap на проверяемом сервере?

Нет. Поставьте его на другую машину и сканируйте сервер оттуда. Для одного порта хватит nc.

Коротко

  • Две проверки: ss -tlnp изнутри (кто слушает) и nmap с другой машины (кто отвечает).
  • Filtered — межсетевой экран отбрасывает трафик, closed — никто не слушает, open — ответила программа. В нашем тесте слушающий порт был filtered, пока мы его не разрешили.
  • Программу, привязанную к 127.0.0.1, снаружи не достать, что бы ни говорил межсетевой экран.
  • Открывайте порты по одному командой ufw allow, убирайте командой ufw delete allow и сканируйте заново после каждого изменения.

Не проверялось здесь: правила для одного адреса, сканирование IPv6, фильтр перед сервером и системы кроме Ubuntu 24.04. Связанные руководства: защита свежего VPS и подключение к серверу.

SECTION
How To
REVIEWED
—
LANGUAGES
EN · RU