Etcnet Firewall: различия между версиями
м («Etcnet/firewall» переименована в «Etcnet Firewall») |
мНет описания правки |
||
(не показаны 43 промежуточные версии 12 участников) | |||
Строка 1: | Строка 1: | ||
[[ | == Настройка сетевого экрана в [[etcnet|/etc/net]] == | ||
Начиная с версии {{pkg|0.7.9}} {{pkg|etcnet}} содержит поддержку управления сетевым экраном ({{term|firewall}}). В данный момент поддерживается {{prg|iptables}}, {{prg|ip6tables}}, {{prg|ipset}} и {{prg|ebtables}}. Реализация основана на группировке таблиц и цепочек в таблицах. Таблицы могут быть только системные, цепочки же, кроме системных, могут быть заданы пользователем. | |||
Типовую конфигурацию этого сетевого экрана можно сделать в [[alterator-net-iptables|Центре управления системой]] | |||
=== Системные таблицы и допустимые системные цепочки === | |||
В системных таблицах имеется возможность использовать следующие системные цепочки: | |||
{| | {| class="standard" | ||
|- | |- | ||
!Таблица | |||
Таблица | !Цепочки | ||
Цепочки | |||
|- | |- | ||
| | |{{term|filter}} | ||
filter | |{{term|INPUT FORWARD OUTPUT}} | ||
| | |||
INPUT FORWARD OUTPUT | |||
|- | |- | ||
| | |{{term|nat}} | ||
nat | |{{term|PREROUTING OUTPUT POSTROUTING}} | ||
| | |||
PREROUTING OUTPUT POSTROUTING | |||
|- | |- | ||
| | |{{term|mangle}} | ||
mangle | |{{term|PREROUTING INPUT FORWARD OUTPUT POSTROUTING}} | ||
| | |||
PREROUTING INPUT FORWARD OUTPUT POSTROUTING | |||
|- | |- | ||
| | |{{term|raw}} | ||
raw | |{{term|PREROUTING OUTPUT}} | ||
| | |||
PREROUTING OUTPUT | |||
|} | |} | ||
Схема прохождения пакетов | Схема прохождения пакетов | ||
[[Изображение:Tables_traverse.jpg]] | |||
=== Используемые файлы и каталоги === | === Используемые файлы и каталоги === | ||
{{path|/etc/net/ifaces/default/fw/options}} — файл с настройками сетевого экрана по умолчанию: | |||
* FW_TYPE | * {{term|FW_TYPE}} — тип сетевого экрана. | ||
* IPTABLES_HUMAN_SYNTAX | *: Здесь можно указать только {{term|iptables}}, другие типы пока не поддерживаются. Обратите внимание на этот параметр, т.к. по умолчанию он не указан в файле настроек. | ||
* IPTABLES_SYSTEM_CHAINS | * {{term|IPTABLES_HUMAN_SYNTAX}} — включает или отключает использование поддержки «читабельного» синтаксиса правил для iptables (см. ниже). | ||
* IPTABLES_INPUT_POLICY | *: Значение: {{term|yes}} или {{term|no}} | ||
* IPTABLES_FORWARD_POLICY | * {{term|IPTABLES_SYSTEM_CHAINS}} — список системных цепочек в таблицах. Все цепочки, не указанные здесь, будут автоматически создаваться и удаляться. | ||
* IPTABLES_OUTPUT_POLICY | *: Значение: названия цепочек (все названия чувствительны к регистру!), разделенные пробелом. | ||
* IPTABLES_RULE_EMBEDDING | * {{term|IPTABLES_INPUT_POLICY}} — действие по умолчанию для пакетов, попадающих в системную цепочку INPUT таблицы filter. | ||
*: Значение: одно из {{term|ACCEPT}}, {{term|DROP}}, {{term|QUEUE}} или {{term|RETURN}} | |||
* {{term|IPTABLES_FORWARD_POLICY}} — действие по умолчанию для пакетов, попадающих в системную цепочку FORWARD таблицы filter. | |||
*: Значение: одно из {{term|ACCEPT}}, {{term|DROP}}, {{term|QUEUE}} или {{term|RETURN}} | |||
* {{term|IPTABLES_OUTPUT_POLICY}} — действие по умолчанию для пакетов, попадающих в системную цепочку OUTPUT таблицы filter. | |||
*: Значение: одно из {{term|ACCEPT}}, {{term|DROP}}, {{term|QUEUE}} или {{term|RETURN}} | |||
* {{term|IPTABLES_RULE_EMBEDDING}} — способ добавления нового правила в цепочку. | |||
*: Значение: {{term|APPEND}} или {{term|INSERT}}, что означает добавление в конец списка правил или, соответственно, в начало. | |||
{{path|/etc/net/ifaces/default/fw/iptables/filter}}, {{path|/etc/net/ifaces/default/fw/iptables/nat}}, {{path|/etc/net/ifaces/default/fw/iptables/mangle}} — каталоги, соответствующие таблицам iptables. В каталогах создаются файлы, соответствующие необходимым системным или пользовательским цепочкам, в которых уже и прописываются сами правила iptables. | |||
{{path|/etc/net/ifaces/default/fw/iptables/loadorder}}, {{path|/etc/net/ifaces/default/fw/tablename/loadorder}} — если такой файл существует и не пуст, то обработка таблиц и/или цепочек в таблице происходит в том порядке, который указан в файле (по одному значению на строку). Все таблицы и цепочки, которые не указаны, обрабатываться не будут. | |||
{{path|/etc/net/ifaces/default/fw/iptables/modules}} — список модулей ядра, которые необходимо загрузить перед запуском сетевого экрана. При остановке эти модули выгружаются. | |||
{{path|/etc/net/ifaces/default/fw/iptables/syntax}} — описание замен при использовании «читабельного» синтаксиса правил iptables | |||
=== Алгоритм работы сетевого экрана === | === Алгоритм работы сетевого экрана === | ||
# При запуске службы network, виртуальный интерфейс default: | # При запуске службы {{prg|network}}, виртуальный интерфейс {{term|default}}: | ||
## Если опция CONFIG_FW (в файле | ## Если опция {{term|CONFIG_FW}} (в файле {{path|/etc/net/ifaces/default/options}}) не установлена в {{term|yes}}, то ничего не делает и происходит выход из процедуры запуска сетевого экрана, иначе переходим к следующему пункту. | ||
## Считывается файл настроек | ## Считывается файл настроек {{path|/etc/net/ifaces/default/fw/iptables/options}}. | ||
## До настройки любого интерфейса и обработки значений sysctl устанавливаются действия по | ## До настройки любого интерфейса и обработки значений {{term|sysctl}} устанавливаются действия по умолчанию ({{term|policy}}) для системных цепочек таблицы {{term|filter}}. | ||
## Считывается файл со списком модулей ядра | ## Считывается файл со списком модулей ядра {{path|/etc/net/ifaces/default/fw/iptables/modules}}, и все указанные в нем модули (по одному на строку) загружаются. При отсутствии файла никакие модули не загружаются. | ||
## Создаются все пользовательские цепочки во всех таблицах (пользовательскими считаются все цепочки, не указанные в переменной IPTABLES_SYSTEM_CHAINS) | ## Создаются все пользовательские цепочки во всех таблицах (пользовательскими считаются все цепочки, не указанные в переменной {{term|IPTABLES_SYSTEM_CHAINS}}). | ||
## Считывается файл | ## Считывается файл {{path|/etc/net/ifaces/default/fw/iptables/loadorder}}, и в указанном в нем порядке происходит обработка таблиц {{term|iptables}}. При отсутствии файла обработка происходит в соответствии с сортировкой названий таблиц по имени. | ||
## Считывается файл | ## Считывается файл {{path|/etc/net/ifaces/default/fw/iptables/tablename/loadorder}} в каждой обрабатываемой таблице, и происходит обработка и загрузка правил для каждой цепочки в порядке, указанном в файле. При отсутствии файла обработка опять же происходит в соответствии с сортировкой по имени. | ||
## Если опция IPTABLES_HUMAN_SYNTAX установлена в yes, то считывается и обрабатывается файл с | ## Если опция {{term|IPTABLES_HUMAN_SYNTAX}} установлена в {{term|yes}}, то считывается и обрабатывается файл с «синтаксисом» {{path|/etc/net/ifaces/default/fw/iptables/syntax}}. | ||
## Файл с правилами обрабатывает построчно (одно правило на строку); если указана опция IPTABLES_HUMAN_SYNTAX, то правило обрабатывается интерпретатором в соответствии с синтаксисом и превращается в реальные опции для команды iptables, после чего запускается iptables с этими параметрами; иначе правило без обработки передается iptables | ## Файл с правилами обрабатывает построчно (одно правило на строку); если указана опция {{term|IPTABLES_HUMAN_SYNTAX}}, то правило обрабатывается интерпретатором в соответствии с синтаксисом и превращается в реальные опции для команды {{prg|iptables}}, после чего запускается {{prg|iptables}} с этими параметрами; иначе правило без обработки передается {{prg|iptables}}. | ||
# При | # При «поднятии» любого интерфейса, кроме {{term|default}}: | ||
## Выполняются все подпункты | ## Выполняются все подпункты пункта 1, только все файлы и каталоги ищутся в каталоге текущего интерфейса. | ||
# При | # При «опускании» любого интерфейса, кроме {{term|default}}: | ||
## Все подпункты пункта 1 выполняются в обратном порядке, все правила удаляются из цепочек в обратном порядке, все модули ядра выгружаются в обратном порядке | ## Все подпункты пункта 1 выполняются в обратном порядке, все правила удаляются из цепочек в обратном порядке, все модули ядра выгружаются в обратном порядке. Все файлы и каталоги ищутся в каталоге текущего интерфейса. | ||
# При остановке службы network | # При остановке службы {{prg|network}} виртуальный интерфейс {{term|default}}: | ||
## Все подпункты пункта 1 выполняются в обратном порядке, все правила из всех цепочек | ## Все подпункты пункта 1 выполняются в обратном порядке, все правила из всех цепочек удаляются командой {{cmd|iptables -F}}, все модули выгружаются в обратном порядке, все пользовательские цепочки удаляются. | ||
## Действия по | ## Действия по умолчанию ({{term|policy}}) для системных цепочек устанавливается в {{term|ACCEPT}}. | ||
=== Примечания === | === Примечания === | ||
* Правила для iptables можно писать с помощью синтаксиса, подобного синтаксису ipfw и других. Сделано это с помощью простой замены слов на опции iptables. Сами замены описаны в файле | * Правила для {{prg|iptables}} можно писать с помощью синтаксиса, подобного синтаксису {{prg|ipfw}} и других. Сделано это с помощью простой замены слов на опции {{prg|iptables}}. Сами замены описаны в файле {{path|/etc/net/ifaces/default/fw/iptables/syntax}} (там также описано некоторое количество вспомогательных слов, так что правила можно писать практически на английском литературном). Синтаксис правила можно совмещать (то есть использовать и заданный в {{pkg|etcnet}} синтаксис, и реальные опции команды {{prg|iptables}}). | ||
* Во всех правилах ''нельзя'' использовать названия цепочки и/или таблицы | * Во всех правилах ''нельзя'' использовать названия цепочки и/или таблицы. Они будут добавляться автоматически. | ||
* В правилах можно использовать любые переменные окружения, выполнять любые команды shell (они должны быть указаны в одну строку). Переменная $NAME содержит имя текущего интерфейса. Переменные $IPV4ADDRESS и $IPV6ADDRESS содержат массив IPV4/IPV6 адресов текущего интерфейса (это обычные bash arrays, можно обращаться к ним по индексу: ${IPV4ADDRESS[2]} или просто $IPV4ADDRESS для первого значения). Для удобства можно использовать файлы options, в которых прописывать какие-либо переменные, к примеру, адреса gateway, ISP, сетей | * В правилах можно использовать любые переменные окружения, выполнять любые команды {{prg|shell}} (они должны быть указаны в одну строку). Переменная {{term|$NAME}} содержит имя текущего интерфейса. Переменные {{term|$IPV4ADDRESS}} и {{term|$IPV6ADDRESS}} содержат массив {{term|IPV4/IPV6}} адресов текущего интерфейса (это обычные bash arrays, можно обращаться к ним по индексу: {{term|${IPV4ADDRESS[2]} }}или просто {{term|$IPV4ADDRESS}} для первого значения). Для удобства можно использовать файлы {{path|options}}, в которых прописывать какие-либо переменные, к примеру, адреса gateway, ISP, сетей и т. д. | ||
* Во всех файлах можно использовать комментарии (строка должна начинаться с символа # ) | * Во всех файлах можно использовать комментарии (строка должна начинаться с символа {{term|#}}). | ||
* | * Нет необходимости копировать все файлы настроек в каталог каждого интерфейса. Сначала будут считаны настройки виртуального интерфейса {{term|default}}, а уже потом у текущего интерфейса, соответственно, можно переопределять только требуемые для настройки параметры. | ||
* Описания всех правил в настройках виртуального интерфейса default достаточно для поднятия простого сетевого экрана. При наличии же большого количества правил и интерфейсов есть смысл разделить логически все правила по каждому интерфейсу (опять же, не будет нагружаться процессор | * Описания всех правил в настройках виртуального интерфейса {{term|default}} достаточно для поднятия простого сетевого экрана. При наличии же большого количества правил и интерфейсов есть смысл разделить логически все правила по каждому интерфейсу (опять же, не будет нагружаться процессор без необходимости, если интерфейс, к которому относится много правил, сейчас не «поднят»). | ||
* В начале каждого правила можно указать, что с этим правилом делать. Может быть одно из трёх значений: | * В начале каждого правила можно указать, что с этим правилом делать. Может быть одно из трёх значений: | ||
** -A | ** {{term|-A}} — добавление в конец списка правил (при включенном «читабельном» синтаксисе соответствует команде {{term|append}}). | ||
** -I [num] | ** {{term|-I [num]}} — добавление в начало списка правил; если указан необязательный параметр {{term|num}}, то правило будет вставлено в строку правил с таким номером (будьте внимательны, {{prg|iptables}} считает несуществующий номер строки ошибкой и не добавляет правило); (при включенном «читабельном» синтаксисе соответствует команде {{term|insert [num]}}). | ||
** -D | ** {{term|-D}} — удаление правила из списка правил (соответственно, при «остановке» интерфейса правило наоборот будет добавлено); (при включенном «читабельном» синтаксисе соответствует команде {{term|delete}}). | ||
* Если никакое действие не указано, то правило добавляются в цепочку в соответствии со значением переменной IPTABLES_RULE_EMBEDDING | * Если никакое действие не указано, то правило добавляются в цепочку в соответствии со значением переменной {{term|IPTABLES_RULE_EMBEDDING}}. | ||
* Если вы изменяете какое-то правило в конфигурационных файлах при уже загруженных правилах iptables, то для того, чтобы в памяти не остались старые правила, необходимо или выгрузить все правила для текущего интерфейса перед | * Если вы изменяете какое-то правило в конфигурационных файлах при уже загруженных правилах {{prg|iptables}}, то для того, чтобы в памяти не остались старые правила, необходимо или выгрузить все правила для текущего интерфейса (если вы настраиваете для конкретного интерфейса, а не для {{term|default}}) перед изменением файлов или после изменения использовать команду {{cmd|efw default restart}} (она полностью удалит все правила, однако, пользовательские цепочки других интерфейсов не будут затронуты, и далее загрузить заново правила для нужного или всех интерфейсов. | ||
=== Примеры === | |||
Пример настройки сетевого экрана в <tt>etcnet</tt> (файл — содержание): | |||
{{path|/etc/net/ifaces/eth0/fw/options}} | |||
<pre># Our WAN IP address | <pre># Our WAN IP address | ||
WAN_IP=5.6.7.8/24 | WAN_IP=5.6.7.8/24 | ||
Строка 100: | Строка 97: | ||
# Friend net | # Friend net | ||
FRIEND_NET=5.6.7.0/24</pre> | FRIEND_NET=5.6.7.0/24</pre> | ||
{{path|/etc/net/ifaces/eth0/fw/iptables/filter/INPUT}} | |||
<pre>accept all from any to $IPV4ADDRESS | <pre>accept all from any to $IPV4ADDRESS | ||
jump-to COUNT-CHAIN if marked as 0x11</pre> | jump-to COUNT-CHAIN if marked as 0x11</pre> | ||
{{path|/etc/net/ifaces/eth0/fw/iptables/filter/FORWARD}} | |||
<pre>jump-to FRIEND-NET if from $FRIEND-NET | <pre>jump-to FRIEND-NET if from $FRIEND-NET | ||
append drop tcp from net $NET1 to net NET2 | append drop tcp from net $NET1 to net NET2 | ||
Строка 109: | Строка 106: | ||
insert reject udp to $WAN_IP | insert reject udp to $WAN_IP | ||
drop icmp to $(somescript.sh)</pre> | drop icmp to $(somescript.sh)</pre> | ||
{{path|/etc/net/ifaces/eth0/fw/iptables/filter/FRIEND-NET}} | |||
<pre>policy reject</pre> | <pre>policy reject</pre> | ||
{{path|/etc/net/ifaces/eth0/fw/iptables/mangle/PREROUTING}} | |||
<pre>insert 15 mark tcp as 0x10 if from-iface $NAME and dport is 22 | <pre>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</pre> | mark tcp as 0x11 if from net $NET1 and from-iface $NAME</pre> | ||
{{path|/etc/net/ifaces/eth0/fw/iptables/nat/POSTROUTING}} | |||
<pre>snat-to $WAN_IP if marked as 0x10</pre> | <pre>snat-to $WAN_IP if marked as 0x10</pre> | ||
=== Утилиты === | === Утилиты === | ||
* В contrib находятся следующие вспомогательные утилиты: | * В {{pkg|contrib}} находятся следующие вспомогательные утилиты: | ||
** Скрипт | ** Скрипт {{prg|efw}}, который предназначен для ручного управления сетевым экраном и "умеет" следующее: | ||
<pre>Usage: ./efw [iface] [table] [chain] <action> [iptables rule or action options] | |||
iface - 'default' (by default), real interface name or 'all' for all interfaces | iface - 'default' (by default), real interface name or 'all' for all interfaces | ||
table - 'mangle', 'filter' (by default), 'nat' or 'all' for all tables | 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 | 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' | 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) | 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) | stop - process all tables and chains for given interface (even when chain or table is defined) | ||
Строка 152: | Строка 149: | ||
-x or exact - expand numbers instead of rounded numbers | -x or exact - expand numbers instead of rounded numbers | ||
--line-numbers or lines - display line number for each rule</pre> | --line-numbers or lines - display line number for each rule</pre> | ||
:: На данный момент он "умеет" частично "угадывать" интерфейс, таблицу и цепочку (если их не передали в командной строке) и все действия, кроме {{term|counters}}. Так же поддерживается маска {{term|all}} для интерфейсов, таблиц и цепочек. | |||
=== Примеры команд === | |||
* Выгрузить (''flush'') все правила из всех цепочек всех таблиц, удалить цепочки, заданные пользователем, выгрузить все загруженные модули: | |||
*: {{cmd|efw default stop}} | |||
* Выгрузить (путем удаления каждого правила в обратном порядке) все правила из цепочки {{term|FORWARD}} таблицы {{term|filter}} для интерфейса {{term|eth0}}: | |||
*: {{cmd|efw eth0 unload}} | |||
* Загрузить все правила для всех цепочек во всех таблицах всех интерфейсов: | |||
*: {{cmd|efw all all all load}} | |||
* Обработать правило и добавить его во все цепочки таблицы {{term|filter}}: | |||
*: {{cmd|efw default filter all rule accept all from any}} | |||
* Если вы изменяете какое-либо правило в конфигурационных файлах при уже загруженных правилах {{term|iptables}}, то для того, чтобы в памяти не остались старые правила, необходимо: | |||
** Вариант 1: Выгрузить все правила для текущего интерфейса (если вы настраиваете для конкретного интерфейса, а не {{term|default}}) перед изменением файлов; | |||
** Вариант 2: После изменения использовать команду {{cmd|efw default restart}} (она полностью удалит ''все'' правила, однако, пользовательские цепочки других интерфейсов не будут затронуты), и далее загрузить заново правила для требуемого или всех интерфейсов; | |||
Таким образом, наиболее используемой командой при изменении конфигурации сетевого экрана является: | |||
{{cmd|efw default stop ; efw all start}} | |||
=== Прочее === | === Прочее === | ||
[http:// | [http://ftp.altlinux.org/pub/people/mike/misc/iptables2etcnet/ Конвертор правил], а точнее, дампа {{prg|iptables-save}} (альфа версия и требует пакет? {{pkg|ruby}}) в соответствующее расположение правил в {{pkg|etcnet}} | ||
---- | ---- | ||
Данное руководство относится к версии {{pkg|etcnet 0.8.5}} и выше. | |||
{{Category navigation|title=etcnet|category=etcnet}} |
Текущая версия от 21:15, 12 января 2023
Настройка сетевого экрана в /etc/net
Начиная с версии 0.7.9 etcnet содержит поддержку управления сетевым экраном (firewall). В данный момент поддерживается iptables, ip6tables, ipset и ebtables. Реализация основана на группировке таблиц и цепочек в таблицах. Таблицы могут быть только системные, цепочки же, кроме системных, могут быть заданы пользователем.
Типовую конфигурацию этого сетевого экрана можно сделать в Центре управления системой
Системные таблицы и допустимые системные цепочки
В системных таблицах имеется возможность использовать следующие системные цепочки:
Таблица | Цепочки |
---|---|
filter | INPUT FORWARD OUTPUT |
nat | PREROUTING OUTPUT POSTROUTING |
mangle | PREROUTING INPUT FORWARD OUTPUT POSTROUTING |
raw | PREROUTING 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
Алгоритм работы сетевого экрана
- При запуске службы network, виртуальный интерфейс default:
- Если опция CONFIG_FW (в файле /etc/net/ifaces/default/options) не установлена в yes, то ничего не делает и происходит выход из процедуры запуска сетевого экрана, иначе переходим к следующему пункту.
- Считывается файл настроек /etc/net/ifaces/default/fw/iptables/options.
- До настройки любого интерфейса и обработки значений sysctl устанавливаются действия по умолчанию (policy) для системных цепочек таблицы filter.
- Считывается файл со списком модулей ядра /etc/net/ifaces/default/fw/iptables/modules, и все указанные в нем модули (по одному на строку) загружаются. При отсутствии файла никакие модули не загружаются.
- Создаются все пользовательские цепочки во всех таблицах (пользовательскими считаются все цепочки, не указанные в переменной IPTABLES_SYSTEM_CHAINS).
- Считывается файл /etc/net/ifaces/default/fw/iptables/loadorder, и в указанном в нем порядке происходит обработка таблиц iptables. При отсутствии файла обработка происходит в соответствии с сортировкой названий таблиц по имени.
- Считывается файл /etc/net/ifaces/default/fw/iptables/tablename/loadorder в каждой обрабатываемой таблице, и происходит обработка и загрузка правил для каждой цепочки в порядке, указанном в файле. При отсутствии файла обработка опять же происходит в соответствии с сортировкой по имени.
- Если опция IPTABLES_HUMAN_SYNTAX установлена в yes, то считывается и обрабатывается файл с «синтаксисом» /etc/net/ifaces/default/fw/iptables/syntax.
- Файл с правилами обрабатывает построчно (одно правило на строку); если указана опция IPTABLES_HUMAN_SYNTAX, то правило обрабатывается интерпретатором в соответствии с синтаксисом и превращается в реальные опции для команды iptables, после чего запускается iptables с этими параметрами; иначе правило без обработки передается iptables.
- При «поднятии» любого интерфейса, кроме default:
- Выполняются все подпункты пункта 1, только все файлы и каталоги ищутся в каталоге текущего интерфейса.
- При «опускании» любого интерфейса, кроме default:
- Все подпункты пункта 1 выполняются в обратном порядке, все правила удаляются из цепочек в обратном порядке, все модули ядра выгружаются в обратном порядке. Все файлы и каталоги ищутся в каталоге текущего интерфейса.
- При остановке службы network виртуальный интерфейс default:
- Все подпункты пункта 1 выполняются в обратном порядке, все правила из всех цепочек удаляются командой iptables -F, все модули выгружаются в обратном порядке, все пользовательские цепочки удаляются.
- Действия по умолчанию (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 (она полностью удалит все правила, однако, пользовательские цепочки других интерфейсов не будут затронуты, и далее загрузить заново правила для нужного или всех интерфейсов.
Примеры
Пример настройки сетевого экрана в etcnet (файл — содержание):
/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, то для того, чтобы в памяти не остались старые правила, необходимо:
- Вариант 1: Выгрузить все правила для текущего интерфейса (если вы настраиваете для конкретного интерфейса, а не default) перед изменением файлов;
- Вариант 2: После изменения использовать команду efw default restart (она полностью удалит все правила, однако, пользовательские цепочки других интерфейсов не будут затронуты), и далее загрузить заново правила для требуемого или всех интерфейсов;
Таким образом, наиболее используемой командой при изменении конфигурации сетевого экрана является:
efw default stop ; efw all start
Прочее
Конвертор правил, а точнее, дампа iptables-save (альфа версия и требует пакет? ruby) в соответствующее расположение правил в etcnet
Данное руководство относится к версии etcnet 0.8.5 и выше.