Перейти к содержимому

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

Облачные серверы4 мин чтения

Как открыть и закрыть порт в ufw, firewalld, nftables и iptables, сохранить правила после перезагрузки и выяснить, почему порт всё равно недоступен.

Содержание

Чтобы к порту можно было подключиться, нужны две вещи: программа должна его слушать, а межсетевой экран — пропускать подключения. Если что-то не открывается, проверяйте и то, и другое.

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

Какой экран работает у вас

В наших образах межсетевой экран не включён: в Ubuntu ufw установлен, но выключен, в Debian и AlmaLinux его нет, во FreeBSD есть выключенный pf. Что работает сейчас:

sudo ufw status               # Ubuntu, Debian
sudo firewall-cmd --state      # AlmaLinux
sudo nft list ruleset          # все правила в ядре, если установлен nftables

Выберите что-то одно: ufw и firewalld — обе надстройки над nftables, и вместе они мешают друг другу.

ufw — Ubuntu и Debian

sudo ufw allow 22/tcp          # SSH — первым делом
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status numbered

В Debian сначала поставьте: sudo apt install ufw. Правила сохраняются сами и действуют после перезагрузки.

КомандаЧто делает
sudo ufw allow 8080/tcpоткрыть порт
sudo ufw delete allow 8080/tcpзакрыть его снова
sudo ufw delete 3удалить правило по номеру из status numbered
sudo ufw allow from 198.51.100.7 to any port 3306 proto tcpпустить на порт только один адрес
sudo ufw deny from 192.0.2.15не пускать адрес никуда

firewalld — AlmaLinux

Как поставить firewalld — в справочнике AlmaLinux. SSH в нём разрешён сразу.

sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Без --permanent правило действует только до перезагрузки или --reload — удобно, чтобы попробовать. Для известных служб вместо номера можно писать имя: --add-service=http, https, mysql. Закрыть порт — --remove-port=8080/tcp.

Пустить на порт только один адрес:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.7" port port="3306" protocol="tcp" accept'
sudo firewall-cmd --reload

nftables — без надстроек

Правила можно писать и прямо в nftables. В Debian сначала: sudo apt install nftables. Файл — /etc/nftables.conf в Ubuntu и Debian, /etc/sysconfig/nftables.conf в AlmaLinux. Пример: входящие подключения закрыты, кроме SSH, сайта, пинга и ответов на подключения самого сервера:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    iif lo accept
    meta l4proto { icmp, ipv6-icmp } accept
    tcp dport { 22, 80, 443 } accept
  }
}

Проверьте файл и включите:

sudo nft -c -f /etc/nftables.conf
sudo systemctl enable --now nftables

flush ruleset стирает все правила, в том числе созданные Docker и fail2ban. После перезапуска nftables перезапустите и их.

iptables

В нынешних системах iptables — тоже обёртка над nftables, старые команды и скрипты работают:

sudo iptables -I INPUT -p tcp --dport 8080 -j ACCEPT    # открыть порт
sudo iptables -L INPUT -n --line-numbers               # правила с номерами
sudo iptables -D INPUT 1                               # удалить правило по номеру

Правила iptables живут до перезагрузки. Сохранить их в Ubuntu и Debian: sudo apt install iptables-persistent, а после каждого изменения — sudo netfilter-persistent save.

Внимание Если работают fail2ban или Docker, netfilter-persistent save запишет и их временные правила. После перезагрузки они вернутся вместе с вашими и начнут мешать. В этом случае правьте файл /etc/iptables/rules.v4 руками. И не смешивайте iptables с ufw или firewalld — они перепишут правила друг друга.

FreeBSD

Во FreeBSD межсетевой экран — pf. Пример правил и как его включить — в справочнике FreeBSD.

Порт открыт, а подключиться нельзя

  1. Слушает ли программа порт. sudo ss -ltnp | grep 8080. Адрес 127.0.0.1:8080 значит, что программа принимает подключения только изнутри сервера, — смените в её настройках адрес на 0.0.0.0 (у MySQL это bind-address). Строки нет — программа не запущена или слушает другой порт.
  2. Пропускает ли экран. Проверьте со своего компьютера: nc -vz 203.0.113.10 8080, в Windows — Test-NetConnection 203.0.113.10 -Port 8080. Connection refused — экран пропустил, но порт никто не слушает. Долгое ожидание и timed out — подключение отбрасывается, обычно экраном.
  3. Docker. Порты контейнеров Docker открывает сам, в обход ufw и firewalld, — подробнее.
  4. Сеть на вашей стороне. Некоторые офисные и публичные сети не выпускают подключения на редкие порты. Проверьте с другого подключения — например, с телефона через мобильный интернет.

Если базе данных нужен доступ с вашего компьютера, порт можно вообще не открывать — подключайтесь через SSH-туннель.

Не нашли ответ? Напишите в поддержку — подскажем.