Модули ядра подсистемы netfilter: устройство, загрузка и управление

Команда lsmod | grep nf_ показывает пустой вывод, а правила файрвола при этом не работают — типичный признак того, что нужные модули ядра подсистемы netfilter не загружены. Именно эти модули обеспечивают фильтрацию пакетов, NAT, отслеживание соединений и работу таких инструментов, как iptables, nftables и firewalld. Без них ни одно правило, добавленное пользовательской утилитой, не будет реально применяться к трафику.

В этой статье разберём, что представляет собой подсистема netfilter, какие модули ядра входят в её состав, как проверить их состояние и загрузить вручную, а также какие ошибки чаще всего встречаются при настройке фильтрации в Linux.

Что такое netfilter и зачем нужны его модули

Netfilter — это программный каркас (framework) внутри ядра Linux, который перехватывает сетевые пакеты на различных этапах их прохождения через сетевой стек. Он предоставляет точки перехвата — так называемые hooks (хуки), к которым подключаются обработчики из модулей ядра.

Пользовательские утилиты вроде iptables или nft сами по себе ничего не фильтруют. Они лишь передают правила в ядро, а реальную проверку пакетов выполняют модули netfilter. Поэтому корректная работа файрвола напрямую зависит от того, какие модули загружены и поддерживаются ли они вашей сборкой ядра.

Основные задачи, которые решает подсистема:

  • 🔥 Фильтрация пакетов — разрешение или блокировка трафика по заданным критериям
  • 🔄 Трансляция адресов (NAT) — masquerade, проброс портов, перенаправление
  • 🔗 Отслеживание соединений (connection tracking) — учёт состояния каждого потока
  • 📊 Учёт и маркировка пакетов для последующей обработки и маршрутизации

Ключевые модули ядра netfilter

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

Модуль Назначение
nf_tables Ядро подсистемы nftables — современный интерфейс правил
nf_conntrack Отслеживание состояния соединений (conntrack)
nf_nat Трансляция сетевых адресов (NAT)
ip_tables / ip6_tables Классический интерфейс iptables для IPv4 и IPv6
xt_conntrack, xt_state Модули сопоставления состояний соединений в правилах

Отдельно стоит упомянуть вспомогательные модули-«хелперы» для конкретных протоколов: nf_conntrack_ftp, nf_conntrack_sip и другие. Они нужны, когда протокол открывает дополнительные динамические соединения, которые фильтр должен распознавать как связанные с основным.

Чем nftables отличается от iptables

nftables — более новая подсистема, объединяющая фильтрацию IPv4, IPv6, ARP и bridge в единый синтаксис через утилиту nft. iptables — классический интерфейс с отдельными таблицами для каждого семейства адресов. В современных дистрибутивах iptables часто работает как надстройка (backend) поверх nf_tables.

Как проверить загруженные модули

Прежде чем что-то менять, посмотрите текущее состояние. Список загруженных модулей netfilter выводится командой:

lsmod | grep -E 'nf_|xt_|ipt'

Если конкретный модуль нужно проверить отдельно, используйте lsmod | grep nf_conntrack. Информацию о модуле — автора, описание, зависимости — покажет команда modinfo nf_conntrack.

Дополнительно полезно проверить таблицу отслеживаемых соединений. Её содержимое доступно через /proc/net/nf_conntrack, а удобный просмотр даёт утилита conntrack -L из пакета conntrack-tools, если он установлен в вашей системе.

📊 Какой интерфейс фильтрации вы используете?
iptables
nftables
firewalld
ufw

Загрузка и выгрузка модулей вручную

Обычно нужные модули подгружаются автоматически при добавлении правил, но в минимальных системах, контейнерах и на встраиваемых устройствах автозагрузка может не сработать. Тогда модуль загружают вручную:

modprobe nf_conntrack

modprobe nf_nat

Для выгрузки используется modprobe -r имя_модуля. Учтите: выгрузить модуль не получится, если он используется — например, когда в таблице conntrack есть активные соединения или на модуль ссылаются другие модули.

☑️ Проверка работоспособности netfilter

Выполнено: 0 / 5

