Etcnet Firewall: различия между версиями

Материал из ALT Linux Wiki
м Etcnet/firewall» переименована в «Etcnet Firewall»)
Строка 87: Строка 87:
** -D -- удаление правила из списка правил (соответственно, при "остановке" интерфейса правило наоборот будет добавлено); (при включеном "читабельном" синтаксисе соответствует команде "delete")  
** -D -- удаление правила из списка правил (соответственно, при "остановке" интерфейса правило наоборот будет добавлено); (при включеном "читабельном" синтаксисе соответствует команде "delete")  
* Если никакое действие не указано, то правило добавляются в цепочку в соответствии со значением переменной IPTABLES_RULE_EMBEDDING
* Если никакое действие не указано, то правило добавляются в цепочку в соответствии со значением переменной IPTABLES_RULE_EMBEDDING
* Если вы изменяете какое-то правило в конфигурационных файлах при уже загруженных правилах iptables, то для того, чтобы в памяти не остались старые правила, необходимо или выгрузить все правила для текущего интерфейса перед измененим файлов или  
* Если вы изменяете какое-то правило в конфигурационных файлах при уже загруженных правилах iptables, то для того, чтобы в памяти не остались старые правила, необходимо или выгрузить все правила для текущего интерфейса (если вы настраиваете для конкретного интерфейса, а не default) перед изменением файлов или после изменения использовать команду efw default restart (она полностью удалит все правила; однако пользовательские цепочки других интерфейсов не будут затронуты) и далее загрузить заново правила для нужного или всех интерфейсов.
 


=== Примеры ===
=== Примеры ===

Версия от 01:06, 10 августа 2008


Настройка сетевого экрана в /etc/net

Начиная с версии 0.7.9 etcnet содержит поддержку управления сетевым экраном (firewall). В данный момент поддерживается iptables и ebtables. Реализация основана на группировке таблиц и цепочек в таблицах. Таблицы могут быть только системные, цепочки же, кроме системных, могут быть заданы пользователем.

Системные таблицы и возможные системные цепочки в них

Таблица

Цепочки

filter

INPUT FORWARD OUTPUT

nat

PREROUTING OUTPUT POSTROUTING

mangle

PREROUTING INPUT FORWARD OUTPUT POSTROUTING

raw

PREROUTING OUTPUT

Схема прохождения пакетов Iptables3al7.jpg

Красивая, но неправильная: куда делся nat output ? ;)

Используемые файлы и каталоги

/etc/net/ifaces/default/fw/options -- файл с настройками сетевого экрана по-умолчанию:

  • FW_TYPE -- типа сетевого экрана. Здесь можно указать только iptables, другие типы пока не поддерживаются
  • IPTABLES_HUMAN_SYNTAX -- включает или отключает использование поддержки "читабельного" синтаксиса правил для iptables (см. ниже). Значение: yes или no
  • IPTABLES_SYSTEM_CHAINS -- список системных цепочек в таблицах. Все цепочки, не указанные здесь, будут автоматически создаваться и удаляться. Значение: названия цепочек (все названия чувствительны к регистру!), разделенные пробелом
  • IPTABLES_INPUT_POLICY -- действие по-умолчанию для пакетов, попадающих в системную цепочку INPUT таблицы filter. Значение: одно из ACCEPT, DROP, QUEUE или RETURN
  • IPTABLES_FORWARD_POLICY -- действие по-умолчанию для пакетов, попадающих в системную цепочку FORWARD таблицы filter. Значение: одно из ACCEPT, DROP, QUEUE или RETURN
  • IPTABLES_OUTPUT_POLICY -- действие по-умолчанию для пакетов, попадающих в системную цепочку OUTPUT таблицы filter. Значение: одно из ACCEPT, DROP, QUEUE или RETURN
  • IPTABLES_RULE_EMBEDDING -- способ добавления нового правила в цепочку. Значение: APPEND или INSERT, что означает добавление в конец списка правил или в начало соответственно.

/etc/net/ifaces/default/fw/iptables/filter, /etc/net/ifaces/default/fw/iptables/nat, /etc/net/ifaces/default/fw/iptables/mangle -- каталоги, соответствующие таблицам iptables. В каталогах создаются файлы, соответствующие необходимым системным или пользовательским цепочкам, в которых уже и прописываются сами правила iptables.

/etc/net/ifaces/default/fw/iptables/loadorder, /etc/net/ifaces/default/fw/tablename/loadorder -- если такой существует и он не пустой, то обработка таблиц и/или цепочек в таблице происходит в том порядке, который указан в файле (по одному значению на строку). Все таблицы и цепочки, которые не указаны, обрабатываться не будут. /etc/net/ifaces/default/fw/iptables/modules -- список модулей ядра, которые необходимо загрузить перед запуском сетевого экрана. При остановке эти модули выгружаются /etc/net/ifaces/default/fw/iptables/syntax -- описание замен при использовании "читабельного" синтаксиса правил iptables


