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, позволяющей настроить все правила в удобной среде.
Установка и запуск#
В некоторых системах может не оказаться 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://xakep.ru/2017/02/15/firewalld/
https://www.dmosk.ru/miniinstruktions.php?mini=firewalld-centos