nftables vs iptables: миграция
nftables — преемник iptables в ядре Linux. Он предлагает более чистый синтаксис, лучшую производительность и атомарные обновления правил. Рассмотрим, как мигрировать с iptables на nftables без простоя.
Проблемы iptables
iptables — мощный, но сложный инструмент. Основные проблемы:
- Синтаксис перегружен и неинтуитивен
- Каждое правило проверяется последовательно — O(n)
- Нет атомарных обновлений — при изменении правил трафик может проходить без фильтрации
- Много дублирования правил для IPv4 и IPv6
Преимущества nftables
- Чистый, читаемый синтаксис
- Атомные обновления правил
- Встроенная поддержка sets и maps
- Единый конфиг для IPv4 и IPv6
- Лучшая производительность при большом количестве правил
Примеры синтаксиса
iptables
# Базовый firewall
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Аналогичные правила для IPv6
ip6tables -P INPUT DROP
ip6tables -P FORWARD DROP
ip6tables -P OUTPUT ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
nftables
#!/usr/sbin/nft -f
flush ruleset
table inet firewall {
chain input {
type filter hook input priority 0; policy drop;
# Loopback
iif lo accept
# Established connections
ct state established,related accept
# SSH, HTTP, HTTPS
tcp dport { 22, 80, 443 } accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
Миграция: пошаговый план
Шаг 1: Экспорт текущих правил
# Сохранение iptables правил
iptables-save > /tmp/iptables-rules.v4
ip6tables-save > /tmp/iptables-rules.v6
Шаг 2: Конвертация
# Инструмент для автоматической конвертации
apt install iptables-nftables-compat
iptables-restore-translate < /tmp/iptables-rules.v4
Шаг 3: Тестирование
# Проверка синтаксиса
nft -c -f /etc/nftables.conf
# Тестовый запуск (правила применятся, но можно откатить)
nft -f /etc/nftables.conf
Перед миграцией всегда сохраняйте iptables правила и скрипт отката. Неправильная конфигурация nftables может заблокировать доступ к серверу.
Атомные обновления
Главная проблема iptables — отсутствие атомных обновлений. При iptables-restore старые правила удаляются перед добавлением новых, создавая окно без фильтрации:
# nftables: атомное обновление через table
table inet myfilter {
chain input {
type filter hook input priority 0; policy drop;
ct state established,related accept
tcp dport { 22, 80, 443 } accept
}
}
# Применение — old table удаляется только после успешного добавления new
nft -f /etc/nftables.conf
Production-стратегия
# 1. Сохраняем текущее состояние
iptables-save > /root/iptables-backup-$(date +%Y%m%d).rules
# 2. Создаём скрипт отката
cat > /usr/local/bin/rollback-iptables.sh << 'EOF'
#!/bin/bash
iptables-restore < /root/iptables-backup-$(date +%Y%m%d).rules
systemctl restart nftables
EOF
# 3. Тестируем nftables на отдельном сервере
# 4. Применяем на production
cp /etc/nftables.conf /etc/nftables.conf.bak
nft -f /etc/nftables.conf
Заключение
nftables — это будущее файрволлинга в Linux. Он проще в использовании, быстрее и безопаснее за счёт атомных обновлений. Миграция требует планирования, но инвестиции окупятся упрощением сопровождения и повышением безопасности.