Алгоритм работы сетевого экрана

  1. При запуске службы network, виртуальный интерфейс default:
    1. Если опция CONFIG_FW (в файле /etc/net/ifaces/default/options) не установлена в yes, то ничего не делает и происходит выход из процедуры запуска сетевого экрана; иначе переходим к следующему пункту
    2. Считывается файл настроек /etc/net/ifaces/default/fw/iptables/options
    3. До настройки любого интерфейса и обработки значений sysctl устанавливаются действия по-умолчанию (policy) для системных цепочек таблицы filter
    4. Считывается файл со списком модулей ядра /etc/net/ifaces/default/fw/iptables/modules и все указанные там модули (по одному на строку) загружаются; при отсутствии файла никакие модули не загружаются
    5. Создаются все пользовательские цепочки во всех таблицах (пользовательскими считаются все цепочки, не указанные в переменной IPTABLES_SYSTEM_CHAINS)
    6. Считывается файл /etc/net/ifaces/default/fw/iptables/loadorder и в указанном в нем порядке происходит обработка таблиц iptables; при отсутствии файла обработка происходит в соответствии с сортировкой названий таблиц по имени
    7. Считывается файл /etc/net/ifaces/default/fw/iptables/tablename/loadorder в каждой обрабатываемой таблице и происходит обработки и загрузка правил для каждой цепочки в порядке, указанном в файле; при отсутствии файла обработка опять же происходит в соответствии с сортировкой по имени
    8. Если опция IPTABLES_HUMAN_SYNTAX установлена в yes, то считывается и обрабатывается файл с "синтаксисом" /etc/net/ifaces/default/fw/iptables/syntax
    9. Файл с правилами обрабатывает построчно (одно правило на строку); если указана опция IPTABLES_HUMAN_SYNTAX, то правило обрабатывается интерпретатором в соответствии с синтаксисом и превращается в реальные опции для команды iptables, после чего запускается iptables с этими параметрами; иначе правило без обработки передается iptables
  2. При "поднятии" любого интерфейса, кроме default:
    1. Выполняются все подпункты пунка 1, только все файлы и каталоги ищутся в каталоге текущего интерфейса
  3. При "опускании" любого интерфейса, кроме default:
    1. Все подпункты пункта 1 выполняются в обратном порядке, все правила удаляются из цепочек в обратном порядке, все модули ядра выгружаются в обратном порядке; все файлы и каталоги ищутся в каталоге текущего интерфейса
  4. При остановке службы network, виртуальный интерфейс default:
    1. Все подпункты пункта 1 выполняются в обратном порядке, все правила из всех цепочек удалются командой iptables -F, все модули выгружаются в обратном порядке, все пользовательские цепочки удаляются
    2. Действия по-умолчанию (policy) для системных цепочек устанавливается в ACCEPT


