Firewalld запускается как демон, новые правила добавляются без перезапуска и без сброса установленного файрвола. Изменения в конфигурации могут быть сделаны в любое время и применяются мгновенно: сохранять или применять изменения не требуется. Поддерживается IPv4, IPv6, автоматическая загрузка модулей ядра и сетевые зоны, определяющие уровень доверия соединений. Предоставляется простой интерфейс добавления правил для служб и приложений, белый список приложений, имеющих право менять правила. В настоящее время такую возможность поддерживает libvirt, Docker, fail2ban, Puppet, скрипт установки Virtuozzo и многие другие проекты. В репозитории YUM уже есть пакеты fail2ban-firewalld и puppet-firewalld, поэтому подключить их можно одной командой.

Firewalld предоставляет информацию о текущих настройках брандмауэра через D-Bus API, а также принимает изменения через D-Bus (система межпроцессного взаимодействия, которая позволяет приложениям в операционной системе сообщаться друг с другом) с использованием методов аутентификации PolicyKit. В качестве бэкенда используются iptables, ip6tables, ebtables, ipset и планируется nftables. Но сами правила, созданные непосредственно этими утилитами, firewalld не может разобрать, поэтому оба метода использовать нельзя.

Управление производится при помощи утилит командной строки firewall-cmd или графической firewall-config, позволяющей настроить все правила в удобной среде.

asda

Установка и запуск#

В некоторых системах может не оказаться firewalld. Для его установки вводим:

CentOS

yum install firewalld

Debian

sudo apt install firewalld

Для автоматического запуска после загруски системы вводим:

systemctl enable firewalld

Запуск службы вручную:

systemctl start firewalld

Общие команды для управления firewalld#

Просмотр состояния:

firewall-cmd --state

Применить настройки (без перезапуска):

firewall-cmd --reload

Перечитать правила и сбросить текущие подключения:

firewall-cmd --complete-reload
  • в официальной документации сказано, что данную команду стоит применять только в случаях проблем с firewalld.

Посмотр созданных правил:

firewall-cmd --list-all

Останов службы:

systemctl stop firewalld

Запретить автозапуск:

systemctl disable firewalld

Сохранить текущие правила, сделав их постоянными (permanent):

firewall-cmd --runtime-to-permanent

Управление правилами#

Синтаксис

Общий синтаксис для работы с правилами:

firewall-cmd [опции] [зона] <правило>
  • порядок следования параметров не важен.

где:

[опции] — дополнительные параметры для создаваемого правила, например –permanent — постоянное правило, то есть будет действовать после перезагрузки (Не обязательный)

[зона] — по умолчанию, правила создаются для зоны public. Для работы с конкретной зоной ее необходимо указать, например, –zone=dmz (Не обязательный)

<правило> — само правило (Обязательный)

Attention

Для применения правил обязательно выполнение команды: firewall-cmd –reload

Добавление портов#

Открыть порт 80:

firewall-cmd --permanent --add-port=80/tcp

где ключ –permanent — добавить постоянное правило (будет действовать после перезагрузки).

Добавить правило для определенной зоны:

firewall-cmd --permanent --zone=external --add-port=80/tcp

Добавить диапазон портов:

firewall-cmd --permanent --add-port=6500-6700/udp

Добавить несколько правил одной командой:

firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp

Добавление сервиса#

Использование служб, вместо портов, может повысить удобство управления правилами за счет объединения нескольких портов в одну службу.

Посмотреть список доступных служб:

firewall-cmd --get-services

Разрешить порт, например, для сервиса ntp:

firewall-cmd --permanent --add-service=ntp

Используя фигурные скобки, можно задавать сразу несколько сервисов. Информация по настройкам сервисов доступна при помощи команды:

firewall-cmd --info-service=http

Firewalld хранит все настройки в XML-файлах в каталогах в /usr/lib/firewalld. В частности, сервисы лежат в services. Внутри файла описание: название, протокол и порт.

::

<?xml version=”1.0” encoding=”utf-8”?> <service>

<short>MySQL</short> <description>MySQL Database Server</description> <port protocol=”tcp” port=”3600”/>

</service>

Это каталог системный, и менять там ничего нельзя. Если нужно переопределить настройки или создать свой сервис, то необходимо скопировать любой файл в качестве шаблона в /etc/firewalld/services, исправить под свои условия и применить настройки.

Создание собственной службы:

firewall-cmd --permanent --new-service=name-service

где name-service — произвольное имя создаваемой службы.

