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

216 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Роль `firewall`
Ansible-роль для управления firewalld на Linux-серверах. Основана на [linux-system-roles/firewall](https://github.com/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. Поля могут комбинироваться в одном объекте.
### Управление зонами и сервисами
```yaml
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
```
### Привязка интерфейса к зоне
```yaml
firewall:
- interface: ens192
zone: internal
state: enabled
permanent: true
```
### Смена зоны по умолчанию
```yaml
firewall:
- set_default_zone: internal
state: enabled
permanent: true
```
### Проброс портов (DNAT)
```yaml
firewall:
- zone: public
forward_port:
- port: 8080
proto: tcp
toport: 80
toaddr: 192.168.1.10
state: enabled
permanent: true
```
### Маскарадинг
```yaml
firewall:
- zone: external
masquerade: true
state: enabled
permanent: true
```
### Rich rules
```yaml
firewall:
- zone: public
rich_rule: 'rule family="ipv4" source address="1.2.3.4" drop'
state: enabled
permanent: true
```
### Управление ipset
```yaml
firewall:
- ipset: blocklist
ipset_type: hash:ip
ipset_entries:
- 1.2.3.4
- 5.6.7.8
state: enabled
permanent: true
```
### Сброс к заводским настройкам
```yaml
firewall:
- previous: replaced
```
Удаляет всю кастомную конфигурацию перед применением новых правил.
## Сбор фактов
Если переменная `firewall` не задана или пуста, роль сохраняет текущую конфигурацию firewalld в факт `firewall_config`.
Для подробного вывода:
```yaml
firewall:
- detailed: true
```
## Пример использования (из vm01-balancer.yml / vm02-balancer.yml)
```yaml
- 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`.