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
На 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.

Базовый конфиг для 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
вы увидите по каким цепочкам и с какими результатами проходит пакет. Это крайне полезно, когда на первый взгляд «всё должно работать», но соединение всё равно рвётся.
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
в логирующих правилах и размещайте логирование ближе к концу цепочки.
Хардненинг по шагам
- Включите
policy drop
вinput
/forward
, оставивoutput accept
. - Добавьте ранний
ct state invalid drop
иestablished,related accept
. - Грамотно разрешите ICMP/ICMPv6.
- Откройте только нужные сервисы (SSH, веб, базы — по необходимости) и вынесите порты в наборы.
- Разделите SSH-доступ по наборам адресов, если возможно.
- Включите счётчики и немного логов с ограничением по скорости.
- Сделайте persist через
/etc/nftables.conf
и проверьте автозапуск сервиса. - Заведите процедуру безопасного обновления: черновик в файл, проверка синтаксиса, атомарная загрузка, тесты снаружи.
Бэкап и аудит
Держите последние рабочие версии конфигов под контролем версий. Перед изменениями сохраняйте действующий ruleset в артефакты развёртывания и в журнал изменений — это ускорит откат и упростит аудит.
# Резервная копия текущего ruleset
nft list ruleset > /root/nftables.backup.conf
# Проверка синтаксиса нового файла (попытка загрузки без перманентного применения)
nft -f /path/to/new-nftables.conf
nftables — удобная и производительная основа сетевой безопасности для VDS. Делайте изменения атомарно и всегда страхуйтесь запасным SSH-сеансом.
Итог
Начните с аккуратного базового ruleset в семействе inet
, включите persist, ведите конфигурацию как код и используйте встроенные инструменты наблюдаемости: счётчики, логи и трассировку. При миграции с iptables заложите время на тесты и сверку функциональности — это даст предсказуемость, стабильность и прозрачность сетевой политики вашего сервера.