Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #68, АВГУСТ 2004 г.

Презерватив для 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 правила описываются в виде структуры. Эта структура выглядит следующим образом:

Назад на стр. 068-098-1  Содержание  Вперед на стр. 068-098-3