Top.Mail.Ru
OSEN-НИЙ SAAALEСкидка 50% на виртуальный хостинг и VDS
до 30.11.2025 Подробнее
Выберите продукт

nftables на VDS: современный файрвол, базовые правила, persist и отладка

Кратко о nftables на VDS: почему он удобнее iptables, как быстро собрать базовый файрвол для IPv4/IPv6, сохранить правила через /etc/nftables.conf, безопасно применять изменения и отлаживать трафик счётчиками, логами и трассировкой.
nftables на VDS: современный файрвол, базовые правила, persist и отладка

nftables — это современная подсистема фильтрации и трансляции пакетов в Linux, призванная заменить iptables/ip6tables/arptables/ebtables. Для админов и DevOps это означает унифицированный синтаксис, атомарные загрузки правил, поддержку наборов (sets), карт (maps), счётчиков и удобную отладку. На практике nftables позволяет строить аккуратные и быстрые конфигурации для VDS, минимизируя риск «самоотстрела» по SSH и упрощая поддержку IPv6.

Почему именно nftables на VDS

На виртуальных серверах хочется максимально надёжной и простой сетевой политики. С nftables у нас появляется единое пространство конфигурации (семейство inet) для IPv4 и IPv6, гибкие структуры данных (наборы адресов и портов) и предсказуемая загрузка правил из одного файла. Это упрощает аудит, CI/CD конфигов и миграции.

Ключевые преимущества для практики:

  • Единый синтаксис и единая логика для IPv4/IPv6 через table inet.
  • Атомарная загрузка правил: правило либо загружено целиком, либо нет — меньше шансов «оборвать» SSH.
  • Наборы адресов/подсетей и портов с O(1) проверкой — удобно для allowlist/denylist и готово к росту.
  • Встроенные счётчики, логирование, трассировка — проще отлаживать доступность сервисов.
  • Функции ct state, базовые лимиты логов и простые rate limit на уровне файрвола.

Базовые понятия: таблицы, цепочки, хуки

В nftables правила объединяются в таблицы (table) и цепочки (chain). Цепочка привязана к «хуку» сетевого стека:

  • input — входящий трафик на локальные сокеты хоста;
  • forward — транзитный трафик через хост (маршрутизация, контейнерные мосты);
  • output — исходящий трафик с хоста;
  • prerouting/postrouting — для NAT и продвинутых сценариев.

Семейство inet позволяет одной таблицей покрыть IPv4 и IPv6. Политика по умолчанию (policy) задаёт, что делать с трафиком, не попавшим ни под одно правило: чаще всего drop в input/forward и accept в output.

Пример таблиц и цепочек nftables в терминале

Установка и запуск nftables

На Debian/Ubuntu:

apt update
apt install nftables
systemctl enable --now nftables

На AlmaLinux/Rocky/RHEL:

dnf install nftables
systemctl enable --now nftables

Если используется firewalld, помните: он работает поверх nftables. Для ручного управления nft используйте только один инструмент, чтобы избежать конфликтов. В типовых VDS-сценариях удобнее вести правила напрямую через /etc/nftables.conf.

Безопасное применение: чтобы не потерять SSH

Перед включением политики drop в input обязательно убедитесь, что правила допускают доступ к вашему SSH-порту. Оставьте открытой текущую SSH-сессию, добавляйте правила поэтапно, а политику drop включайте в самом конце. Для больших изменений применяйте конфиг атомарно командой nft -f — либо загрузка удастся целиком, либо останется прежняя конфигурация.

Про дополнительные меры для SSH (ключи, fail2ban, нестандартный порт) см. также разбор в статье по безопасности: жёсткая настройка SSH и файрвола на VDS.

FastFox VDS
Облачный VDS-сервер в России
Аренда виртуальных серверов с моментальным развертыванием инфраструктуры от 195₽ / мес

Базовый конфиг для VDS: IPv4/IPv6, SSH, HTTP/HTTPS

Ниже — минималистичный, но практичный набор для хостинга веб-проектов. Он включает базовую гигиену (loopback, established/related, ICMP/ICMPv6), открывает SSH и веб-порты, ведёт счётчики и ограничивает шум логов.

flush ruleset

table inet filter {
    set web_ports {
        type inet_service
        elements = { 80, 443 }
    }

    chain input {
        type filter hook input priority 0;
        policy drop;

        # Базовая гигиена
        ct state invalid drop
        iif lo accept
        ct state established,related accept

        # Echo и важные ICMPv6 типы для соседства и маршрутизации
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept

        # SSH (пример с портом 22; при необходимости поменяйте)
        tcp dport 22 ct state new accept comment "SSH"

        # HTTP/HTTPS
        tcp dport @web_ports accept comment "WEB"

        # Лимитированное логирование неожиданных пакетов
        limit rate 10/second counter log prefix "nft-drop: "
        drop
    }

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

        # Если не маршрутизируете трафик, оставьте drop
        # Иначе добавьте правила для мостов/контейнеров
    }

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

