Перейти к основному содержимому
Вернуться в категорию

iptables vs nftables: сравнение и руководство по миграции

Подробное сравнение iptables и nftables, синтаксис nftables, руководство по миграции, эквиваленты распространённых правил и когда использовать какой инструмент.

Время чтения: 13 мин Безопасность
iptablesnftablesбрандмауэрlinuxсетевая безопасностьфильтрация пакетовnetfilterправила брандмауэра

Содержание

iptables vs nftables: сравнение и руководство по миграции

Многие годы iptables был стандартным инструментом фильтрации пакетов в Linux. Однако nftables включён в ядро Linux с 2014 года и заменяет iptables в современных дистрибутивах. Это руководство сравнивает оба инструмента, объясняет синтаксис nftables и проводит вас через миграцию.

Таблица сравнения

Характеристикаiptablesnftables
Первый выпуск19982014
СинтаксисСложный, непоследовательныйПоследовательный, читаемый
IPv4/IPv6Отдельные инструментыЕдиный инструмент
ПроизводительностьОценка по правиламОптимизированная
Атомарные обновленияНетДа
По умолчанию (Ubuntu 20.04+)НетДа
По умолчанию (Debian 10+)НетДа

Основные концепции iptables

hljs bash
# Просмотр текущих правил iptables
sudo iptables -L -n -v
sudo iptables -L -n -v --line-numbers

# Базовые правила
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -P INPUT DROP

# Сохранить правила
sudo iptables-save > /etc/iptables/rules.v4

Основные концепции nftables

В nftables структура: таблица → цепочка → правило

hljs bash
# Установить nftables
sudo apt install nftables -y
sudo systemctl enable nftables
sudo systemctl start nftables

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

Файл конфигурации nftables

hljs bash
sudo nano /etc/nftables.conf
#!/usr/sbin/nft -f

# Очистить существующие правила
flush ruleset

# Семейство inet охватывает IPv4 и IPv6
table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        
        # Разрешить loopback
        iif lo accept
        
        # Разрешить установленные соединения
        ct state established,related accept
        
        # ICMP (ping)
        ip protocol icmp accept
        ip6 nexthdr icmpv6 accept
        
        # SSH
        tcp dport 22 accept
        
        # HTTP/HTTPS
        tcp dport { 80, 443 } accept
        
        # Логировать и отклонять
        log prefix "nftables-drop: " drop
    }
    
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    
    chain output {
        type filter hook output priority 0; policy accept;
    }
}
hljs bash
# Применить конфигурацию
sudo nft -f /etc/nftables.conf

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

Эквиваленты правил

Правила NAT

hljs bash
# iptables NAT
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
# Эквивалент nftables NAT
table ip nat {
    chain prerouting {
        type nat hook prerouting priority -100;
        tcp dport 80 dnat to 192.168.1.10:80
        tcp dport 443 dnat to 192.168.1.10:443
    }
    
    chain postrouting {
        type nat hook postrouting priority 100;
        oif eth0 masquerade
    }
}

Ограничение скорости

# Ограничение скорости nftables
chain input {
    tcp dport 22 limit rate 3/minute burst 5 packets accept
    tcp dport 22 drop
}

IP-наборы

# Наборы nftables (встроенные)
table inet filter {
    set blocked_ips {
        type ipv4_addr
        elements = { 1.2.3.4, 5.6.7.8 }
    }
    
    chain input {
        type filter hook input priority 0; policy drop;
        ip saddr @blocked_ips drop
        tcp dport 22 accept
    }
}

Миграция с iptables на nftables

Автоматическое преобразование

hljs bash
# Установить инструмент преобразования
sudo apt install iptables-nftables-compat -y

# Преобразовать существующие правила iptables
iptables-save | iptables-restore-translate -f /etc/nftables.conf
ip6tables-save | ip6tables-restore-translate >> /etc/nftables.conf

Ручные шаги миграции

hljs bash
# 1. Резервное копирование правил iptables
sudo iptables-save > /root/iptables-backup.txt

# 2. Создать конфигурацию nftables
sudo nano /etc/nftables.conf

# 3. Проверить конфигурацию
sudo nft -c -f /etc/nftables.conf

# 4. Включить nftables
sudo systemctl enable nftables
sudo nft -f /etc/nftables.conf

# 5. Отключить iptables
sudo systemctl disable iptables
sudo systemctl stop iptables

# 6. Проверить правила
sudo nft list ruleset

Когда что использовать?

Используйте iptables:

  • Устаревшие системы (CentOS 7, Ubuntu 18.04)
  • Существующие скрипты iptables
  • Команда знакома с iptables

Используйте nftables:

  • Новые установки (Ubuntu 20.04+, Debian 10+)
  • Совместное управление IPv4 и IPv6
  • Более чистый синтаксис
  • Атомарные обновления правил

Начиная с Ubuntu 20.04 и Debian 10, команда iptables фактически запускает обёртку iptables-nft — то есть использует nftables под капотом. Используйте iptables-legacy для настоящего iptables.

Заключение

nftables заменяет iptables в современных Linux-системах. Он предлагает более последовательный синтаксис, унифицированное управление IPv4/IPv6 и лучшую производительность. Выбирайте nftables для новых установок; планируйте миграцию для существующей инфраструктуры iptables.