Чтобы модуль загружался при старте системы, добавьте его имя в файл внутри каталога /etc/modules-load.d/, например /etc/modules-load.d/netfilter.conf — по одному имени модуля на строку. Этот механизм обрабатывается systemd-modules-load и присутствует в большинстве дистрибутивов с systemd.

⚠️ Внимание: выгрузка nf_conntrack на работающем сервере сбросит учёт состояний соединений. Правила, опирающиеся на состояние ESTABLISHED, временно перестанут пропускать уже установленные сессии — часть подключений может оборваться.

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

Одна из распространённых ситуаций — ошибка вида modprobe: FATAL: Module не найден. Возможные причины: модуль не включён при сборке ядра, установлено кастомное или урезанное ядро (часто встречается на VPS с виртуализацией OpenVZ/LXC, где ядро общее с хостом), либо пакет с модулями ядра не соответствует запущенной версии.

Проверьте соответствие версий командой uname -r и убедитесь, что каталог /lib/modules/$(uname -r)/ существует и содержит файлы модулей. Если ядро обновлялось, а система не перезагружалась, модули новой версии не подойдут к работающему ядру — потребуется перезагрузка.

Ещё один типичный симптом — переполнение таблицы conntrack с сообщениями nf_conntrack: table full, dropping packet в выводе dmesg. На нагруженных серверах лимит таблицы соединений придётся увеличить через параметр net.netfilter.nf_conntrack_max, иначе новые соединения начнут отбрасываться молча. Текущее значение смотрят через sysctl net.netfilter.nf_conntrack_max.

⚠️ Внимание: на виртуальных машинах с общим ядром (контейнеры LXC/OpenVZ) загрузка модулей и изменение параметров netfilter могут быть недоступны изнутри гостевой системы. В этом случае настройку нужно выполнять на стороне хоста или уточнять у провайдера, какие модули разрешены.

Взаимодействие с пользовательскими утилитами

Понимание связки «утилита → модуль ядра» помогает быстрее находить источник проблем. Когда вы выполняете iptables -A INPUT -p tcp --dport 22 -j ACCEPT, утилита через Netlink-сокет передаёт правило в ядро, где его обрабатывают модули ip_tables и xt_tcp. Аналогично nft add rule работает через nf_tables.

Надстройки вроде firewalld и ufw — это ещё один уровень абстракции: они генерируют правила для iptables или nftables. Поэтому при диагностике имеет смысл спускаться на уровень ниже и смотреть фактический набор правил командой nft list ruleset или iptables-save, а не только статус надстройки.

FAQ: частые вопросы о модулях netfilter

Как узнать, собран ли netfilter в моём ядре?

Проверьте конфигурацию ядра: grep CONFIG_NF_TABLES /boot/config-$(uname -r) или через сжатый вариант zcat /proc/config.gz | grep NETFILTER, если файл доступен. Значение =y означает встроенную поддержку, =m — сборку в виде загружаемого модуля.

Можно ли использовать iptables и nftables одновременно?

Технически да, оба интерфейса могут сосуществовать, а в ряде дистрибутивов iptables вообще работает поверх nf_tables. Однако смешанная конфигурация усложняет диагностику — правила из разных подсистем применяются независимо, и логика фильтрации становится неочевидной. Лучше выбрать один интерфейс.

Почему модуль не выгружается с ошибкой «in use»?

Модуль занят: есть активные отслеживаемые соединения, загруженные правила или зависимые модули. Посмотрите счётчик использования в выводе lsmod (третья колонка) и список зависимых модулей в четвёртой. Сначала удалите правила и выгрузите зависимые модули.

Нужно ли вручную загружать модули для NAT?

Обычно нет: при добавлении первого NAT-правила ядро подгружает nf_nat автоматически. Ручная загрузка через modprobe требуется в основном в минимальных окружениях, контейнерах и при нестандартных сборках ядра, где автозагрузка по запросу не срабатывает.

Где смотреть ошибки, связанные с netfilter?

Сообщения ядра выводятся командой dmesg или через журнал journalctl -k. Там видны переполнение таблицы conntrack, отказы загрузки модулей и отброшенные пакеты, если настроено логирование правилами с действием LOG.