Пояснения:

  • ct state invalid drop — отбрасываем «битые» пакеты до остального матчинга.
  • iif lo accept — трафик с loopback всегда нужен системным сервисам.
  • ct state established,related accept — пропускаем ответы на легитимные исходящие запросы и связанные потоки.
  • ICMP/ICMPv6 важен для диагностики, MTU и работоспособности IPv6. Не блокируйте его полностью.
  • Порты 80/443 — типовой кейс для веб-узлов. Расширяйте набор по необходимости.
  • Логирование в конце цепочки даёт следы для отладки без заспамливания системных логов.

Ограничение доступа к SSH по списку адресов

Для повышения безопасности удобно держать отдельный набор допустимых адресов. Это быстрее, чем куча одиночных правил, и изменяется без перезагрузки всей политики.

flush ruleset

table inet filter {
    set ssh_allow {
        type ipv4_addr; flags interval;
        elements = { 203.0.113.10, 198.51.100.0/24 }
    }

    chain input {
        type filter hook input priority 0;
        policy drop;

        ct state invalid drop
        iif lo accept
        ct state established,related accept

        ip saddr @ssh_allow tcp dport 22 accept comment "SSH allowlist"
        ip6 nexthdr ipv6-icmp accept
        ip protocol icmp accept
        tcp dport { 80, 443 } accept

        limit rate 5/second counter log prefix "nft-drop: "
        drop
    }

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

Для IPv6 можно завести отдельный набор type ipv6_addr и продублировать правило с ip6 saddr @ssh6_allow.

Persist: сохраняем правила между перезагрузками

Стандартный путь — хранить правила в /etc/nftables.conf и включить сервис nftables. При старте он применит файл целиком, что удобно для инфраструктурного контроля версий.

nft list ruleset > /etc/nftables.conf
nft -f /etc/nftables.conf
systemctl enable --now nftables

Рекомендации по структуре файла:

  • Используйте одно семейство inet, чтобы не дублировать IPv4/IPv6-правила в разных таблицах.
  • Группируйте порты в наборы (set) и добавляйте комментарии к чувствительным правилам.
  • Для крупных окружений разбивайте конфигурацию на части через директиву include в /etc/nftables.conf.

Изменения на лету и атомарные загрузки

Два подхода равноправно полезны:

  • Малые правки: добавляйте/удаляйте правила командами nft add rule и nft delete rule.
  • Большие правки: редактируйте файл конфигурации и применяйте его целиком через nft -f.

Примеры онлайновых правок:

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

# Посмотреть с handle, чтобы удалить точечно
nft -a list chain inet filter input

# Добавить правило блокировки SMTP-входа
nft add rule inet filter input tcp dport 25 drop comment "Block SMTP inbound"

# Удалить правило по handle (подставьте свой номер)
nft delete rule inet filter input handle 123

При работе через файл конфигурации удобно держать запасной SSH-сеанс. Если загрузка не удалась, старые правила останутся активными — проверьте синтаксис и комментарии в логе.

Отладка: счётчики, логирование, трассировка

nftables даёт полноценный инструментарий наблюдаемости на уровне правил:

  • Счётчики: добавляйте модификатор counter к правилам и смотрите, сколько пакетов/байт через них прошло.
  • Логи: log prefix "..." с rate limit помогает понять, что и почему дропается.
  • Трассировка: механизм nftrace и команда nft monitor trace показывают путь пакета по правилам.

Примеры:

# Включить счётчики в интересующих правилах и посмотреть
nft list chain inet filter input

# Онлайн-мониторинг логов ядра
journalctl -k -f | grep nft

# Трассировка: запустить монитор
nft monitor trace

# Включить трассировку для конкретного трафика (пример по порту 22)
nft add rule inet filter input tcp dport 22 meta nftrace set 1 comment "trace ssh"

# После отладки правило-триггер удалите
nft -a list chain inet filter input
nft delete rule inet filter input handle 200

В выходе nft monitor trace вы увидите по каким цепочкам и с какими результатами проходит пакет. Это крайне полезно, когда на первый взгляд «всё должно работать», но соединение всё равно рвётся.

Трассировка пакетов nft monitor trace

ICMP и IPv6: не рубите с плеча

Полный бан ICMP — историческая ошибка из эпохи IPv4-файрволов. Для IPv6 ICMPv6 критичен: без него ломаются соседское обнаружение и маршрутизация. Минимум — разрешить echo, router/neighbor solicitation/advertisement. Подходите избирательно: ограничивайте логирование, но не блокируйте протоколы, на которых держится стек.

Forward и контейнеры

Если ваш VDS не маршрутизирует пакеты (нет контейнерных бриджей/виртуальных маршрутов), разумно держать forward в drop. Если используются контейнеры или гипервизоры, проверьте их интеграцию с nftables: некоторые инструменты управляют правилами самостоятельно. В таком случае либо адаптируйте свои цепочки под их модель, либо делегируйте им управление forward/nat, избегая гонки за приоритеты и дублирование политик.

Rate limit и защита от грубой силы на порту SSH

В nftables есть базовые средства ограничений. Они не заменяют полноценные системы вроде IDS/IPS, но способны подснизить шум:

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

        ct state invalid drop
        iif lo accept
        ct state established,related accept

        tcp dport 22 ct state new limit rate 15/minute accept comment "SSH limited"
        tcp dport { 80, 443 } accept
        ip protocol icmp accept
        ip6 nexthdr ipv6-icmp accept

        drop
    }
}

