Skip to content

This article is available in Russian. An English version is on the way.Open the Russian page

Фаервол на nftables

Собственный набор правил на nftables без надстроек: конфиг, проверка и безопасное применение.

Level
Advanced
Reading time
3 min read
Updated
Tested on
Ubuntu 22.04, Ubuntu 24.04, Debian 12
Contents
  1. Установка
  2. Конфигурация
  3. Проверка синтаксиса
  4. Безопасное применение
  5. Проверьте результат
  6. Частые ошибки

nftables — современная подсистема фаервола в ядре Linux, пришедшая на смену iptables. UFW удобнее для простых случаев, а nftables даёт полный контроль: наборы адресов, ограничение частоты, отдельные правила для IPv4 и IPv6 в одной таблице.

Установка

bash
$ apt install -y nftables$ systemctl enable nftables

Конфигурация

Правила хранятся в /etc/nftables.conf и загружаются при старте системы. Базовый вариант для веб-сервера:

/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 не работает вовсе.

Проверка синтаксиса

bash
$ nft -c -f /etc/nftables.conf

Флаг -c только проверяет файл, ничего не применяя. Пустой вывод означает, что ошибок нет.

Безопасное применение

Перед применением поставьте таймер, который через две минуты сбросит все правила. Если вы потеряете доступ, он вернётся сам:

bash
$ systemd-run --on-active=120 --unit=nft-rollback /usr/sbin/nft flush ruleset$ nft -f /etc/nftables.conf

Откройте новое SSH-подключение. Если всё работает, отмените откат и включите загрузку правил при старте:

bash
$ systemctl stop nft-rollback.timer$ systemctl enable --now nftables

Проверьте результат

bash
$ 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.

Read to the end and the article counts toward your learning progress.

  • nftables
  • nft
  • фаервол
  • iptables
  • правила
  • firewall

Was this article helpful?