Firewalld
| Firewalld | |
|---|---|
| Разработчик(и) | RedHat |
| Первый выпуск | 2010 |
| Лицензия | GNU GPL v2 |
| Сайт | firewalld.org |
| Репозиторий | firewalld |
Firewalld — сетевой экран от RedHat.
Firewalld запускается как демон, новые правила добавляются без перезапуска и без сброса установленного файрвола.
Изменения в конфигурации могут быть сделаны в любое время и применяются мгновенно: сохранять или применять изменения не требуется.
Поддерживается IPv4, IPv6, автоматическая загрузка модулей ядра и сетевые зоны, определяющие уровень доверия соединений.
Предоставляется простой интерфейс добавления правил для служб и приложений, белый список приложений, имеющих право менять правила.
Firewalld предоставляет информацию о текущих настройках брандмауэра через D-Bus API, а также принимает изменения через D-Bus с использованием методов аутентификации PolicyKit.
В качестве бэкенда используются iptables, ip6tables, ebtables, ipset и планируется nftables. Но сами правила, созданные непосредственно этими утилитами, firewalld не может разобрать, поэтому оба метода использовать нельзя.
Управление производится при помощи утилит командной строки firewall-cmd или графической firewall-config, позволяющей настроить все правила в удобной среде.
Для помощи в миграции текущих правил iptables на firewalld используется утилита firewall-offline-cmd, по умолчанию считывающая /etc/sysconfig/system-config-firewall.
В последних релизах появилась утилита firewallctl, имеющая простой синтаксис и позволяющая получать информацию о состоянии службы, конфигурации брандмауэра и изменять правила.
Установка:
# apt-get install firewalld firewall-config
Команды
- Проверка статуса:
# systemctl status firewalld # firewall-cmd --state
- Разрешить соединение на определенный порт:
# firewall-cmd --permanent --add-port=22/tcp
Чтобы любые изменения вступили в силу, всегда после правок должна быть запущена команда
# firewall-cmd --reload
Для удаления порта из правил используется параметр --remove-port:
# firewall-cmd --remove-port=22/tcp
Многие команды --add-* имеют значения для проверки статуса --query-*, --list-* — список, изменения --change-* или удаления --remove соответствующего значения.
После релоада правил проверяем:
# firewall-cmd --list-ports
Panic-mode
В firewalld предусмотрен режим, позволяющий одной командой заблокировать все соединения:
# firewall-cmd --panic-on
Для проверки, в каком режиме находится файрвол, есть специальный ключ:
# firewall-cmd --query-panic
Отключается panic mode:
# firewall-cmd --panic-off
Сервисы
В firewalld необязательно знать, какой порт привязан к сервису, достаточно указать название сервиса. Все остальное утилита возьмет на себя.
После установки firewalld знает настройки более 50 сервисов, получаем их список.
# firewall-cmd --get-services
Разрешим подключение к HTTP:
# firewall-cmd --add-service=http
Используя фигурные скобки, можно задавать сразу несколько сервисов. Информация по настройкам сервисов доступна при помощи
# firewall-cmd --info-service=http
Управление зонами
Для определения уровня доверия сетевому соединению в 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 — разрешаются только исходящие соединения, все входящие блокируются.
Описания зон также представлены в XML-файлах в /usr/lib/firewalld/zones
После установки системы обычно используется зона 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.
Сложные правила
Для отдельного ПК или небольших сетей базовых возможностей вполне хватает, для настройки сложных правил в firewalld изначально предлагался так называемый direct-синтаксис, чуть позже появился собственный язык Rich Language. В первом варианте достаточно знать синтаксис iptables, рекомендуется использовать в крайнем случае, так как правила не сохраняются после перезагрузки.
Синтаксис direct правила такой:
# firewall-cmd [--permanent] --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>
Позиция полностью совпадает с синтаксисом iptables. Получаем текущие установки:
# firewall-cmd --direct --get-chains ipv4 filter # firewall-cmd --direct --get-rules ipv4 filter input
Добавляем правило, разрешающее соединение по 25-му порту:
# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -m tcp -p tcp --dport 25 -j ACCEPT
Пробросим соединение по 22-му на другой сервер:
# firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i eno1 -o eno2 -p tcp --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
Проверяем:
# firewall-cmd --direct --get-all-rules
Rich Language позволяет записывать сложные правила в более удобном для понимания виде. В правиле можно указывать любые параметры, характеризующие пакет: источник, назначение, сервис, порт, протокол, маскарадинг, журналирование, аудит и действие. Например, разрешим подсети соединяться по HTTP и добавляем аудит:
# firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.0.0/24" service name="http" audit limit value="1/m" accept
Большой плюс Rich Language в том, что все параметры можно описать в XML в файле зоны. Формат файла очень простой и повторяет названия параметров:
<rule>
<service name="ssh"/>
<accept/>
</rule>