Брандмауэры реализованы ядром в другой части сетевого кода. По сути, это сводится к выбору «хуков» (к которым можно получить доступ либо из пространства ядра, либо из пространства пользователя, либо из обоих), которые уведомляют об активности.
Эта активность может быть входящей (входящей) или исходящей (выходной) в зависимости от того, кто создал пакет. Для каждого пакета и, как правило, для каждого соединения для протоколов с отслеживанием состояния, ориентированных на соединение, брандмауэр получает возможность перезаписать, наложить вето (например, вернуть ошибку) или просто молча отбросить данный пакет или соединение. (Реализации различаются, а доступные действия могут быть более сложными).
Ключевым моментом является то, что интерфейсы сильно отличаются от обычного интерфейса сокетов - вам говорят, что что-то происходит, и спрашивают, что вы хотели бы сделать в связи с этим, но вам не дают того же разрешения Интерфейс стиля / listen / connect, который обычно используется для программирования сокетов.
Например, в Linux брандмауэр реализован в виде полей «фильтра» ввода / вывода в этой диаграмме потоков пакетов , тогда как код сокетов происходит в красном слое на верхнем уровне, помеченном как «уровень протокола / приложения» «