Как открыть и закрыть порт в ufw, firewalld, nftables и iptables, сохранить правила после перезагрузки и выяснить, почему порт всё равно недоступен.
Содержание
Чтобы к порту можно было подключиться, нужны две вещи: программа должна его слушать, а межсетевой экран — пропускать подключения. Если что-то не открывается, проверяйте и то, и другое.
Какой экран работает у вас
В наших образах межсетевой экран не включён: в 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 --reloadnftables — без надстроек
Правила можно писать и прямо в 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 nftablesflush 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.
netfilter-persistent save запишет и их временные правила. После перезагрузки они вернутся вместе с вашими и начнут мешать. В этом случае правьте файл /etc/iptables/rules.v4 руками. И не смешивайте iptables с ufw или firewalld — они перепишут правила друг друга.FreeBSD
Во FreeBSD межсетевой экран — pf. Пример правил и как его включить — в справочнике FreeBSD.
Порт открыт, а подключиться нельзя
- Слушает ли программа порт.
sudo ss -ltnp | grep 8080. Адрес127.0.0.1:8080значит, что программа принимает подключения только изнутри сервера, — смените в её настройках адрес на0.0.0.0(у MySQL этоbind-address). Строки нет — программа не запущена или слушает другой порт. - Пропускает ли экран. Проверьте со своего компьютера:
nc -vz 203.0.113.10 8080, в Windows —Test-NetConnection 203.0.113.10 -Port 8080.Connection refused— экран пропустил, но порт никто не слушает. Долгое ожидание иtimed out— подключение отбрасывается, обычно экраном. - Docker. Порты контейнеров Docker открывает сам, в обход ufw и firewalld, — подробнее.
- Сеть на вашей стороне. Некоторые офисные и публичные сети не выпускают подключения на редкие порты. Проверьте с другого подключения — например, с телефона через мобильный интернет.
Если базе данных нужен доступ с вашего компьютера, порт можно вообще не открывать — подключайтесь через SSH-туннель.
Не нашли ответ? Напишите в поддержку — подскажем.


