Небольшой cheatsheet по firewalld

Решил-таки перебороть себя и более-менее вернуться на ОС на базе ядра Linux, с которыми я перестал общаться (вернее общался только по необходимости) после внедрения почти во все ОСи по-умолчанию мегасервиса – systemd. Я так и не принял его идеологически, всё же это не UNIX way, но общий тонус администрирования и работы с Linux, как показал опыт прохождения интервью в DINO Systems, стоит поддерживать :-) Тут оставлю для себя небольшой cheatsheet по работе в ещё одним мегасервисом, который постепенно приходит на смену iptables – firewalld.


Содержание:

  1. О firewalld
  2. Консольные команды
  3. Зоны и правила
  4. Полезные ресурсы

О firewalld

firewalld-python

В целом firewalld представился очередной довольно интересной попыткой создать интерфейс настройки iptables. Он написан на python, сделано это, понятно для чего: ansible, chief. Судя по тому, что написано в оф. мане от красношляпа, firewalld принимает данные по настройке фаервола от юзера в своём формате (об этом ниже) и со своим синтаксисом, после чего транслирует его в cli iptables, который уже в свою очередь передаёт его ipfilter'у. Отсюда и заявленные плюсы firewalld: проверка синтаксиса перед отправлением его в iptables, сохранение активными подключений, даже если оператор нечаянно обрубил себе подключение к серверу. Как я понимаю, тоже самое делал(-ет) ufw.

firewalld-python

Лично мне идея с адекватным синтаксисом для iptables по душе, ибо я, каюсь, не особо люблю писать правила для iptables, другое дело pf или тот же ipfw, вот там всё для людей сделано, на мой вкус опять же.
firewalld работает по модному и эффективному принципу zone-based фаервола. По-умолчанию в нём присутствуют почти все требуемые зоны, которые можно активировать\применять к интерфейсу, редактировать, в общем делать всё что угодно (но желательно не удалять).
Признаюсь, сразу после того, как я приступил к изучению я подумал, что firewalld не имеет файлов конфигурации для правил фаервола и имеет только интерактивный интерфейс управления для динамического добавления\удаления правил (да, ожидал наличие какого-нибудь модного db бекенда для хранения правил, типа redis ^^). Но покопавшись в манах понял, что люди, писавшие его понимали чаяния страдальцев от синтаксиса iptables и в общем и целом его удовлетворили, на мой вкус, опять же.
Конфигурирование firewalld доступно в двух режимах: интерактивный\динамический и старый-добрый метод изменения конфигурационного файла. Каждый из двух методов включает в себя 3 суб-метода: 1) обычный ввод правил firewalld; 2) расширенный (richlanguage) ввод правил firewalld (мне он больше всего понравился); 3) прямой ввод (direct) правил iptables, вернее наиболее приближённый его вариант.


Консольные команды

Полезные консольные команды по работе с зонами, с пояснением их действий.

  • systemctl status firewalld.service – проверка работоспособности сервиса. Кстати, это одна из немногих реально крутых и нужных, как по мне, фишек systemd. Очень информативный вывод.;
  • firewall-cmd --get-default-zone – узнать зону, установленную по-умолчанию. Зона по-умолчанию, это та зона, которая будет активирована, когда прочие активные, применённые к интерфейсу зоны будут неработоспособны;
  • firewall-cmd --get-active-zones – узнать зону, которая активна в данный момент. Вывод примерно такой:

    $ sudo firewall-cmd --get-active-zones
    test-zone
    interfaces: enp0s25
    

    Здесь указаны название зоны и интерфейс, к которому данная зона применена.

  • firewall-cmd --list-all – вывод подробной информации о зоне. Без особого указания зоны, команда будет применена к зоне по-умолчанию;

  • firewall-cmd --get-zones – вывод списка всех доступных зон;

  • firewall-cmd --zone=test-zone --list-all – вывод подробной информации о конкретной зоне;

    $ sudo firewall-cmd --zone=test-zone --list-all
    test-zone (active)
    target: %%REJECT%%
    icmp-block-inversion: no
    interfaces: enp0s25
    sources:
    services:
    ports:
    protocols:
    masquerade: no
    forward-ports:
    source-ports:
    icmp-blocks: host-prohibited
    rich rules:
        rule family="ipv4" source address="172.27.223.0/24" accept
        rule family="ipv4" source address="172.27.252.98" service name="http" accept
        rule family="ipv4" source address="172.27.252.98" service name="https" accept
    

