Firewall в Linux: настройка nftables и firewalld

Firewall на Linux-сервере должен разрешать только нужные порты и запрещать остальное. Выбор инструмента зависит от дистрибутива, суть настройки одна и та же. Главная опасность: закрыть порт SSH и потерять доступ.
Какой инструмент выбрать
| Инструмент | Где используется | Когда выбирать |
|---|---|---|
| firewalld | RHEL, Rocky, AlmaLinux, Fedora | Зоны и сервисы, правила меняются на лету |
| nftables | Debian, Ubuntu, любой дистрибутив | Один файл правил, полный контроль |
| ufw | Ubuntu | Простой фасад для небольших серверов |
Не включайте два менеджера одновременно: они перезаписывают правила друг друга. iptables в современных дистрибутивах обычно уже работает поверх nftables.
firewalld: открыть порт
systemctl enable --now firewalld
firewall-cmd --get-active-zones
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
firewall-cmd --list-all
Флаг --permanent пишет правило в конфигурацию, а --reload применяет. Без него правило пропадёт после перезагрузки.
Ограничить SSH адресом администратора:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.10" service name="ssh" accept'
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload
Сначала добавьте правило для своего адреса и проверьте его в отдельной сессии, и только потом убирайте общий доступ.
nftables: минимальный набор правил
Файл /etc/nftables.conf:
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state established,related accept
ct state invalid drop
ip protocol icmp accept
ip6 nexthdr icmpv6 accept
tcp dport { 22, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
nft -c -f /etc/nftables.conf # проверка синтаксиса без применения
systemctl enable --now nftables
nft list ruleset
Если сервер управляется по SSH, перед применением запланируйте откат: (sleep 120; nft flush ruleset) &. Если связь сохранилась, завершите фоновую задачу, если нет — через две минуты правила сбросятся.
Docker и firewall
Docker сам добавляет правила публикации портов и обходит правила ufw/firewalld для опубликованных контейнеров. Не публикуйте порты баз данных на 0.0.0.0. Привязывайте их к 127.0.0.1: -p 127.0.0.1:5432:5432.
Как проверить
ss -tulpn # что слушает сервер
nft list ruleset # или firewall-cmd --list-all
nmap -Pn -p- SERVER_IP # снаружи, с другой машины
Снаружи должны быть видны только разрешённые порты. Как читать вывод сканера: Nmap: сканирование сети и разбор вывода, состояния портов. Общий порядок защиты нового сервера: hardening Linux.





