Примечания

  • Правила для iptables можно писать с помощью синтаксиса, подобного синтаксису ipfw и других. Сделано это с помощью простой замены слов на опции iptables. Сами замены описаны в файле /etc/net/ifaces/default/fw/iptables/syntax (там также описано некоторое количество вспомогательных слов, так что правила можно писать практически на литературном английском :). Синтаксис правила можно совмещать (то есть использовать и заданный в etcnet синтаксис и реальные опции команды iptables)
  • Во всех правилах нельзя использовать названия цепочки и/или таблицы; они будут добавляться автоматически
  • В правилах можно использовать любые переменные окружения, выполнять любые команды shell (они должны быть указаны в одну строку). Переменная $NAME содержит имя текущего интерфейса. Переменные $IPV4ADDRESS и $IPV6ADDRESS содержат массив IPV4/IPV6 адресов текущего интерфейса (это обычные bash arrays, можно обращаться к ним по индексу: ${IPV4ADDRESS[2]} или просто $IPV4ADDRESS для первого значения). Для удобства можно использовать файлы options, в которых прописывать какие-либо переменные, к примеру, адреса gateway, ISP, сетей и т.д.
  • Во всех файлах можно использовать комментарии (строка должна начинаться с символа # )
  • Вам не нужно копировать все файлы настроек в каталог каждого интерфейса. Сначала будут считаны настройки виртуального интерфейса default, а уже потом у текущего интерфейса, соответственно, можно переопределять какие-то параметры для определенного интерфейса
  • Описания всех правил в настройках виртуального интерфейса default достаточно для поднятия простого сетевого экрана. При наличии же большого количества правил и интерфейсов есть смысл разделить логически все правила по каждому интерфейсу (опять же, не будет нагружаться процессор вхолостую, если интерфейс, к которому относится много правил, сейчас не "поднят")
  • В начале каждого правила можно указать, что с этим правилом делать. Может быть одно из трёх значений:
    • -A -- добавление в конец списка правил (при включеном "читабельном" синтаксисе соответствует команде "append")
    • -I [num] -- добавление в начало списка правил; если указан необязательный параметр num, то правило будет вставлено в строку правил с таким номером (будьте внимательны, iptables считает несуществующий номер строки ошибкой и не добавляет правило); (при включеном "читабельном" синтаксисе соответствует команде "insert [num]")
    • -D -- удаление правила из списка правил (соответственно, при "остановке" интерфейса правило наоборот будет добавлено); (при включеном "читабельном" синтаксисе соответствует команде "delete")
  • Если никакое действие не указано, то правило добавляются в цепочку в соответствии со значением переменной IPTABLES_RULE_EMBEDDING
  • Если вы изменяете какое-то правило в конфигурационных файлах при уже загруженных правилах iptables, то для того, чтобы в памяти не остались старые правила, необходимо или выгрузить все правила для текущего интерфейса (если вы настраиваете для конкретного интерфейса, а не default) перед изменением файлов или после изменения использовать команду efw default restart (она полностью удалит все правила; однако пользовательские цепочки других интерфейсов не будут затронуты) и далее загрузить заново правила для нужного или всех интерфейсов.

Примеры

/etc/net/ifaces/eth0/fw/options

# Our WAN IP address
WAN_IP=5.6.7.8/24
# First net
NET1=1.2.3.0/24
# Second net
NET2=4.3.2.0/24
# Friend net
FRIEND_NET=5.6.7.0/24

/etc/net/ifaces/eth0/fw/iptables/filter/INPUT

accept all from any to $IPV4ADDRESS
jump-to COUNT-CHAIN if marked as 0x11

/etc/net/ifaces/eth0/fw/iptables/filter/FORWARD

jump-to FRIEND-NET if from $FRIEND-NET
append drop tcp from net $NET1 to net NET2
delete drop udp from $NET1 to $NET2
insert reject udp to $WAN_IP
drop icmp to $(somescript.sh)

/etc/net/ifaces/eth0/fw/iptables/filter/FRIEND-NET

policy reject

/etc/net/ifaces/eth0/fw/iptables/mangle/PREROUTING

insert 15 mark tcp as 0x10 if from-iface $NAME and dport is 22
mark tcp as 0x11 if from net $NET1 and from-iface $NAME

/etc/net/ifaces/eth0/fw/iptables/nat/POSTROUTING

snat-to $WAN_IP if marked as 0x10

Утилиты

  • В contrib находятся следующие вспомогательные утилиты:
    • Скрипт efw, который предназначен для ручного управления сетевым экраном и умеет следующее:
Usage: ./efw [iface] [table] [chain] <action> [iptables rule or action options]
iface    - 'default' (by default), real interface name or 'all' for all interfaces
table    - 'mangle', 'filter' (by default), 'nat' or 'all' for all tables
chain    -  system or user defined chain name (case sensitive!) or 'all' for all chains
action   - 'start','stop','restart','load','unload','reload','flush','show|list','count|counters','rule','new|create','remove|delete','zero','policy','rename'
start    - process all tables and chains for given interface (even when chain or table is defined)
stop     - process all tables and chains for given interface (even when chain or table is defined)
restart  - equivalent to stop then start
load     - load rules for given interface, table and chain
unload   - unload rules for given interface, table and chain
reload   - equivalent to unload then load
flush    - flush rules for given interface, table and chain
show     - list rules for given interface, table and chain
list     - same as show
count    - show counters for given table and chains
counters - same as count
rule     - parse rule and pass it to iptables
new      - create new chain
create   - same as new
remove   - remove chain
delete   - same as remove
zero     - zero packet and byte counters in chain
policy   - set default policy for chain
rename   - rename chain

Options for action 'show' or 'list':

-n or numeric - numeric output for IP addresses, ports and services
-v or verbose - verbose output of rules
-x or exact   - expand numbers instead of rounded numbers

--line-numbers or lines - display line number for each rule

На текущий момент он умеет частично угадывать интерфейс, таблицу и цепочку (если их не передали в комстроке) и все действия, кроме counters. Так же поддерживается "маска" all для интерфейсов, таблиц и цепочек.

Примеры команд:

  • Выгрузить (путем flush) все правила из всех цепочек всех таблиц, удалить цепочки, заданные пользователем, выгрузить все загруженные модули
efw default stop
  • Выгрузить (путем удаления каждого правила в обратном порядке) все правила из цепочки FORWARD таблицы filter для интерфейса eth0
efw eth0 unload
  • Загрузить все правила для всех цепочек во всех таблицах всех интерфейсов
efw all all all load
  • Обработать правило и добавить его во все цепочки таблицы filter
efw default filter all rule accept all from any
  • Если вы изменяете какое-то правило в конфигурационных файлах при уже загруженных правилах iptables, то для того, чтобы в памяти не остались старые правила, необходимо или выгрузить все правила для текущего интерфейса (если вы настраиваете для конкретного интерфейса, а не default) перед изменением файлов или после изменения использовать команду efw default restart (она полностью удалит все правила; однако пользовательские цепочки других интерфейсов не будут затронуты) и далее загрузить заново правила для нужного или всех интерфейсов. Т.о. самой ходовой командой при изменении конфигурации файрволла является
efw default stop ; efw all start


Прочее

Конвертор правил, точнее, дампа iptables-save (альфа! и требует ruby) в соответствующее расположение правил в etcnet



Весь этот текст относится к версии etcnet >=0.8.5