Презерватив для Windows Фленов Михаил Xakep, номер #068, стр. 068-098-2 Итак, как накодить фильтрацию пакетов? Это происходит в три этапа: 1. Создаем новый интерфейс, который будет использоваться для добавления или удаления фильтров к адаптеру. 2. Устанавливаем интерфейсу правила, по которым будет контролироваться доступ. 3. Связываем интерфейс с IP-адресом. Это самые необходимые этапы, которые решаются всего тремя функциями. Создание интерфейса Для создания интерфейса используется функция PfCreateInterface, которая выглядит следующим образом: Создание интерфейса Function PfCreateInterface( dwName : DWORD; inAction : PFFORWARD_ACTION; outAction : PFFORWARD_ACTION; bUseLog : BOOL; bMustBeUnique : BOOL; var ppInterface : INTERFACE_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfCreateInterface@24'; Рассмотрим параметры этой функции: dwName – имя интерфейса. Если указать 0, то будет создан новый уникальный. inAction – действие по умолчанию для входящего пакета. Если указать PF_ACTION_FORWARD, то пакет, не имеющий правил, будет принят, а если PF_ACTION_DROP, то удален. Для серверов файрвол должен быть настроен так, чтобы все, что не разрешено, было запрещено и по умолчанию удалялось. outAction – действия по умолчанию для выходящего пакета. Здесь значения те же, что и для параметра inAction. bUseLog – если параметр равен true, то к интерфейсу будет привязан журнал, по которому легко определяется активность. В данной статье мы их рассматривать не будем, но намекну, что создать журнал можно функцией PfMakeLog, а удалить с помощью PfDeleteLog. bMustBeUnique – если параметр true, то интерфейс уникальный и его правила не могут разделяться с другими. ppInterface – указатель на созданный интерфейс. Если функция отработала нормально, то результатом будет NO_ERROR. Теорема Пифагора После создания интерфейса можно добавлять правила, описывающие запрещение или разрешение на использование определенных портов или на подключение с определенных адресов. Для этого используется функция PfAddFiltersToInterface, которая выглядит так: Создание фильтра Function PfAddFiltersToInterface( ih: INTERFACE_HANDLE; cInFilters : DWORD; pfiltIn : PPF_FILTER_DESCRIPTOR; cOutFilters : DWORD; pfiltOut : PPF_FILTER_DESCRIPTOR; pfHandle : PFILTER_HANDLE): DWORD; stdcall; external IPHLPAPI name '_PfAddFiltersToInterface@24'; Давай подробно рассмотрим параметры этой функции: ih – указатель на созданный интерфейс. cInFilters – количество входных правил, описанных в параметре pfiltIn. pfiltIn – указатель на структуру, описывающий входные правила. cOutFilters – количество выходных правил, описанных в параметре pfiltOut. pfiltOut – указатель на структуру, описывающий выходные правила. pfHandle – буфер, через который можно получить массив указателей фильтров. Если это не нужно, то можно ставит nil. Структура правил При создании фильтра с помощью функции PfAddFiltersToInterface правила описываются в виде структуры. Эта структура выглядит следующим образом: |