Это не серебряная пуля, но при массовых переборах из ботов поможет чуть разгрузить журнал и демона SSH.

Миграция с iptables: перевод и типичные подводные камни

Перейти с iptables проще всего через утилиты перевода. Начните с экспериментов на стенде или в нерабочее время — различия в семантике есть, и нужно убедиться в корректности.

# Перевести одиночное правило из старого синтаксиса
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT

# Перевести набор из резервной копии
iptables-save > /root/iptables.backup
iptables-restore-translate < /root/iptables.backup > /root/nft-translated.conf

# Просмотреть/проверить и затем подать в nft
nft -f /root/nft-translated.conf

На что обратить внимание:

  • Семейства и хуки: используйте table inet с цепочками input/forward/output, если хотите единые правила для IPv4/IPv6.
  • Модули и расширения iptables не всегда 1:1 транслируются. Проверяйте каждую цепочку функционально.
  • NAT: если у вас есть DNAT/SNAT/masquerade, готовьте отдельную таблицу ip nat или inet с цепочками prerouting/postrouting и корректными приоритетами.
  • Привычные «цепочки-парковки» из iptables можно заменить наборами и фрагментацией конфигов через include.

Диагностика типовых проблем

Сценарии и быстрые проверки:

  • «Пропал SSH после reload»: проверьте, не ушли ли в drop правила до разрешения SSH. Держите запасной сеанс, введите разрешающее правило вручную, затем исправьте конфиг и перезагрузите файл целиком.
  • «HTTP открыт, но страницы не грузятся»: посмотрите ct state и наличие established,related в начале цепочки. Убедитесь, что не режете ICMP и PMTU.
  • «IPv6 не работает»: проверьте, открыт ли ICMPv6 и не отсекаете ли вы соседское обнаружение. Убедитесь, что семейство таблицы — inet, а правила применимы к IPv6.
  • «Заспам логов»: используйте limit rate в логирующих правилах и размещайте логирование ближе к концу цепочки.

Хардненинг по шагам

  1. Включите policy drop в input/forward, оставив output accept.
  2. Добавьте ранний ct state invalid drop и established,related accept.
  3. Грамотно разрешите ICMP/ICMPv6.
  4. Откройте только нужные сервисы (SSH, веб, базы — по необходимости) и вынесите порты в наборы.
  5. Разделите SSH-доступ по наборам адресов, если возможно.
  6. Включите счётчики и немного логов с ограничением по скорости.
  7. Сделайте persist через /etc/nftables.conf и проверьте автозапуск сервиса.
  8. Заведите процедуру безопасного обновления: черновик в файл, проверка синтаксиса, атомарная загрузка, тесты снаружи.

Бэкап и аудит

Держите последние рабочие версии конфигов под контролем версий. Перед изменениями сохраняйте действующий ruleset в артефакты развёртывания и в журнал изменений — это ускорит откат и упростит аудит.

# Резервная копия текущего ruleset
nft list ruleset > /root/nftables.backup.conf

# Проверка синтаксиса нового файла (попытка загрузки без перманентного применения)
nft -f /path/to/new-nftables.conf
nftables — удобная и производительная основа сетевой безопасности для VDS. Делайте изменения атомарно и всегда страхуйтесь запасным SSH-сеансом.

Итог

Начните с аккуратного базового ruleset в семействе inet, включите persist, ведите конфигурацию как код и используйте встроенные инструменты наблюдаемости: счётчики, логи и трассировку. При миграции с iptables заложите время на тесты и сверку функциональности — это даст предсказуемость, стабильность и прозрачность сетевой политики вашего сервера.

Поделиться статьей

Вам будет интересно

mTLS для админок и API на VDS: клиентские сертификаты, ssl_verify_client и ротация OpenAI Статья написана AI Fastfox

mTLS для админок и API на VDS: клиентские сертификаты, ssl_verify_client и ротация

mTLS — способ ограничить доступ к админке и приватному API только доверенным клиентам. В статье: как поднять клиентский CA, выпуск ...
PgBouncer на VDS: пулы соединений PostgreSQL, конфиг, лимиты и метрики OpenAI Статья написана AI Fastfox

PgBouncer на VDS: пулы соединений PostgreSQL, конфиг, лимиты и метрики

Почему PgBouncer обязателен на нагруженном VDS с PostgreSQL: пулы соединений экономят память и ускоряют отклик. Разберём установку ...
Object Storage как CDN для статики: S3‑совместимое хранилище, подписи, кэш и версияция OpenAI Статья написана AI Fastfox

Object Storage как CDN для статики: S3‑совместимое хранилище, подписи, кэш и версияция

Разбираем, как использовать S3‑совместимое объектное хранилище как CDN для статики. Настроим Cache-Control, ETag и Last-Modified, ...