Блог
DevOps · практикаDevOps 8 мин чтения

iptables → nftables: переход в 2026 без сюрпризов

iptables ещё жив, но nftables — стандарт с Debian 10+/RHEL 8+. Разбираем миграцию, синтаксис, atomic reload и минимальный набор правил для VPS.

iptables был стандартом 20 лет. nftables — его преемник. В Debian 10+ / Ubuntu 20.04+ / RHEL 8+ — default. Но большинство админов до сих пор пишут iptables «по привычке» и через compat-слой. Пора переходить.

Разбираем: чем nftables лучше, как мигрировать правила, минимальный шаблон для VPS.

Почему nftables лучше

Единый интерфейс. Раньше: iptables (IPv4), ip6tables (IPv6), arptables, ebtables — четыре разных утилиты. Сейчас: nft — одна.

Atomic transactions. Старое iptables при массовом обновлении правил проходил через промежуточные состояния (короткий момент без правил или с частичными). nftables применяет весь набор атомарно.

Sets, maps, verdicts. Наборы IP, портов, интерфейсов на уровне ядра, эффективнее чем длинные цепочки правил.

Меньше правил — быстрее. Одна цепочка nftables с 1000 правил обычно эффективнее чем эквивалентная iptables.

Проверить, что у вас сейчас

На Debian 10+/Ubuntu 20.04+:

# Что запущено сейчас
systemctl status nftables
systemctl status ufw   # если стоит UFW — под капотом iptables/nftables

# Текущие правила
nft list ruleset
# vs
iptables-save

# Если iptables работает — часто это iptables-nft (совместимость):
update-alternatives --display iptables

Минимальный конфиг для веб-VPS

Файл /etc/nftables.conf:

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority filter; policy drop;

        # Loopback
        iif lo accept

        # Established/related
        ct state established,related accept

        # Invalid → drop
        ct state invalid drop

        # ICMP (ping) — базово разрешаем
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept

        # SSH — по своему порту
        tcp dport 22 accept

        # HTTP/HTTPS
        tcp dport { 80, 443 } accept

        # Логгируем drop-ы (опционально, шумно)
        # log prefix "nft drop: " level info
    }

    chain forward {
        type filter hook forward priority filter; policy drop;
    }

    chain output {
        type filter hook output priority filter; policy accept;
    }
}

Применить и включить

Проверить синтаксис, применить, сделать persistent:

# Проверка синтаксиса без применения
nft -c -f /etc/nftables.conf

# Применить
nft -f /etc/nftables.conf

# Список текущих правил
nft list ruleset

# Persistent — enable systemd service
systemctl enable --now nftables

# ⚠️ ВНИМАНИЕ: применяйте через screen/tmux и таймаут-скрипт!
# echo 'sleep 300 && nft flush ruleset' | at now  # разблокирует, если сессия оборвётся
Осторожно

Первое применение firewall с политикой drop — легко заблокировать себя. Всегда используйте таймаут-скрипт (at now + 5 min с nft flush ruleset), пока не проверите, что SSH держит соединение.

Sets — банить пачку IP красиво

Набор IP-адресов на уровне ядра, добавление/удаление без релоада всей таблицы:

table inet filter {
    set banned_ipv4 {
        type ipv4_addr
        flags interval  # поддержка CIDR
        elements = { 1.2.3.4, 5.6.7.0/24 }
    }

    chain input {
        # ...
        ip saddr @banned_ipv4 drop
    }
}

# Runtime — добавить IP без релоада:
nft add element inet filter banned_ipv4 { 9.10.11.12 }
nft delete element inet filter banned_ipv4 { 9.10.11.12 }

Rate limiting — из коробки

SSH rate-limit — 5 попыток в минуту с одного IP:

chain input {
    # ...
    tcp dport 22 ct state new \
        limit rate 5/minute burst 5 packets accept
    tcp dport 22 drop
}

Миграция с iptables — если есть большой конфиг

Если у вас накопился большой ruleset iptables, автопереконвертация:

# Дамп iptables
iptables-save > /tmp/iptables.rules

# Конвертация
iptables-restore-translate -f /tmp/iptables.rules > /etc/nftables.conf

# Ревью — обязательно! Автотрансляция часто оставляет legacy-конструкции
vim /etc/nftables.conf
Совет

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

UFW / firewalld — обёртки

UFW (Uncomplicated Firewall) на Ubuntu — обёртка сначала над iptables, сейчас над nftables. Удобно для не-админов:

ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable
ufw status verbose
На заметку

firewalld на RHEL/Fedora/CentOS — аналогично, но с zone-based моделью. Хорош для мультизонных сценариев. Для serious production мы рекомендуем прямой nftables — больше контроля, меньше слоёв абстракции.

Частые вопросы

iptables ещё будет работать?
На старых дистрибутивах — да. На новых — через compat-слой (iptables-nft). Долгосрочно все переходят на nftables.
UFW vs прямой nftables?
UFW — для быстрого старта и dev. Прямой nftables — для сложных правил, rate-limits, sets, connlimit.
Как логировать заблокированное?
В chain input: `log prefix "drop: " level info counter drop`. Смотреть в journalctl или /var/log/kern.log.
IPv6 — отдельная таблица?
Нет, `table inet` покрывает и IPv4, и IPv6. Одна таблица — оба стека.