Добавить порт TCP 2200 к службе:

firewall-cmd --permanent --service=name-service --add-port=2200/tcp

Задать описание для удобства:

firewall-cmd --permanent --service=name-service --set-short="Service With This Name"

firewall-cmd --permanent --service=name-service --set-description="Long Description For Service With This Name"

Информацию о созданном сервисе можно получить командой:

firewall-cmd --info-service=name-service

Теперь созданную службу можно использовать для создания правил, например:

firewall-cmd --permanent --add-service=name-service

В firewalld предусмотрен режим, позволяющий одной командой заблокировать все соединения:

firewall-cmd --panic-on

Для проверки, в каком режиме находится файрвол, есть специальный ключ:

firewall-cmd --query-panic

Отключается panic mode:

::

firewall-cmd –panic-off

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

Для определения уровня доверия сетевому соединению в firewalld используются зоны. Зона может содержать несколько сетевых подключений, но сетевое соединение может входить только в одну зону. Список всех зон получаем командой

firewall-cmd --get-zones

После установки создается девять зон, в зависимости от назначения может быть использована одна или несколько зон:

  • trusted — все сетевые соединения разрешены;

  • work/home/internal — зоны похожи по настройкам, отличаются назначением. Устанавливается максимальное доверие к компьютерам в сети, разрешается устанавливать только конкретные входящие соединения (по умолчанию SSH и DHCPv6 client, в home и internal плюс MDNS и Samba client);

  • dmz — для компьютеров, находящихся в демилитаризованной зоне, доступные из Сети и с ограниченным доступом к внутренней сети. Разрешаются только указанные входящие соединения (по умолчанию SSH);

  • external — правило, подходящее для роутеров, для использования во внешних сетях с разрешенным маскарадингом, с максимальным недоверием и четко установленными разрешенными входящими соединениями (по умолчанию SSH);

  • public — для использования в общественных местах, с максимальным недоверием к другим компьютерам, разрешены только конкретные входящие соединения (по умолчанию SSH и DHCPv6 client);

  • block — входящие сетевые соединения отклоняются с icmp-host-prohibited сообщением, разрешены только соединения, инициированные в этой системе;

  • drop — разрешаются только исходящие соединения, все входящие блокируются.

После установки системы обычно используется зона public. Если имеющихся зон недостаточно, то можно создавать новые зоны при помощи

firewall-cmd --permanent --new-zone=zone_name

Все пакеты, не попадающие под определенные зоны, обрабатываются в зоне по умолчанию.

firewall-cmd --get-default-zone

Список активных зон и привязаных к ним интерфейсов

firewall-cmd --get-active-zones

Обратная информация — к какой зоне привязан интерфейс.

firewall-cmd --get-zone-of-interface=eno1

Просмотр настройки зоны (сервисы, порты, протоколы…).

firewall-cmd --zone=public --list-all
firewall-cmd --zone=public --list-services

Если параметр пуст, то это значит, что настройки не установлены.

При необходимости переназначаем интерфейс зоне:

firewall-cmd --zone=home --add-interface=eno1 --permanent

Если сейчас проверить вывод

firewall-cmd --zone=public --list-all

, то увидим, что из списка установок пропал сетевой интерфейс.

Разрешене подключение сервиса:

firewall-cmd --zone=home --add-service=openvpn --permanent

Удаляется он так же:

firewall-cmd --zone=home --remove-service=openvpn --permanent

К зонам можно привязывать и другие источники, определяемые по MAC, отдельному IP или адресу сети. Пакет, пришедший из такого источника, будет обрабатываться по правилам зоны.

::

firewall-cmd –permanent –zone=trusted –add-source=192.168.1.0/24

Список всех source смотрим при помощи –zone=trusted –list-sources.

NAT, позволяющий нескольким компьютерам подключаться к сети, в firewalld включается одной командой. Смотрим текущие настройки маскарадинга:

::

firewall-cmd –zone=external –query-masquerade

Если в ответ получим no, то включаем:

firewall-cmd --zone=external --add-masquerade

Для доступа извне настраивается форвардинг порта в один из компьютеров. Например, нам нужен доступ по SSH к внутреннему серверу:

firewall-cmd --zone=external --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.1.100

Проверка:

::

firewall-cmd –zone=external –list-all

Удаляется правило форвардинга при помощи

::

–remove-forward-port.

Источники:

https://firewalld.org/

https://xakep.ru/2017/02/15/firewalld/

https://www.dmosk.ru/miniinstruktions.php?mini=firewalld-centos