VDS · Сеть, адрес и домены

nftables: правила посложнее

Когда ufw перестаёт хватать: структура таблиц и цепочек nftables, готовый рабочий конфиг, списки адресов, ограничение частоты и проброс портов.

Обновлено 23 августа 2026 г.

nftables — это тот самый механизм ядра, поверх которого работает ufw. Обращаться к нему напрямую стоит, когда нужны именованные списки адресов, ограничение частоты, разные политики на интерфейсах или проброс портов — то есть когда правила перестают укладываться в «разрешить порт».

Использовать оба инструмента одновременно не нужно: перед переходом отключите ufw командой ufw disable, иначе правила будут накладываться и путать вас при отладке.

Структура

Правила живут в таблицах, таблицы содержат цепочки, цепочки — правила. Цепочка привязана к этапу обработки пакета (input, forward, output) и имеет политику по умолчанию.

apt install -y nftables
systemctl enable --now nftables
nft list ruleset

Рабочий конфиг

Файл /etc/nftables.conf:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    set admins {
        type ipv4_addr
        elements = { 203.0.113.5, 198.51.100.7 }
    }

    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 icmp type echo-request limit rate 5/second accept

        tcp dport 22 ip saddr @admins accept
        tcp dport 22 ct state new limit rate 6/minute accept
        tcp dport { 80, 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
nft -f /etc/nftables.conf
systemctl restart nftables

Ключ -c только проверяет синтаксис, не применяя правила. Пользуйтесь им всегда: политика drop при опечатке отрезает доступ, и возвращаться придётся через консоль в панели /hosting/vds/<id>.

Списки адресов и частота

Именованный набор правится на лету, без перезагрузки правил:

nft add element inet filter admins { 192.0.2.10 }
nft delete element inet filter admins { 198.51.100.7 }
nft list set inet filter admins

Динамический набор с временем жизни удобен для самодельных блокировок:

set blocked {
    type ipv4_addr
    flags timeout
    timeout 1h
}

Проброс и подмена адреса

Нужен, если внутри работает контейнер или туннель:

table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100;
        tcp dport 8443 dnat to 10.10.0.2:443
    }
    chain postrouting {
        type nat hook postrouting priority 100;
        oifname "eth0" masquerade
    }
}

Частые ошибки

ОшибкаПоследствиеРешение
Нет правила ct state establishedОбрываются ответы на исходящие запросыДобавить первым правилом
Забыли iif lo acceptЛомаются локальные службы и базыРазрешить петлевой интерфейс
Правила применены, но не сохраненыПосле перезагрузки всё открытоПисать в /etc/nftables.conf
ufw и nftables вместеНепредсказуемый итогОставить один инструмент

Проверяйте новый набор правил в отдельном сеансе, не закрывая рабочий. Простая страховка: sleep 300 && nft flush ruleset в фоне — если заперлись, доступ вернётся сам.

Если такие подробности не нужны, вернитесь к ufw: он закрывает большинство задач.