ipfirewall FreeBSD

Ipfrewall псевдоним ipfw - это системное устройство, которое позволяет выполнять фильтрацию, переадресацию и другие операции с IP-пакетами, проходящими через системный интерфейс. Выбор пакетов производится путем применения упорядоченного списка правил образцов к кажому пакету до тех пор, пока не будет найден подходящий, после чего выполняются соответствующие действия по передаче этого пакета. Привила нумеруются от 1 до 65534, а составные правила могут иметь (разделять) один и тот же номер.

Одно правило - оно имеет номер 65535 - существует всегда. Правило 65535 обычно действует для пакетов, которые должны быть отброшены. Следовательно, любой пакет, который не удовлетворяет какому-либо из правил с меньшим номером, будет отброшен. Однако опция IPFIREWALL_DEFAULT_TO_ACCEPT - она устанавливается во время компиляции ядра - позволяет администратору изменять эти постоянные правила - можно наоборот - разрешить все.

Значение, переданное в setsockopt() - это просто структура ip_fw, описывающая правило (см. ниже). В исключительных случаях, таких как IP_FW_DEL, имеет значение только номер правила (см. syslog(3)) для дальнейшей регистрации посредством syslogd(8); IP_FIREWALL_VERBOSE_LIMIT ограничивает максимальное количество порождаемых правилом сообщений о регистрации. Эти переменные можно изменять при помощи sysctl

.

Команды

Для управления списком правил используются следующие опции сокета.

IP_FW_ADD

добавляет правило в список

IP_FW_DEL

удаляет все правила, имеющие соответствующий номер

IP_FW_GET

возвращает (первое) правило, имеющее соответствующий номер

IP_FW_ZERO

обнуляет статистику по всем правилам с соответсвующими номерами; если номер правила 0, то обнуляются всеправила.

IP_FW_FLUSH

удаляет все правила, за исключением 65535.

Если уровень безопасности ядра (см. init) больше 2, разрешена только команда IP_FW_GET.

Структура правила

Правила описываются следующей структурой.

/*Определяет интерфейс */

union ip_fw_if {

struct in_addr fu_via_ip;

/* Определение по IP-адресу */

struct {

/* Определение имени интерфейса */

#define FW_IFNLEN 6

/*Для сохранения размера структуры с границах 2-х */

char name [FW_IFNLEN];
} fu_via_if;
};

/* -1 означает соответствие любой единице */

union ip_fw_if fw_in_if, fw_out_if;

/* Входящие/исходящие итерфейсы */

union {

u_short fu_divert_port;

/*Перенаправляющий/копирующий порт */

u_short fu_skip_to_rule;

/*Команда пропустить правило */

u_short fu_reject_code;
} fw_un;

/*Код ответа "отвергнуть" */

u_char fw_prot;

/* IP-протокол */

u_char fw_nports

/*Номера src-портов и номера dst-портов */

/*В массиве портов )dst-порты следуют */

/*за src-портами; максимум 10 портов ао всех;
0 означает соотствие всем портам */

/* Кодирование номеров портов источников/приемников из ipfw_nports */

#define IP_FW_GETNSRCP(rule)

((rule)->fw_nports & 0x0f)

#define IP_FW_SETNSRCP(rule, n)

do {
(rule)->fw_nports &= ~0x0f;
(rule)->fw_nports |= (n);
} while (0)

#define IP_FW_GETNDSTP(rule)

((rule)->fw_nports >> 4)

#define IP_FW_SETNDSTP(rule, n)

do {
(rule)->fw_nports &= ~0xf0;
(rule)->fw_nports |= (n) << 4;
} while (0)

/* Значения флагов для поля "flags" */

#define IP_FW_F_IN

0x0001

/* Проверить входящие пакеты */

#define IP_FW_F_OUT

0x0002

/* Проверить исходящие пакеты */

#define IP_FW_F_IIFACE

0x0004

/* Применить "входящий" тест интерфейса */

#define IP_FW_F_OIFACE

0x0008

/* Применить исходящий тест интерфейса */

#define IP_FW_F_COMMAND

0x0070

/* Маска для типа последовательного входа */

#define IP_FW_F_DENY

0x0000

/*Это запрещающее правило */

#define IP_FW_F_REJECT

0x0010

/*Запретить и сообщить об этом, послав ответный пакет */

#define IP_FW_F_ACCEPT

0x0020

/*Разрешающее правило */

#define IP_FW_F_COUNT

0x0030

/*Правило счета */

#define IP_FW_F_DIVERT

0x0040

/*Правило перенаправления */

#define IP_FW_F_TEE

0x0050

/* Правило дублирования */

#define IP_FW_F_SKIPTO

0x0060

/* Правило "пропустить" */

#define IP_FW_F_PRN

0x0080

/* Вывод на печать в случае соответствия правилу */

#define IP_FW_F_SRNG

0x0100

/* Первые два src-порта - это диапазон минимума и максимума (хранимые в порядке главного байта),

#define IP_FW_F_DRNG

0x0200

/* Первые два dst-порта - диапазон минимума и максимума, хранимые в порядке глаавного байта */

Слово флагов

IP_FW_F_DENY

Отбросить пакет

IP_FW_F_REJECT

Отбросить пакет и послать сообщение об отказе по протоколу ipmp или tcp

IP_FW_F_ACCEPT

Принять пакет

IP_FW_F_COUNT

Инкрементный счетчик; продолжать поиск

IP_FW_F_DIVERT

Перенаправить пакет в сокет divert(4)

IP_FW_F_TEE

Копировать пакет в сокет divert(4)

IP_FW_F_SKIPTO

Пропустить до правила fu_skipto_rule

В случае команды IP_FW_F_REJECT, если fu_reject_code - это число от 0 до 255, тогда пакет icmp, сигнализирующий "сеть недоступна", отправляется обратно по первоначальному IP-адресу источника с соответствующим ответным кодом. В противном случае значение должно быть 256 и протокол IPPROTO_TCP, в этом случае взамен посылается переадресующий пакет tcp.

C IP_FW_F_SKIPTO все успешные правила имеют номер меньший, чем пропущенные fu_skipto_rule.

Опции ядра

Опции файла конфигурации ядра:

options IPFIREWALL

IPFIREWALL разрешен

options IPFIREWALL_VERBOSE

Разрешить записть событий firewall в журнал

options IPFIREWALL_VERBOSE_LIMIT

ограничить журанал firewall'a

options IPDIVERT

Разрешить сокет divert

Если пакеты соответствуют правилу с установленным битом IP_FW_F_PRN и если разрешена регистрация пакетов (IPFIREWALL_VERBOSE), сообщение записывается в /dev/klog с установкой LOG_SECURITY для дальнейшего протоколирования посредством syslogd(8); IPFIREWALL_VERBOSE_LIMIT ограничивает максимальное количество порождаемых правилом сообщений протоколирования. Эти переменные доступны через sysctl.

Коды возврата

Функция syssockopt() возвращает 0 в случае успеха. В противном случае возвращается "-1". Для индикации ошибки устанавливается глобальная переменная errno.

Опции

Функция setsockopt() не будет выплнена, если:

[EINVAL]

поле опции IP было сформировано неправильно; поле опции было короче минимального значения или длиннее максимального.

Правило "tee" еще не выполнено - на данный момент не имеет эффекта.

Обновлено: 12.03.2015