Общая информация#

Создание новых файлов зон#

Делаем по аналогии с существующими в каталоге роли (roles/setup_firewalld).

“Зоны” firewalld в нашем случае соответствуют источникам трафика, сами источники — IP адреса хостов и сети — задаём с помощью ipsets (тоже в файлах настроек firewalld в каталоге роли).

ВАЖНО: каждый IP адрес должен попадать только в одну зону. Если составить правила (зоны) так, чтобы один адрес попадал сразу под два правила (две зоны / два источника) — срабатывать будет только одно из двух правил.

Разрешение на выполнение / killswitch#

Роль / плейбуки проверяют, разрешено ли им выполнение на данном хосте.

Переменная inv_firewalld_allow_role установлена в значение no по умолчанию для всех хостов. Соответственно, плейбуки будут выполняться только на хостах, для которых значение данной переменной специально установлено в yes.

Недоработки / особенности, обратить внимание#

Attention

  • Если добавить новую зону в настройки, но не добавить соответствующий файл в files/zones или templates/zones, плейбук не выдаст ошибку, будет успешно выполнен. Разумеется, новая зона не появится на хостах (файла не было и нет).

  • Для полной очистки директории /etc/firewalld на хостах (до загрузки новой конфигурации) можно добавить -e "firewalld_clear_etc_directory=True" к вызову плейбука, либо поменять соответствующую переменную в самом плейбуке. Сейчас поведение по умолчанию — не очищать директорию, только изменять существующие и добавлять новые файлы. М. б. это изменится в будущем.

FirewallD и Docker#

Насколько вижу, сосуществуют ок (но не идеально / не без проблем!). Демон докера во время старта создаёт все нужные ему таблицы / правила фаерволла — как при остановленном, так и при запущенном FirewallD. Правила докера и FirewallD не конфликтуют, работают параллельно (используют таблицы и chains с разными именами).

Если остановить FirewallD — насколько вижу — из nft ruleset исчезают и правила, созданные докером. Перезапуск службы докера заново создаёт нужные правила. Вывод: не нужно останавливать FirewallD без крайней необходимости. Если остановил — перезапусти docker.

Docker (при запуске/перезапуске) присваивает зону trusted (т.е. можно всё) своим интерфейсам dockerX и docker_gwbridge (ограничения затем настраивает отдельными правилами iptables/nftables.

Как проверить наличие правил докера — есть здесь: Проверка наличия таблиц докера

На крайний случай#

Подготовлены плейбуки:

  • playbook/maintenance/firewalld/allow_all_traffic_polite.yml

  • playbook/maintenance/firewalld/allow_all_traffic_FORCED.yml

  • playbook/maintenance/firewalld/disable_firewalld_polite.yml

  • playbook/maintenance/firewalld/disable_firewalld_FORCED.yml

allow_all_traffic — разрешает весь трафик (или большинство), установив для интерфейса ens192 зону trusted (можно всё). Настройка только runtime, после firewall-cmd --reload или перезагрузки хоста снова будет активна рабочая конфигурация FirewallD.

disable_firewalld — отключает и останавливает службу FirewallD.

Вариант polite “уважает” разрешение inv_firewalld_allow_role, вариант FORCED применяется к любому хосту.