nftables — современная подсистема фаервола в ядре Linux, пришедшая на смену iptables. UFW удобнее для простых случаев, а nftables даёт полный контроль: наборы адресов, ограничение частоты, отдельные правила для IPv4 и IPv6 в одной таблице.
Установка
$ apt install -y nftables$ systemctl enable nftablesКонфигурация
Правила хранятся в /etc/nftables.conf и загружаются при старте системы. Базовый вариант для веб-сервера:
#!/usr/sbin/nft -fflush rulesettable inet filter { set admins { type ipv4_addr elements = { 198.51.100.7 } } chain input { type filter hook input priority filter; policy drop; ct state established,related accept ct state invalid drop iif "lo" accept meta l4proto { icmp, ipv6-icmp } accept tcp dport 22 ct state new limit rate 15/minute accept tcp dport { 80, 443 } accept ip saddr @admins tcp dport 5432 accept } chain forward { type filter hook forward priority filter; policy drop; } chain output { type filter hook output priority filter; policy accept; }}Таблица inet обрабатывает IPv4 и IPv6 сразу. ICMP оставлен открытым: без него ломается определение размера пакетов, а IPv6 без ICMPv6 не работает вовсе.
Проверка синтаксиса
$ nft -c -f /etc/nftables.confФлаг -c только проверяет файл, ничего не применяя. Пустой вывод означает, что ошибок нет.
Безопасное применение
Перед применением поставьте таймер, который через две минуты сбросит все правила. Если вы потеряете доступ, он вернётся сам:
$ systemd-run --on-active=120 --unit=nft-rollback /usr/sbin/nft flush ruleset$ nft -f /etc/nftables.confОткройте новое SSH-подключение. Если всё работает, отмените откат и включите загрузку правил при старте:
$ systemctl stop nft-rollback.timer$ systemctl enable --now nftablesПроверьте результат
$ nft list ruleset$ nft list set inet filter adminsДобавить адрес в набор можно без перезагрузки правил: nft add element inet filter admins { 192.0.2.44 }. Чтобы изменение пережило перезагрузку, впишите адрес и в конфиг.
Частые ошибки
- Забыли правило для established,related — ответы на исходящие запросы блокируются, перестают работать apt и DNS.
- SSH на нестандартном порту, а в правилах остался 22.
- После применения пропали правила Docker — перезапустите службу docker.