Как открыть порт на VPS: Ubuntu, Debian, UFW, firewalld и iptables

Открыть порт на 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

ПортПротоколДля чего используетсяОткрывать всем?
22TCPSSHЛучше ограничить по IP или использовать защиту от перебора
80TCPHTTPДа, если на сервере сайт
443TCPHTTPSДа, если на сервере сайт
3306TCPMySQL/MariaDBНет, только для доверенных IP или закрытой сети
5432TCPPostgreSQLНет, только для доверенных IP или закрытой сети
6379TCPRedisНет, не открывать публично без строгой защиты
51820UDPWireGuardДа, если это VPN-сервер
3389TCPRDPЛучше ограничить по IP

Главное — открывать только те порты, которые реально нужны. Не стоит открывать диапазоны «на всякий случай» и не стоит публиковать базы данных, Redis, панели администрирования и внутренние API для всего интернета.