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