Порты на сервере: как открыть, проверить и почему 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 дней - тестовый период с возвратом средств.