Ansible-Roles/roles/firewall/README.md
2026-05-08 22:25:29 +03:00

5.6 KiB
Raw Blame History

Роль firewall

Ansible-роль для управления firewalld на Linux-серверах. Основана на linux-system-roles/firewall. Устанавливает firewalld, отключает конкурирующие сервисы и применяет конфигурацию зон, сервисов, портов, правил и интерфейсов через встроенный модуль firewall_lib.

Поддерживаемые платформы

  • RHEL / CentOS / AlmaLinux / Rocky Linux 7, 8, 9
  • Fedora
  • SLES 15

Требования

  • systemd
  • Python 3 на управляемом узле
  • Для EL7: пакеты NetworkManager и python-ipaddress (устанавливаются ролью автоматически)

Переменные роли

Переменная Тип Умолчание Описание
firewall list / map [] Список объектов конфигурации firewalld (см. ниже)
firewall_disable_conflicting_services bool false Остановить и отключить nftables, iptables, ufw при наличии
firewall_transactional_update_reboot_ok bool / null null Разрешить автоматическую перезагрузку на transactional-update системах (SLES)

Структура переменной firewall

Переменная firewall — список объектов. Каждый объект описывает одно или несколько действий с firewalld. Поля могут комбинироваться в одном объекте.

Управление зонами и сервисами

firewall:
  - zone: internal
    state: enabled          # enabled / disabled / present / absent
    permanent: true
    service:
      - ssh
      - http
      - https
    port:
      - '8080/tcp'
      - '9090/tcp'
    source:
      - 10.0.0.0/8
      - 192.168.0.0/16

Привязка интерфейса к зоне

firewall:
  - interface: ens192
    zone: internal
    state: enabled
    permanent: true

Смена зоны по умолчанию

firewall:
  - set_default_zone: internal
    state: enabled
    permanent: true

Проброс портов (DNAT)

firewall:
  - zone: public
    forward_port:
      - port: 8080
        proto: tcp
        toport: 80
        toaddr: 192.168.1.10
    state: enabled
    permanent: true

Маскарадинг

firewall:
  - zone: external
    masquerade: true
    state: enabled
    permanent: true

Rich rules

firewall:
  - zone: public
    rich_rule: 'rule family="ipv4" source address="1.2.3.4" drop'
    state: enabled
    permanent: true

Управление ipset

firewall:
  - ipset: blocklist
    ipset_type: hash:ip
    ipset_entries:
      - 1.2.3.4
      - 5.6.7.8
    state: enabled
    permanent: true

Сброс к заводским настройкам

firewall:
  - previous: replaced

Удаляет всю кастомную конфигурацию перед применением новых правил.

Сбор фактов

Если переменная firewall не задана или пуста, роль сохраняет текущую конфигурацию firewalld в факт firewall_config.

Для подробного вывода:

firewall:
  - detailed: true

Пример использования (из vm01-balancer.yml / vm02-balancer.yml)

- name: Настройка балансировщика
  hosts: vm01-balancer
  roles:
    - firewall

  vars:
    firewall_disable_conflicting_services: true
    firewall_transactional_update_reboot_ok: true

    firewall:
      - zone: internal
        state: enabled
        permanent: true
        service:
          - ssh
          - zabbix-agent
          - ntp
          - dns
          - http
          - https
        port:
          - '10050/tcp'
        source:
          - 10.0.0.0/8
          - 172.16.0.0/12
          - 192.168.0.0/16

      - zone: internal
        state: disabled
        permanent: true
        service:
          - cockpit
          - dhcpv6-client
          - mdns
          - samba-client

      - zone: public
        state: enabled
        permanent: true
        service:
          - ntp
          - dns
          - http
          - https

      - zone: public
        state: disabled
        permanent: true
        service:
          - ssh
          - cockpit
          - dhcpv6-client
          - mdns
          - samba-client

      - set_default_zone: internal
        state: enabled
        permanent: true

      - interface: ens192
        zone: internal
        state: enabled
        permanent: true

      - interface: ens224
        zone: public
        state: enabled
        permanent: true

Внутреннее устройство

Основная логика реализована в library/firewall_lib.py — кастомном Ansible-модуле с тремя бэкендами:

  • OnlineAPIBackend — взаимодействие с работающим firewalld через D-Bus
  • InMemoryBackend — генерация diff без изменений (для --check/--diff режимов)
  • OfflineCLIBackend — использует firewall-offline-cmd (для сборки контейнеров)

Факты собираются через отдельный модуль library/firewall_lib_facts.py.