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

Информация об авторе

BIMData.io

О проекте

This role installs and configures ferm.

Установить
ansible-galaxy install bimdata/ansible_role_ferm
Лицензия
mit
Загрузки
41215
Владелец