ferm
Ansible роль Ferm
Эта роль устанавливает и настраивает Ferm.
Требования
- Эта роль протестирована только с Ansible >= 2.9.
Переменные роли
Вы можете найти больше информации о каждой опции в документации Ferm.
Переменные, используемые для установки:
Переменные | Значение по умолчанию | Описание |
---|---|---|
ferm_pkg_name | ferm | Имя пакета APT для ferm. |
ferm_svc_name | ferm | Имя службы ferm для запуска/остановки демона. |
Переменные, используемые для общей конфигурации:
Переменные | Значение по умолчанию | Описание |
---|---|---|
ferm_main_conf_file | /etc/ferm/ferm.conf | Путь к основному конфигурационному файлу Ferm. |
ferm_rules_path | /etc/ferm/ferm.d | Путь к директории правил Ferm. |
Правила по умолчанию будут храниться в основном конфигурационном файле, который затем загрузит все правила, определенные в конфигурационной директории. Это позволяет вам определять другие правила, которые не управляются этой ролью (если ferm_delete_unknown_rules
установлено в false
).
Переменные, используемые для конфигурации правил:
Переменные | Значение по умолчанию | Описание |
---|---|---|
ferm_delete_unknown_rulefiles | true | Удаляет правила в ferm_rules_path, которые не управляются этой ролью. |
ferm_default_domains | ['ip', 'ip6'] | Когда правило не указывает домен, используется это значение. |
ferm_default_table | filter | Когда правило не указывает таблицу, используется это значение. |
Переменные, используемые для определения правил:
Переменные | Значение по умолчанию | Описание |
---|---|---|
ferm_input_policy | DROP | Политика ввода по умолчанию для Ferm. |
ferm_output_policy | ACCEPT | Политика вывода по умолчанию для Ferm. |
ferm_forward_policy | DROP | Политика пересылки по умолчанию для Ferm. |
_ferm_rules | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='rule')) }}" | Список словарей, определяющих все правила Ferm. |
_ferm_vars | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='var')) }}" | Список словарей, определяющих все переменные Ferm. |
_ferm_functions | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='function')) }}" | Список словарей, определяющих все функции Ferm. |
_ferm_hooks | "{{ lookup('template', 'get_vars.j2', template_vars=dict(vartype='hook')) }}" | Список словарей, определяющих все хуки Ferm. |
В большинстве случаев вам не следует изменять переменные, начинающиеся с '_'. Шаблон используется для создания этих списков с помощью других переменных.
_ferm_rules
будет агрегировать все переменные, чье имя соответствует следующему регулярному выражению:^ferm_.+_rule(s)?$
_ferm_vars
будет агрегировать все переменные, чье имя соответствует следующему регулярному выражению:^ferm_.+_var(s)?$
_ferm_functions
будет агрегировать все переменные, чье имя соответствует следующему регулярному выражению:^ferm_.+_function(s)?$
_ferm_hooks
будет агрегировать все переменные, чье имя соответствует следующему регулярному выражению:^ferm_.+_hook(s)?$
Каждая переменная, соответствующая этим регулярным выражениям, должна быть:
- словарем, определяющим одно правило/переменную/функцию/хук или
- списком словарей, определяющим одно или несколько правил/переменных/функций/хуков.
Это позволяет вам определять переменные в нескольких group_vars и суммировать их для хостов в нескольких группах без необходимости переписывать полный список.
Переменные, используемые для определения набора правил по умолчанию:
- эта переменная настраивает набор правил по умолчанию для таблицы INPUT:
ferm_default_inputs: - "policy {{ ferm_input_policy }};" - interface lo ACCEPT; - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
- эта переменная настраивает набор правил по умолчанию для таблицы OUTPUT:
ferm_default_outputs: - "policy {{ ferm_output_policy }};" - outerface lo ACCEPT; - "mod conntrack ctstate (RELATED ESTABLISHED) ACCEPT;"
- эта переменная настраивает набор правил по умолчанию для таблицы FORWARD:
ferm_default_forwards: []
Debian 11 по умолчанию использует iptables-nft
, и это не поддерживается ferm.
С начала Debian 11, ferm игнорирует альтернативные настройки и принудительно использует iptables-legacy (https://github.com/MaxKellermann/ferm/issues/47)
Переменные | Значение по умолчанию | Описание |
---|---|---|
ferm_iptables_path | /usr/sbin/iptables-legacy | Путь к iptables-legacy. |
ferm_ip6tables_path | /usr/sbin/ip6tables-legacy | Путь к ip6tables-legacy. |
ferm_arptables_path | /usr/sbin/arptables-legacy | Путь к arptables-legacy. |
ferm_ebtables_path | /usr/sbin/ebtables-legacy | Путь к ebtables-legacy. |
Эти переменные используются только на хостах Debian версии > 10.
Они настроят ОС с системой alternative
, чтобы установить значения для ferm_iptables_path
, ferm_ip6tables_path
, ferm_arptables_path
и ferm_ebtables_path
как командами по умолчанию для iptables.
Определения переменных
Переменная ferm может быть определена следующим образом:
ferm_webports_var:
name: web_ports
content:
- 80
- 443
ferm_hosts_vars:
- name: web_front_addr
content:
- 172.29.10.100
- 2a01:baaf::100
Определения хуков
Хук ferm может быть определен следующим образом:
ferm_fail2ban_hooks:
- comment: Fail2ban hooks
content: post "type fail2ban-server > /dev/null && (fail2ban-client ping > /dev/null && fail2ban-client reload > /dev/null || true) || true";
- content: flush "type fail2ban-server > /dev/null && (fail2ban-client ping > /dev/null && fail2ban-client reload > /dev/null || true) || true";
Определения правил
Правило может быть определено двумя способами:
ferm_web_rules:
- name: "web_server"
content:
- domains: ['ip'] # Можно опустить, будет использоваться ferm_default_domains
chains: ['INPUT'] # Можно опустить, будет использоваться ferm_default_table
rules:
- proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT
или можно определить сырые правила:
ferm_web_rules:
- name: "web_server"
raw_content: |
domain (ip) table filter {
chain (INPUT) {
proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT;
}
}
Определения функций
Функцию ferm можно определить следующим образом:
ferm_dnat_function:
comment: "Easy DNAT (DNAT+filter rules)"
content: |
@def &EASY_DNAT($wan_ip, $proto, $port, $dest) = {
domain ip table nat chain PREROUTING daddr $wan_ip proto $proto dport $port DNAT to @ipfilter($dest);
domain (ip ip6) table filter chain FORWARD outerface $dmz_iface daddr $dest proto $proto dport $port ACCEPT;
}
Затем вам нужно использовать сырое правило, чтобы использовать его, что-то вроде:
ferm_dnat_rules:
- name: "80-dnat-rules"
raw_content: |
# HTTP(S) web_front
&EASY_DNAT($main_public_ip, tcp, (80 443), $web_front_addr);
Пример Docker
Docker и другое программное обеспечение могут захотеть управлять своими собственными правилами iptables. Это возможно, с некоторыми ограничениями. Вот пример для Docker:
# Никакие правила не могут быть определены в FORWARD прежде, чем правило будет использоваться для сохранения всех
# правил, настроенных docker
ferm_default_forwards: []
# Сохранение правил docker
ferm_docker_preserve_rules:
- name: 99-docker-users.ferm
content:
- domains: ['ip']
chains: ['DOCKER-USER']
rules:
- "RETURN;"
- name: 00-docker-preserve.ferm
content:
- domains: ['ip']
chains:
- DOCKER
- DOCKER-INGRESS
- DOCKER-ISOLATION-STAGE-1
- DOCKER-ISOLATION-STAGE-2
- FORWARD
rules:
- "@preserve;"
- domains: ['ip']
table: nat
chains:
- DOCKER
- DOCKER-INGRESS
- PREROUTING
- OUTPUT
- POSTROUTING
rules:
- "@preserve;"
@preserve
— это специальное слово, используемое ferm
. Оно сохранит предыдущие правила с помощью iptables-save
,
а затем извлечет все правила для сохраненных цепочек и вставит их в новые правила.
Зависимости
Нет
Пример Playbook
в group_vars/all.yml
:
ferm_webports_var:
name: web_ports
content:
- 80
- 443
в group_vars/web.yml
:
ferm_web_rules:
- name: "web_server"
content:
- chains: ['INPUT']
rules:
- proto tcp dport ($web_ports) mod comment comment "web server" ACCEPT
в group_vars/router.yml
:
ferm_interface_vars:
- name: wan_iface
content: ['eth0']
- name: dmz_iface
content: ['eth1']
- name: lan_iface
content:
- eth2
- eth3
ferm_ips_vars:
- name: main_public_ip
content: ['1.2.3.4']
- name: web_front_addr
content:
- 10.0.0.100
- 2a01:baaf::100
ferm_dnat_function:
comment: "Easy DNAT (DNAT+filter rules)"
content: |
@def &EASY_DNAT($wan_ip, $proto, $port, $dest) = {
domain ip table nat chain PREROUTING daddr $wan_ip proto $proto dport $port DNAT to @ipfilter($dest);
domain (ip ip6) table filter chain FORWARD outerface $dmz_iface daddr $dest proto $proto dport $port ACCEPT;
}
ferm_dnat_rules:
- name: "80-dnat-rules"
raw_content: |
# HTTP(S) web_front
&EASY_DNAT($main_public_ip, tcp, $web_ports, $web_front_addr);
в playbook.yml
:
- hosts: all
gather_facts: True
become: yes
roles:
- bimdata.ferm
Лицензия
BSD
Информация об авторе
ansible-galaxy install bimdata/ansible_role_ferm