Как Pfctl устанавливает правила брандмауэра для расширения ядра - PullRequest
0 голосов
/ 03 октября 2018

Я бы хотел создать процесс на основе демона, который настраивал бы возможности брандмауэра модуля сетевого ядра.

В настоящее время я могу управлять этим брандмауэром ядра, используя pfctl и различные файлы конфигурации, описывающие правила фильтрации.Тем не менее, я хочу внедрить правила для пакетирования сначала напрямую, используя C ++ / Objective-C API.

Например, чтобы заблокировать IP-адрес от любого сетевого интерфейса в моей настройке, требуется добавить block from any to <ip_addr> в /etc/pf.conf файл и перезагрузить брандмауэр с помощью sudo pfctl -d, а затем sudo pfctl -e -f /etc/pf.conf

Есть ли возможность использовать ioctl или другой системный вызов для связи напрямую с брандмауэром ядра?

РЕДАКТИРОВАТЬ: Исходный код pfctl здесь , но я все еще пытаюсь расшифровать, как генерировать правильную команду ioctl для установки нового правила ..

1 Ответ

0 голосов
/ 07 декабря 2018

Исходный код, который вы добавили в ссылку, принадлежит самой подсистеме pf (в ядре), а не утилите pfctl (8).Если вы посмотрите прямо рядом с pf.c в источниках XNU, вы увидите полный список IOCTL PF в pf_var.h (http://newosxbook.com/src.jl?tree=xnu&ver=4570.41.2&file=bsd/net/pfvar.h),, начиная с DIOCSTART. Это должно дать вам всю информацию, которую нужно добавитьправила, удаление, изменение и т. д. Просто откройте / dev / pf, и вы можете напрямую использовать ioctl (2). Другая идея - запустить pfctl под lldb (с точкой останова на ioctl), чтобы увидеть, какое правило (третий ioctl).параметр) выглядит как в памяти.

...