ipfirewall

Краткое описание

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 IPFIREWALLIPFIREWALL разрешен
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" еще не выполнено - на данный момент не имеет эффекта.

 

На главную страницу