Порты на сервере: как открыть, проверить и почему 25-й закрыт

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

Разберём, как за минуту определить, какая именно из трёх у вас, как открыть порт правильно, что происходит с 25-м портом почти у всех провайдеров и какие порты в интернет выставлять не стоит никогда.

Что вообще такое порт

У сервера один IP-адрес, а сервисов на нём много. Порт - это номер, по которому система понимает, какому именно приложению отдать пришедший запрос. Веб-сервер обычно слушает 80 и 443, SSH - 22, почта - 25 и 587.

Чтобы запрос дошёл до приложения, должны совпасть три условия: приложение слушает нужный порт, файрвол пропускает соединение, и провайдер не блокирует этот порт на своей стороне. Ломается любое из трёх - результат снаружи выглядит одинаково.

Три причины, и как их различить

порт не отвечает - три возможные причины и как отличить их за минуту.
порт не отвечает - три возможные причины и как отличить их за минуту.

Проверка идёт изнутри наружу, в таком порядке.

Шаг 1. Слушает ли вообще кто-нибудь. Выполняется на сервере:

ss -tlnp

Команда покажет все порты, которые слушаются, и какие процессы за ними стоят. Если нужного порта в списке нет, дело не в файрволе: приложение не запущено или упало. Смотреть надо и на адрес: 0.0.0.0:8000 означает, что сервис доступен со всех интерфейсов, а 127.0.0.1:8000 - только локально.

Шаг 2. Пропускает ли файрвол. Если порт слушается, проверяем правила:

ufw status numbered

Порта нет в списке разрешённых - соединение отсекается на входе, снаружи это выглядит как таймаут.

Шаг 3. Не блокирует ли провайдер. Если и слушается, и разрешён, а снаружи молчит - остаётся сеть. Проверяется с вашей машины:

nc -zv 203.0.113.10 8000

Разница в поведении подсказывает причину: connection refused означает, что до сервера вы дошли, но никто не слушает; таймаут без ответа - соединение режется по пути, файрволом или провайдером.

Как открыть порт

Если сервис слушает, а не хватает правила, порт открывается одной командой:

ufw allow 8000/tcp

Хорошая практика - открывать не всем, а конкретному источнику. Например, доступ к базе данных только с адреса вашего второго сервера:

ufw allow from 203.0.113.20 to any port 5432 proto tcp

Проверить результат и не забыть, что правила применяются сверху вниз:

ufw status numbered

Подробный разбор настройки файрвола, включая порядок команд, при котором не отрежешь себе SSH, есть в статье про файрвол на VPS.

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

Почему 25-й порт закрыт

Отдельная история, на которой спотыкаются все, кто поднимает почту.

25-й порт исходящих соединений закрыт по умолчанию почти у каждого провайдера. Это не жадность и не техническая ошибка: через него рассылают спам с заражённых машин, и открытый по умолчанию 25-й порт превращает сеть провайдера в источник рассылок, а её адреса - в чёрные списки.

Что с этим делать:

  • Если вы отправляете почту через сторонний сервис - используйте порт 587 или 465, они не блокируются. Это стандартный путь для приложений, которые шлют уведомления.
  • Если вам действительно нужен свой почтовый сервер - 25-й порт открывают по запросу в поддержку, обычно после короткого разговора о том, что вы собираетесь отправлять.
  • Если вам нужно только принимать почту - входящие соединения на 25-й обычно не блокируются, ограничение касается исходящих.

Прежде чем идти этим путём, стоит взвесить: доставляемость писем со своего сервера - самостоятельная задача, разобранная в статье про почтовый сервер на VPS.

Проброс портов: когда порт есть, но не тот

Слово проброс означает перенаправление: снаружи запрос приходит на один порт, а попадает на другой или вообще в другое место.

В контейнерах. Приложение внутри контейнера слушает свой порт, и его нужно связать с портом хоста. Без этого сервис работает, но снаружи недоступен - типичная ситуация при первом знакомстве с Docker.

Через веб-сервер. Приложение слушает локальный порт, а наружу смотрит Nginx на 80 и 443 и передаёт запросы внутрь. Это основной способ, и открывать порт приложения при нём не нужно вовсе.

По SSH. Разовый доступ к сервису, который наружу не выставлен: соединение туннелируется через уже открытый SSH. Удобно, чтобы посмотреть админку базы, не открывая её всему интернету.

Какие порты не открывать

Правило простое: наружу выставляют только то, что должно быть публичным. Всё остальное слушает локальный адрес или ограничивается конкретными источниками.

ЧтоПортПочему не открывать всем
Базы данных3306, 5432, 27017Находятся сканерами за часы, часто со слабым паролем
Панели администрированияразныеПрямой путь к полному доступу при слабом пароле
Кеш и очереди6379, 11211Часто вообще без пароля по умолчанию
Отладочные серверы8000, 3000Не рассчитаны на публичный доступ

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

Частые ошибки

Открывают порт, не проверив, слушает ли сервис. Правило добавлено, ничего не изменилось, потому что причина была в упавшем приложении.

Путают локальный адрес с внешним. Сервис на 127.0.0.1 недоступен снаружи ни при каких правилах файрвола.

Открывают базу данных всему интернету, чтобы подключиться с ноутбука. Правильнее ограничить правило своим адресом или подключаться через SSH-туннель.

Проверяют доступность с самого сервера. Локальная проверка проходит успешно даже при закрытом файрволе. Проверять надо снаружи.

Считают, что 25-й порт сломан. Он закрыт намеренно и почти у всех. Для отправки через сторонний сервис берут 587.

Открывают диапазон портов на всякий случай. Каждый лишний открытый порт - это поверхность атаки, о которой вы забудете через неделю.

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

Как открыть порт на VPS? Убедиться, что сервис слушает нужный порт командой ss -tlnp, затем разрешить его в файрволе: ufw allow 8000/tcp. Если сервис слушает только локальный адрес, правило не поможет.

Как проверить, открыт ли порт снаружи? С другой машины выполнить nc -zv адрес порт. Отказ в соединении означает, что сервер доступен, но никто не слушает. Таймаут означает, что трафик режется файрволом или сетью.

Почему порт открыт, но сервис недоступен? Три типичные причины: приложение не запущено, оно слушает 127.0.0.1 вместо всех интерфейсов, или порт блокируется на стороне провайдера.

Почему не работает 25-й порт? Исходящие соединения по нему закрыты почти у всех провайдеров для борьбы со спамом. Для отправки писем через сторонний сервис используют 587 или 465, а собственный почтовый сервер согласуют с поддержкой.

Что такое проброс портов? Перенаправление запроса с одного порта на другой: с порта хоста внутрь контейнера, с веб-сервера в приложение или через SSH-туннель на вашу машину.

Какие порты нужно держать открытыми? Как правило только 22 для SSH, 80 и 443 для сайта. Всё остальное открывают под конкретную задачу и по возможности ограничивают источник.


Нужен сервер, где портами управляете вы? VPS на NVMe с root-доступом - полный контроль над файрволом и сетью, площадки в Москве, Казани и Амстердаме. Активация за 3 минуты, первые 7 дней - тестовый период с возвратом средств.