Здесь:
* test-zone (active) – указывает на то, что эта зона является активной на данный момент.
* target: %%REJECT%% – правило для пакетов по-умолчанию. Доступны варианты: accept, drop, reject.
* icmp-block-inversion: no – указывает что делать с icmp-types. Позволяет принимать только те icmp-types, которые зарегистрированы на firewalld путём обратного просмотра входящих icmp-types.
* interfaces: enp0s25 – интерфейс, к которому применена зона.
* masquerade: no – отсутствие какого-либо redirect’а.
* icmp-blocks: host-prohibited – указывает icmp-type, который будет отправлен хосту, который плучил reject. Валидны только активные, зарегистрированные на firewalld icmp-types.
* rich rules: – то, ради чего я пишу этот пост :-) Один из видов конфигурирования фаервола.
Подробнее про опции конфигурации зоны тут.

  • firewall-cmd --list-all-zones | less – вызвать такой же подробный список по всем активным зонам на firewalld;
  • firewall-cmd --permanent --new-zone=another-test-zone – создать новую зону. После прожатия этой команды, в /etc/firewalld/zones появится, сюрприз-сюрприз, xml файл с настройками этой зоны. Типа: /etc/firewalld/zones/another-test-zone.xml. Важно, на данный момент наличествует ограничение на длину названия файла/зоны: 17 символов. Также важно: зоны создаются только с ключём --permanent;
  • firewall-cmd --permanent --zone=another-test-zone --change-interface=$if-name – применить к зоне интерфейс и тем самым активировать её. Также активировать зону можно отредактировав файл настройки интерфейса от network расположенный тут: /etc/sysconfig/network-scripts/ifcfg-enp0s25, для применения изменений нужно перезагрузить network: systemctl restart network и systemctl restart firewalld;
  • firewall-cmd --set-default-zone=another-test-zone – сделать созданную зону зоной по-умолчанию. Также можно отредактировать файл конфигурации самого firewalld: /etc/firewalld/firewalld.conf, секцию DefaultZone=, подробнее тут;
  • firewall-cmd --reload – применить изменения firewalld. Применяются не мгновенно;
  • iptables --list | less – проверить применились ли изменения на cli iptables;
  • journalctl -xe | grep firewalld | grep ERROR | less – отладка ошибок синтаксиса файлов конфигурации зоны. При неверном синтаксисе firewalld отключает криво настроенную зону и при повторном обращение к ней пишет, что зона не найдена. При этом работоспособность фаервола сохраняется, активные сессии не режутся, а в качеcтве активной зоны применяется зона по-умолчанию. Также можно воспользоваться опцией дебага: FIREWALLD_ARGS=--debug, подробнее тут;
  • firewall-cmd --permanent --get-services – вывод зарегистрированных сервисов на firewalld. Подробнее тут;
  • firewall-cmd --get-icmptypes – вывод зарегистрированных icmp-types. Подробнее тут;

Статистику и прочее, я полагаю, лучше снимать напрямую с iptables, как удобнее, типа такого: iptables -L -vxn | less.


Зоны и правила

Как было показано выше, команда: firewall-cmd --permanent --new-zone=another-test-zone – создаёт новую зону и записывает файл конфигурации оной в /etc/firewalld/zones/another-test-zone.xml. Это обычный xml-файл, который можно редактировать напрямую. Регулярно прожимая firewall-cmd --reload для применения правил.

$ file another-test-zone.xml
another-test-zone.xml: XML 1.0 document, ASCII text

Вооружившись верным и богоугодным редактором vim, можно приступить к редактированию файла. Приведу простейший пример:

<?xml version="1.0" encoding="utf-8"?>
<zone version="1" target="%%REJECT%%">
  <short>another-test-zone</short>
  <description>This is another test zone, which will by default REJECT all incoming conections, except listed here.</description>
  <icmp-block name="host-prohibited"/>
  <interface name="enp0s25"/>
  <rule family="ipv4">
    <source address="172.27.223.0/24"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="172.27.252.98"/>
    <service name="http"/>
    <accept/>
  </rule>
<rule family="ipv4">
  <source address="172.27.252.98"/>
    <service name="https"/>
    <accept/>
</rule>
</zone>

Собтвенно тут всё достаточно очевидно и без дополнительных комментариев. Более подробно синтаксис файла конфигурации представлен тут.
Укажу лишь то, как выглядят три блока конфигурирования. Сначала идёт блок конфигурирования firewalld, включающий в себя <description>, <icmp-block name> и прочие. Следом за ними идут правила расширенного редактирования, обозначающиеся тегом <rule family>. И уже после них можно применять правила прямого редактирования, начинающиеся тегом <direct>. Опции и синтаксис файла для работы с расширенным редактированием доступны тут:


Полезные ресурсы