Открыть порт на VPS нужно, когда сервис запущен на сервере, но недоступен из интернета: не открывается сайт на Nginx, не подключается приложение по нестандартному порту, не работает VPN, панель управления, API, игровой сервер или контейнер Docker. На практике проблема не всегда в firewall. Порт может быть закрыт в UFW, firewalld или iptables, сервис может слушать только localhost, Docker-контейнер может быть запущен без публикации порта, а у провайдера может быть отдельный сетевой экран в панели управления.
В этой инструкции разберем, как открыть порт на VPS в Ubuntu и Debian, как проверить открытые порты на сервере, как настроить UFW, firewalld и iptables, а также как понять, почему порт открыт локально, но снаружи все равно недоступен.
Если вы только подбираете сервер под проект, приложение, сайт или панель управления, заранее проверьте, какие порты понадобятся вашему стеку. Для размещения сайтов, сервисов и контейнеров можно использовать VPS-хостинг, где вы получаете root-доступ и можете самостоятельно управлять firewall, веб-сервером, Docker и сетевыми службами.
Что значит «открыть порт» на VPS
Порт — это сетевой номер, через который приложение принимает подключения. Например, SSH обычно работает на 22 порту, HTTP — на 80, HTTPS — на 443, PostgreSQL — на 5432, Redis — на 6379. Но сам по себе номер порта ничего не открывает. Чтобы соединение прошло, должны совпасть несколько условий.
Во-первых, на сервере должен быть запущен сервис, который проверяет нужный порт. Во-вторых, приложение должно принимать подключения не только с локального адреса `127.0.0.1`, если доступ нужен извне. В-третьих, firewall внутри операционной системы должен пропускать входящий трафик. В-четвертых, если у провайдера есть внешний firewall или security group, порт должен быть разрешен и там.
Как проверить открытые порты на VPS
Подключитесь к серверу по SSH и посмотрите, какие TCP- и UDP-порты сейчас слушают приложения:
sudo ss -tulpen
Для конкретного порта используйте фильтр. Например, проверим порт 8080:
sudo ss -tulpen | grep ':8080'
Если в выводе есть строка с `LISTEN`, значит на сервере есть процесс, который принимает подключения на этом порту. Важно смотреть не только на номер порта, но и на адрес.
127.0.0.1:8080
Такой вариант означает, что сервис слушает только локальные подключения внутри сервера. Из интернета он не будет доступен, даже если открыть порт в firewall.
0.0.0.0:8080
Такой вариант означает, что сервис слушает все IPv4-интерфейсы.
[::]:8080
Такой вариант относится к IPv6. В зависимости от настроек системы он может принимать IPv6-подключения, а иногда и IPv4-mapped подключения. Для диагностики лучше отдельно проверять IPv4 и IPv6, особенно если домен имеет AAAA-запись.
Если `ss` ничего не показывает, открывать порт в firewall пока бессмысленно: на сервере нет приложения, которое его слушает. Сначала нужно запустить или правильно настроить сервис.
Как понять, какой firewall используется
На Ubuntu и Debian часто используют UFW. На CentOS, AlmaLinux, Rocky Linux, Fedora и RHEL чаще встречается firewalld. На минимальных сборках может использоваться iptables или nftables без удобной надстройки.
Проверить UFW:
sudo ufw status verbose
Проверить firewalld:
sudo firewall-cmd --state
Проверить правила iptables:
sudo iptables -L -n -v --line-numbers
Если установлен UFW, не стоит параллельно вручную настраивать firewalld для тех же правил. Если работает firewalld, не нужно одновременно включать UFW без понимания текущей схемы. Несколько firewall-инструментов могут создавать конфликтующие правила, и диагностика станет сложнее.
Как открыть порт на VPS в Ubuntu через UFW
UFW — самый простой вариант для Ubuntu. В Debian его тоже можно использовать, но в некоторых установках он может быть не установлен или выключен.
Проверьте статус:
sudo ufw status verbose
Если UFW выключен, перед включением обязательно разрешите SSH. Иначе можно потерять доступ к серверу.
sudo ufw allow OpenSSH
или явно:
sudo ufw allow 22/tcp
После этого можно включить UFW:
sudo ufw enable
Чтобы открыть TCP-порт, например 8080:
sudo ufw allow 8080/tcp
Чтобы открыть UDP-порт, например для VPN или игрового сервера:
sudo ufw allow 51820/udp
Чтобы открыть стандартные порты сайта:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
Для Nginx и Apache можно использовать профили приложений, если они доступны:
sudo ufw app list
sudo ufw allow 'Nginx Full'
Открывать технические порты для всего интернета не всегда безопасно. Например, MySQL, PostgreSQL, Redis, админ-панель или внутренний API лучше разрешать только с доверенного IP:
sudo ufw allow from 203.0.113.10 to any port 3306 proto tcp
Проверить итоговые правила можно так:
sudo ufw status numbered
Если правило добавлено ошибочно, удалите его по номеру:
sudo ufw delete 3
Если ваша основная задача сводится только к размещению обычного сайта без ручной настройки firewall, SSH, Nginx и системных служб, в таком случае проще использовать хостинг для сайта. VPS нужен там, где требуется полный контроль над сервером, нестандартные порты, собственные сервисы или отдельная конфигурация.
Как открыть порт на VPS сервере Ubuntu без потери SSH
Самая частая ошибка при настройке UFW — включить firewall до разрешения SSH. Если вы работаете через SSH, порядок должен быть таким:
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
Если SSH у вас перенесен на нестандартный порт, например 2222, разрешайте именно его:
sudo ufw allow 2222/tcp
После смены SSH-порта проверьте конфигурацию:
sudo sshd -t
Затем перезапустите SSH:
sudo systemctl restart ssh
Не закрывайте текущую SSH-сессию, пока не проверите вход в новой вкладке терминала. Это простое правило часто спасает от блокировки доступа к серверу.
Debian: как открыть порт через UFW
В Debian UFW может отсутствовать в минимальной установке. Установите его:
sudo apt update
sudo apt install ufw -y
Дальше порядок такой же: сначала разрешаем SSH, затем нужные порты, затем включаем firewall.
sudo ufw allow 22/tcp
sudo ufw allow 8080/tcp
sudo ufw enable
sudo ufw status verbose
Если на Debian уже используются iptables/nftables-правила, перед включением UFW стоит проверить текущую схему. Иначе можно случайно перекрыть доступ к сервисам, которые уже работали через другие правила.
Как открыть порт через firewalld
firewalld работает через зоны. Обычно публичный сетевой интерфейс находится в зоне `public`, но это нужно проверить:
sudo firewall-cmd --get-active-zones
Открыть TCP-порт 8080 временно, до перезагрузки правил:
sudo firewall-cmd --add-port=8080/tcp
Открыть порт постоянно:
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
Открыть UDP-порт:
sudo firewall-cmd --permanent --add-port=51820/udp
sudo firewall-cmd --reload
Для стандартных сервисов удобнее использовать не номер порта, а имя сервиса:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
Проверить открытые порты и сервисы:
sudo firewall-cmd --list-all
Если используется не зона по умолчанию, укажите ее явно:
sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
Для ограничения доступа по IP в firewalld можно использовать rich rules. Например, разрешить порт 3306 только с конкретного IP:
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --reload
Как открыть порт через iptables
iptables используют, когда на сервере нет UFW/firewalld или нужна низкоуровневая настройка. Команды ниже открывают входящие подключения на конкретный порт.
Открыть TCP-порт 8080:
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
Открыть UDP-порт 51820:
sudo iptables -A INPUT -p udp --dport 51820 -j ACCEPT
Разрешить порт только для одного IP:
sudo iptables -A INPUT -p tcp -s 203.0.113.10 --dport 3306 -j ACCEPT
Посмотреть правила с номерами:
sudo iptables -L INPUT -n -v --line-numbers
Важная деталь: порядок правил имеет значение. Если выше по цепочке стоит `DROP` или `REJECT`, добавление разрешающего правила в конец через `-A` может не сработать. В таком случае правило нужно вставить выше:
sudo iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT
На Ubuntu и Debian правила iptables не всегда сохраняются после перезагрузки. Для сохранения можно использовать пакет `iptables-persistent`:
sudo apt install iptables-persistent -y
sudo netfilter-persistent save
Если сервер использует nftables, iptables-команды могут работать через совместимый слой `iptables-nft`. Для простых задач это часто незаметно, но при сложной диагностике нужно понимать, какой backend используется:
sudo iptables -V
Как проверить доступность порта снаружи
Проверку нужно делать не только на самом VPS, но и с внешней машины: домашнего компьютера, другого сервера или онлайн-инструмента проверки портов.
С Linux или macOS можно использовать `nc`:
nc -vz 203.0.113.20 8080
Для HTTP/HTTPS лучше проверять не просто порт, а ответ веб-сервера:
curl -I http://203.0.113.20
curl -I https://example.com
Для SSH:
ssh -v root@203.0.113.20 -p 22
Для диагностики можно использовать `nmap`, но сканировать стоит только свои серверы:
nmap -p 22,80,443,8080 203.0.113.20
Если порт доступен локально, но недоступен снаружи, проверьте четыре вещи: адрес, на котором слушает сервис; локальный firewall; внешний firewall в панели провайдера; корректность DNS, если проверяете по домену.
Порт открыт, но сайт или сервис не работает: где искать ошибку
Самая обманчивая ситуация — правило в firewall добавлено, но подключение все равно не проходит. Обычно причина находится не в самом правиле, а в одном из соседних уровней.
Сервис проверяет только localhost
Если `ss` показывает `127.0.0.1:8080`, сервис доступен только внутри сервера. Для внешнего доступа приложение должно слушать публичный интерфейс, например `0.0.0.0:8080`, либо конкретный внешний IP.
Это часто встречается у Node.js, Python-приложений, dev-серверов, баз данных и внутренних API. В конфигурации приложения ищите параметры вроде `host`, `bind`, `listen`, `address`.
Nginx определеяет не тот порт или не тот server_name
Для Nginx проверьте конфигурацию:
sudo nginx -t
sudo ss -tulpen | grep nginx
Если сайт должен работать по HTTPS, одного открытого 443 порта недостаточно. Нужен корректный SSL-сертификат, блок `server` с `listen 443 ssl`, правильный `server_name` и доступность домена по DNS.
После изменения конфигурации перезагрузите Nginx:
sudo systemctl reload nginx
Docker-контейнер запущен без публикации порта
В Docker есть разница между портом внутри контейнера и портом на хосте. Если приложение задействует 80 порт внутри контейнера, это не значит, что он автоматически доступен снаружи VPS.
Правильный запуск с публикацией порта:
docker run -d -p 8080:80 nginx
Это означает: открыть порт 8080 на VPS и направить его на 80 порт контейнера.
Проверьте опубликованные порты:
docker ps
Если в выводе нет строки вида `0.0.0.0:8080->80/tcp`, внешний доступ не настроен. В Docker Compose это задается так:
services:
app:
image: nginx
ports:
- "8080:80"
Если указать `127.0.0.1:8080:80`, контейнер будет доступен только локально на самом сервере:
ports:
- "127.0.0.1:8080:80"
Это полезно для внутренних сервисов, но не подходит, если доступ нужен из интернета.
Порт закрыт во внешнем firewall провайдера
У некоторых VPS-провайдеров есть отдельный firewall в панели управления. Внутри Ubuntu порт может быть открыт, `ss` может показывать слушающий сервис, но входящий трафик будет блокироваться до попадания на сервер.
Проверьте настройки сетевого экрана, security group, правил доступа или защиты в панели управления VPS. Если там есть отдельные входящие правила, добавьте нужный TCP- или UDP-порт.
Проблема в IPv6
Если домен имеет AAAA-запись, часть пользователей может идти на IPv6-адрес. При этом IPv4 может быть настроен правильно, а IPv6 — нет. Проверьте DNS:
dig A example.com
dig AAAA example.com
И отдельно проверьте, слушает ли сервис IPv6:
sudo ss -tulpen | grep ':443'
Если IPv6 не используется, но у домена есть AAAA-запись на сервер, где сервис не настроен, лучше удалить некорректную AAAA-запись или настроить полноценную поддержку IPv6.
Какие порты обычно открывают на VPS
| Порт | Протокол | Для чего используется | Открывать всем? |
|---|---|---|---|
| 22 | TCP | SSH | Лучше ограничить по IP или использовать защиту от перебора |
| 80 | TCP | HTTP | Да, если на сервере сайт |
| 443 | TCP | HTTPS | Да, если на сервере сайт |
| 3306 | TCP | MySQL/MariaDB | Нет, только для доверенных IP или закрытой сети |
| 5432 | TCP | PostgreSQL | Нет, только для доверенных IP или закрытой сети |
| 6379 | TCP | Redis | Нет, не открывать публично без строгой защиты |
| 51820 | UDP | WireGuard | Да, если это VPN-сервер |
| 3389 | TCP | RDP | Лучше ограничить по IP |
Главное — открывать только те порты, которые реально нужны. Не стоит открывать диапазоны «на всякий случай» и не стоит публиковать базы данных, Redis, панели администрирования и внутренние API для всего интернета.
