Настройка и работа в Linux

         

Firewall и NAT (masquerading)


Документация:

  • IPCHAINS-HOWTO
  • NET-3-HOWTO (может есть NET-4?), август 1998
  • IP-Masquerading-HOWTO
  • PPP-HOWTO
  • Ethernet-HOWTO
  • Firewall-HOWTO
  • сайт автора: Linux IP Firewalling Chains
  • ipchains.8, ipfw.4, ipchains-save.8, ipchains-restore.8
Реализация firewall в linux 2.1.102 и выше сделана с помощью ipchains. В предыдущих версиях - с помощью ipfwadm. В следующих версиях обещают полностью переделать (в 2.3 - network filter). Состоит из кода, встраиваемого в ядро (при генерации включить FIREWALL, IP_FIREWALL; появляются /proc/net/ip_fwchains и /proc/net/ip_fwnames), и внешней программы ipchains (ipchains-save, ipchains-restore). Настойчиво рекомендуется дефрагментировать все пакеты (/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



Содержание раздела