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 – обрабатываются пакеты, приходящие снаружи, в том числе и передаваемые дальше, после этого производится проверка на необходимость демаскарадинга (результат передаётся в цепочку output), затем принимается решение о необходимости маршрутизации
- forward – обрабатываются пакеты, чьи исходные и конечные адреса лежат снаружи, в т.ч. посланные изнутри на локальный интерфейс
- output – обрабатываются пакеты, уходящие наружу (в т.ч. после маршрутизации и преобразования адресов)
- определенные пользователем – используются в качестве подпрограмм, есть отлов циклов, имя не длинее 8 символов
Общая схема обработки пакетов (взята из NAG2):
Действия (действие в недопустимом месте эквивалентно 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
Взято с Bog BOS