Управление файрволом через nftables
Как настроить правила файрвола напрямую через nftables — замену iptables.
Время: 20 мин · Сложность: ★★★☆☆
Подходит: ✓ Ubuntu 22.04 · ✓ Debian 12 · ✓ AlmaLinux 9
Краткое описание
nftables — низкоуровневый фреймворк фильтрации пакетов, встроенный в ядро Linux начиная с версии 3.13. Он заменяет iptables, ip6tables, arptables и ebtables единым интерфейсом. UFW и firewalld работают поверх nftables, но прямая работа с ним даёт полный контроль: можно настраивать лимиты скорости, метки пакетов, сложные цепочки — то, что недоступно через упрощённые обёртки.
Когда пригодится
- Когда UFW недостаточно гибкий для вашей задачи
- При настройке NAT, маршрутизации или прозрачного проксирования
- Если нужно ограничить скорость соединений (rate limiting)
- При миграции с iptables на современный стек
Что понадобится
- Root-доступ к серверу
- Базовое понимание сетевых протоколов (TCP/UDP, IP-адреса, порты)
- VNC-доступ к серверу на случай если заблокируете SSH
Пошаговая инструкция
Установка
На Ubuntu и Debian:
apt install -y nftables
На AlmaLinux:
dnf install -y nftables
Включите автозапуск:
systemctl enable --now nftables
Просмотр текущих правил
nft list ruleset
Создание базовой таблицы с политикой запрета
Следующие команды создают таблицу filter для IPv4 и IPv6 (inet), три стандартные цепочки и базовые разрешающие правила.
Выполняйте команды последовательно и не закрывайте SSH-сессию до проверки:
# Создать таблицу
nft add table inet filter
# Создать цепочки с политикой по умолчанию
nft add chain inet filter input { type filter hook input priority 0 \; policy drop \; }
nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop \; }
nft add chain inet filter output { type filter hook output priority 0 \; policy accept \; }
# Разрешить уже установленные соединения
nft add rule inet filter input ct state established,related accept
# Разрешить трафик на loopback-интерфейсе
nft add rule inet filter input iif lo accept
# Разрешить SSH
nft add rule inet filter input tcp dport 22 accept
# Разрешить HTTP и HTTPS
nft add rule inet filter input tcp dport { 80, 443 } accept
Если SSH работает на нестандартном порту, замените 22 на свой порт.
Сохранить правила
nft list ruleset > /etc/nftables.conf
Загрузить конфигурацию из файла
nft -f /etc/nftables.conf
На Ubuntu и Debian systemd-служба nftables автоматически загружает /etc/nftables.conf при старте системы.
Дополнительные полезные правила
Блокировка конкретного IP:
nft add rule inet filter input ip saddr 1.2.3.4 drop
Ограничение новых SSH-соединений (не более 3 в минуту):
nft add rule inet filter input tcp dport 22 ct state new limit rate 3/minute accept
Разрешить ICMP (ping):
nft add rule inet filter input icmp type echo-request accept
nft add rule inet filter input icmpv6 type echo-request accept
Проверка результата
nft list ruleset
Вывод должен содержать таблицу inet filter с тремя цепочками и добавленными правилами. Проверьте SSH-подключение из нового окна терминала.
Для просмотра счётчиков пакетов:
nft list ruleset -a
Возможные ошибки
Потеряли SSH-доступ — произошло если правило для SSH добавили после установки политики policy drop. Перезагрузите сервер через панель VMmanager — правила nftables, не сохранённые в файл, после перезагрузки исчезнут. Затем добавьте правило для SSH перед установкой политики drop.
Правила не сохраняются после перезагрузки — убедитесь что сохранили их командой nft list ruleset > /etc/nftables.conf и что служба nftables включена: systemctl is-enabled nftables.
«Error: syntax error» при добавлении правила — проверьте синтаксис. В nftables фигурные скобки при перечислении портов обязательны: { 80, 443 }, а не просто 80, 443.
Конфликт с UFW или firewalld — не используйте несколько систем управления файрволом одновременно. Отключите UFW (ufw disable) или firewalld (systemctl stop firewalld) перед переходом на прямое управление через nftables.
FAQ
Чем nftables лучше iptables? Единый синтаксис для IPv4 и IPv6, поддержка наборов (sets) для группировки адресов и портов, встроенный счётчик пакетов, более высокая производительность на больших наборах правил.
Как посмотреть счётчики пакетов для каждого правила?
nft list ruleset -a
Флаг -a добавляет счётчики байт и пакетов к каждому правилу.
Как очистить все правила?
nft flush ruleset
После этого весь трафик будет проходить без ограничений (политика по умолчанию — accept).
Как удалить конкретное правило?
Сначала получите дескриптор правила: nft -a list ruleset. Затем удалите по дескриптору:
nft delete rule inet filter input handle 5
Можно ли использовать nftables для NAT?
Да. Добавьте цепочку с хуком postrouting и тип nat:
nft add chain inet nat postrouting { type nat hook postrouting priority 100 \; }
nft add rule inet nat postrouting oif eth0 masquerade
Полезные ссылки
man nft— полная документация по синтаксису nftables/etc/nftables.conf— файл конфигурации, загружаемый при стартеnft monitor— мониторинг изменений правил в реальном времени