div.main {margin-left: 20pt; margin-right: 20pt}Bog BOS: ipchains: фильтрация пакетов в Linux: принципы работы, установка и
настройка
ipchains предоставляет встроенные в ядро Linux 2.2 средства фильтрации
пакетов и программы (ipchains, ipchains-save, ipchains-restore) управления ими.
Может быть использован для организации брандмауэра (firewall) класса фильтрации
пакетов или усиления защиты сервера.
Необходимо иметь ядро 2.1.102 или более новое, при генерации
которого включены FIREWALL и IP_FIREWALL (появляются
/proc/net/ip_fwchains и /proc/net/ip_fwnames). Настойчиво
рекомендуется дефрагментировать все пакеты
(/proc/sys/net/ipv4/ip_always_defrag или IP_ALWAYS_DEFRAG, в
зависимости от версии ядра).
Каждый проверяемый IP-пакет проходит по цепочке ("сквозь строй")
правил, определяющих, что с ним делать. Правило состоит из шаблона и действия.
Каждая цепочка имеет действие по умолчанию. Задействованы цепочки с именами:
input - обрабатываются пакеты, приходящие снаружи или с loopback;
forward - обрабатываются пакеты, чьи исходные и конечные адреса лежат
снаружи;
output - обрабатываются пакеты, уходящие наружу или loopback;
определенные пользователем - используются в качестве подпрограмм, есть
отлов циклов.
Действия (действие в недопустимом месте эквивалентно DENY):
ACCEPT - пропустить пакет;
REJECT - отвергнуть, послав ICMP Host Unreachable (если пакет не ICMP);
DENY - выбросить молча;
MASQ - только для цепочки forward - подменить адрес отправителя на свой,
номер порта на свежесгенеренный и запомнить в таблицах ядро, чтобы обратный
пакет преобразовывался автоматически;
REDIRECT - только для цепочки input, TCP или UDP - несмотря на то, что
пакет чужой, послать его локальному процессу на указанный порт;
имя пользовательской цепочки - переход на подпрограмму;
RETURN - конец цепочки (как бы возврат из пользовательской
цепочки-подпрограммы);
пусто - только увеличить счетчики байтов и пакетов и перейти к следующему
правилу в цепочке, счетчики - 64-битные.
Управление цепочками производится с помощью программ ipchains,
ipchains-save (сохранение текущей конфигурации на stdout), ipchains-restore
(чтение сохраненной ранее конфигурации с stdin). После загрузки определены
цепочки input (ACCEPT), output (ACCEPT), forward (ACCEPT). Основные опции
ipchains:
-N имя-цепочки (создать цепочку)
-X имя-цепочки (удалить пустую цепочку, на которую нет
ссылок)
-L [ -v ] [имя-цепочки] (показать список
правил и счетчики)
-A имя-цепочки правило (добавить правило к цепочке)
-D имя-цепочки номер (удалить правило с указанным
номером, нумерация с 1)
-D имя-цепочки правило (удалить правило по
текстуальному совпадению)
-F имя-цепочки (удалить все правила из цепочки)
-I имя-цепочки номер правило (вставить
правило в цепочку перед правилом с указанным номером, нумерация с 1)
-R имя-цепочки номер правило (заменить)
-M -L (показать текущие маскарадные соединения)
-M -S tcp tcpfin udp (установить
соответствующие timeout в секундах)
-h icmp (выдать список ICMP имен)
-Z имя-цепочки (обнулить счетчики)
-C имя-цепочки пакет (тестировать прохождение пакета)
-P имя-цепочки действие (изменить действие по
умолчанию)
Шаблон правила может включать (если в качестве адреса хоста
указывается имя, соответствующее нескольким адресам, то при добавляется
соответствующее количество правил; восклицательный знак инвертирует шаблон):
--proto | -p [!] протокол
(tcp/udp/icmp/all)
--bidirectional | -b (добавляется два правила: прямое и
обратное)
--source | -s | --src [!]
address[/mask] [!]
[port[:port]] (маска может быть записана как в
виде 4-х десятичных чисел через точку, так и в виде одного числа)
--source-port [!] [port[:port]]
--destination | -d | --dst [!]
address[/mask] [!]
[port[:port]]
--destination-port [!]
[port[:port]]
--icmp-type [!] имя
--interface | -i [!] имя[+]
(ppp0, lo, eth0; + - соответствует любой подстроке)
--jump | -j действие
[port](номер порта для REDIRECT)
--mark | -m [+-]число (пометить пакет
для QoS)
--log | -l (запись о пакете в журнал)
--numeric | -n (выводить адреса и порты в числовом виде)
--output | -o [maxsize] (вывести пакет на
устройство netlink)
-v (повысить болтливость)
[!] --fragment | -f (только для последующих кусков
фрагментированных пкетов)
[!] --syn | -y (имеет смысл только для TCP: только
пакеты с установленным флагом SYN, отрицание означает установленный флаг ACK)
--TOS | -t andmask xormask
(управление битами TOS - type of service) Тщательно составленные и
отлаженные цепочки сохранять по ipchains-save
(ipchains.transparent_proxy_and_firewall) и восстанавливать при загрузке
по ipchans-restore (/etc/rc.d).
В RH 6.2 появился сервис ipchains (управляемый обычным
chkconfig) в /etc/rc.d/init.d с функциями:
start (настройки берутся из /etc/sysconfig/ipchains -
делаются либо с помощью функции save, либо ipchains-save)
stop
restart
status
save (сохранить текущие настройки в /etc/sysconfig/ipchains)
panic (полная блокировка в случае атаки)
Пример с использованием /etc/sysconfig/ipchains (в RH6.2
позволяет комментарии): :input ACCEPT
:forward ACCEPT
:output ACCEPT
# доступ к HTTP-серверу (если есть)
-A input -s 0.0.0.0/0.0.0.0 -d 127.0.0.1/255.255.255.255 80:80 -i lo -p 6 -j ACCEPT -l
-A input -s 0.0.0.0/0.0.0.0 -d 127.0.0.1/255.255.255.255 80:80 -p 6 -j DENY -l
-A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 80:80 -p 6 -j ACCEPT
# поддержка transparent proxy
-A input -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 80:80 -p 6 -j REDIRECT 3128
-A input -s сосед/255.255.255.255 -d наш-адрес/255.255.255.255 3130:3130 -p 17 -j ACCEPT
-A input -s клиенты-proxy -d наш-адрес/255.255.255.255 3128:3128 -p 6 -j ACCEPT
# NTP from LAN and dialup
-A input -s сервера-NTP 123:123 -d наш-адрес/255.255.255.255 123:123 -p 17 -j ACCEPT
# syslog from LAN
-A input -s откуда-беррем-syslog -d наш-адрес/255.255.255.255 514:514 -p 17 -j ACCEPT
# FTP from anywhere
-A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 21:21 -p 6 -j ACCEPT
-A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 20:20 -p 6 -j ACCEPT
# пропуск FTP passive mode (д.б. согласован с passive ports в ftpaccess)
-A input --syn -s 0.0.0.0/0.0.0.0 -d 195.161.72.12/255.255.255.255 начало:конец -p 6 -j ACCEPT
# DNS
# -A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 53:53 -p 6 -j ACCEPT
# -A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 53:53 -p 17 -j ACCEPT
# на адресах выше 32k только клиенты (кроме ftpd в пассивном режиме, ниже вообще ничего), заодно борьба с gnome
-A input --syn -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 32768:65535 -p 6 -j DENY
-A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 32768:65535 -p 17 -j ACCEPT
-A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 32768:65535 -p 6 -j ACCEPT
# ICMP
-A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 -p 1 -j ACCEPT
# все остальное - запретить (DENY or REJECT ?)
-A input -s 0.0.0.0/0.0.0.0 -d наш-адрес/255.255.255.255 -j DENY -l
-A forward -s 0.0.0.0/0.0.0.0 -d 0.0.0.0/0.0.0.0 -l
IPCHAINS-HOWTO
ipchains.8, ipfw.4, ipchains-save.8, ipchains-restore.8
сайт разработчика
Роберт Л. Зиглер. Брандмауэры в Linux. Издательский дом "Вильямс", 2000
Sergey E. Bogomolov
|