Брандмауэр не существует в единственном месте сетевого стека ядра. В Linux, например, базовая инфраструктура для поддержки функций брандмауэра обеспечивается структурой фильтра пакетов netfilter . Инфраструктура netfilter сама по себе представляет собой не более чем набор перехватчиков в различных точках стека протоколов ядра .
Netfilter предоставляет пять перехватчиков:
NF_IP_PRE_ROUTING
Пакеты, прошедшие начальную проверку работоспособности, передаются на перехватчик NF_IP_PRE_ROUTING
. Это происходит до того, как будут приняты какие-либо решения о маршрутизации.
NF_IP_LOCAL_IN
Пакеты, предназначенные самому хосту, передаются ловушке NF_IP_LOCAL_IN
.
NF_IP_FORWARD
Пакеты, предназначенные для другого интерфейса, передаются ловушке NF_IP_FORWARD
.
NF_IP_LOCAL_OUT
Локально созданные пакеты передаются на NF_IP_LOCAL_OUT
после принятия решения о маршрутизации, хотя маршрутизация может быть изменена в результате перехвата.
NF_IP_POST_ROUTING
Перехватчик NF_IP_POST_ROUTING
- это последний перехватчик пакетов, который может быть передан перед передачей по сети.
Брандмауэр состоит из модуля ядра, который регистрирует функцию обратного вызова для каждого из перехватчиков, предоставляемых инфраструктурой netfilter; и инструменты пользовательского пространства для настройки брандмауэра. Каждый раз, когда пакет передается ловушке, вызывается соответствующая функция обратного вызова.Функция обратного вызова может свободно манипулировать пакетом, вызвавшим обратный вызов. Функция обратного вызова также определяет, обрабатывается ли пакет дальше; упавший; обрабатывается самим обратным вызовом; в очереди, обычно для обработки пользовательского пространства; или если та же ловушка должна быть вызвана снова для пакета.
Netfilter обычно связан с пакетным фильтром iptables . Как Gnouc уже указывал в вашем предыдущем вопросе , iptables имеет модуль ядра, ip_tables
, который взаимодействует с netfilter, и программу пользовательского пространства, iptables
, для настройки встроенный в ядро фильтр пакетов. Фактически, фильтр пакетов iptables предоставляет несколько инструментов, каждый из которых связан с различным типом обработки пакетов:
Инструмент пользовательского пространства iptables
и модуль ядра ip_tables
связаны с Фильтрация пакетов IPv4 .
Инструмент пользовательского пространства ip6tables
и модуль ядра ip6_tables
занимаются фильтрацией пакетов IPv6 .
Средство пользовательского пространства arptables
и модуль ядра arp_tables
занимаются фильтрацией пакетов ARP .
В дополнение к фильтрам пакетов iptables, инструмент пользовательского пространства ebtables
и модуль ядра eb_tables
занимаются фильтрацией кадров канального уровня Ethernet . В совокупности эти инструменты иногда называют xtables из-за схожей архитектуры на основе таблиц.
Эта архитектура обеспечивает абстракцию выбора пакетов на основе таблиц прохождения пакетов. Каждая таблица содержит правила фильтрации пакетов, организованные в цепочки . Пять предопределенных цепочек PREROUTING, INPUT, FORWARD, OUTPUT и POSTROUTING соответствуют пяти внутренним перехватчикам, предоставляемым netfilter. Таблица, к которой принадлежит правило, определяет относительный порядок правил, когда они применяются к конкретному хуку netfilter:
raw
фильтрует пакеты перед любой другой таблицей. mangle
используется для изменения пакетов. nat
используется для трансляции сетевых адресов (например, переадресации портов).
используется для фильтрации пакетов, она никогда не должна изменять пакеты.
используется для сетевых правил обязательного контроля доступа (MAC), реализуемых модулями безопасности Linux (LSM), такими как SELinux. Следующая диаграмма Яна Энгельхардта показывает, как таблицы и цепочки соответствуют различным уровням модели OSI:
Ранее в этом году новая структура пакетного фильтра под названием nftables была объединена в основное ядро Linux версии 3.13. Фреймворк nftables предназначен для замены существующих инструментов xtables. Он также основан на инфраструктуре netfilter.
Другие межсетевые экраны на основе ядра в Unix-подобных операционных системах включают IPFilter (мультиплатформенный), PF (OpenBSD, портированный на различные другие варианты BSD и Mac OS X), NPF (NetBSD), ipfirewall (FreeBSD, портирован на различные операционные системы).