From Fedora Project Wiki

Динамический брандмауэр с использованием FirewallD (firewall daemon / демон межсетевого экрана)

FirewallD предоставляет функционал динамически управляемого брандмауэра с поддержкой сетевых зон, призванных определить уровень доверия для сетевого соединения или интерфейса. Он имеет поддержку настройки межсетевого экрана IPv4, IPv6 и сетевых мостов, а также разделяет среду выполнения и параметры конфигурации. FirewallD также имеет интерфейс для добавления правил брандмауэра непосредственно из служб и приложений.

Прежняя модель брандмауэра (с применением system-config-firewall/lokkit) была статической и каждое изменение требовало полной перезагрузки межсетевого экрана. Такая модель также подразумевала и выгрузку модулей ядра, обеспечивающих функционирование брандмауэра, а также загрузку модулей, необходимых для работы новой конфигурации. Выгрузка модулей приводила к нарушению состояния межсетевого экрана и установленных соединений.

С другой стороны, FirewallD обеспечивает динамическое управление брандмауэром и применяет изменения конфигурации без перезагрузки всего межсетевого экрана. Следовательно, нет необходимости перезагружать все модули ядра, обеспечивающие функционирование брандмауэра. Но использование FirewallD требует, чтобы все изменения в конфигурации межсетевого экрана выполнялись именно демоном, для обеспечения соответствия в состояниях демона и брандмауэра. FirewallD не может анализировать правила брандмауэра, добавленные консольными утилитами ip*tables и ebtables.

FirewallD предоставляет информацию об активных в текущее время параметрах межсетевого экрана через шину D-BUS, а также утверждает изменения, полученные посредством D-BUS, используя метод аутентификации PolicyKit.

Демон

Приложения, демоны и пользователь могут сделать запрос через D-BUS для разрешения функции брандмауэра. Это может быть одна из предопределённых функций межсетевого экрана, таких как комбинации служб, порта и протокола, перенаправление порта/пакета, маскарадинг или блокирование ICMP. Функция может быть включена на определённое время или может быть снова отключена.

С помощью так называемого прямого интерфейса другие службы (например, такие как libvirt) могут добавлять собственные правила, используя аргументы и параметры iptables.

Вспомогательные модули межсетевого экрана, которые используются, например, для служб amanda, ftp, samba и tftp, также обрабатываются демоном, пока они являются частью определённой заранее службы. Загрузка дополнительных вспомогательных модулей не является частью текущего интерфейса. Для некоторых вспомогательных модулей выгрузка возможна только после того, как все обрабатываемые соединения завершатся. Поэтому отслеживаемые данные о соединении в данном случае важны и должны обрабатываться.

Статический межсетевой экран (system-config-firewall/lokkit)

Действующая статическая модель брандмауэра (с применением system-config-firewall и lokkit) всё ещё будет доступна и пригодна к использованию, но не одновременно с запущенным FirewallD. Пользователь либо администратор могут принимать решение, какой из вариантов межсетевого экрана следует исползовать, путём запуска соответствующей службы.

Запланировано добаление средства выбора, какой вариант брандмауэра использовать вдальнейшем, в этапы инсталляции или первоначальной настройки системы. Конфигурация другого варианта останется нетронутой и может быть разрешена простым переключением к другой модели.

FirewallD не зависит от system-config-firewall, тем не менее, их не следует использовать одновременно.

Использование правил статического межсетевого экрана совместно со службами iptables и ip6tables

Если вы хотите использовать собственные правила статического брандмауэра совместно со службами iptables и ip6tables, установите iptables-services, отключите FirewallD, а также включите iptables и ip6tables:

yum install iptables-services
systemctl mask firewalld.service
systemctl enable iptables.service
systemctl enable ip6tables.service

Для задействования своих правил статического межсетевого экрана используйте /etc/sysconfig/iptables и /etc/sysconfig/ip6tables.

Важно: Пакеты iptables и iptables-services не содержат правил брандмауэра, необходимых для использования указанных выше служб. Эти службы доступны для совместимости, а также для тех людей, которые хотят использовать собственные правила. В связи с этим, можно использовать system-config-firewall для создания правил самостоятельно. Для того чтобы использовать system-config-firewall, необходимо остановить выполнение FirewallD.

После создания правил, необходимых для использования служб статического межсетевого экрана, следует остановить FirewallD и запустить iptables и ip6tables:

systemctl stop firewalld.service
systemctl start iptables.service
systemctl start ip6tables.service

Что такое зона?

Сетевая зона определяет уровень доверия для сетевых соединений. Она представляет собой связь, подразумевающую, что соединение может быть только частью зоны, но зона может быть использована для многих соединений.

Большинство зон являются изменяемыми, но также есть и неизменяемые зоны. Неизменяемые зоны нельзя настроить, не существует способа их перегрузить.

Определённые заранее службы

Служба ― это комбинация записей портов и/или протоколов. Опционально могут добавляться вспомогательные модули, а также адрес назначения IPv4 и IPv6.

Порты и протоколы

Определение портов TCP или UDP, где порты могут представлять собой единственный порт либо диапазон поротов.

Блоки ICMP

Отдельные блоки межсетевого протокола управляющих сообщений (Internet Control Message Protocol, ICMP). Эти блоки являются либо информационными запросами, либо сообщениями, созданными в ответ на информационные запросы, либо сообщениями об ошибках.

Маскарадинг

Адреса частной сети спрятаны за доступным извне адресом IP и привязаны к нему. Это разновидность трансляции адресов.

Проброс портов

Порт переназначается на другой порт и/или другой узел.

Какие доступны зоны?

Предоставляемые FirewallD зоны по умолчанию отсортированы в соответствии с уронями доверия ― от ненадёжного до доверенного:

Сброс (drop, неизменяемая зона)

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

Блокирование (block, неизменяемая зона)

Все входящие сетевые соединения отклоняются с сообщениями icmp-host-prohibited (для IPv4) и icmp6-adm-prohibited (для IPv6). Возможны только инициированные в рамках данной системы сетевые соединения.

Общественное место (public)

Предназначено для использования в общественных местах. Остальные компьютеры сети считаются ненадёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.

"Внешняя" сеть (external)

Предназначено для использования во "внешних" сетях с активированным режимом маскарадинга, особенно с применением роутеров. Остальные компьютеры сети считаются ненадёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.

"Безоружная" зона (demilitarized zone, DMZ)

Предназначено для компьютеров в личной "безоружной" зоне с ограниченным общественным доступом к внутренней сети. Разрешены лишь отдельные входящие соединения.

Рабочее пространство (work)

Предназначено для использования в рабочем пространстве. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.

Домашняя сеть (home)

Предназначено для использования в домашних сетях. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.

"Внутренняя" сеть (internal)

Предназначено для использования во "внутренних" сетях. Остальные компьютеры сети, по большей части, считаются надёжными (с точки зрения причинения вреда вашему ПК). Разрешены лишь отдельные входящие соединения.

Доверенная сеть (trusted, неизменяемая зона)

Разрешены все сетевые соединения.

Какую зону следует использовать?

Например, общественное подключение к сети WiFi лучше всего отнести к ненадёжным, проводное подключение к домашней сети должно быть, безусловно, доверенным. Следует выбирать зону, наилучшим образом соответствующую используемому подключению к сети.

Как добавить или настроить зоны?

Чтобы создать или настроить зоны, вы можете использовать какой-либо из интерфейсов FirewallD, предназначенных для обработки и изменения конфигурации. Ими являются графическое средство конфигурирования firewall-config, консольная утилита firewall-cmd или интерфейс D-BUS. Также вы можете создать или скопировать файл зоны в одном из каталогов конфигурации. Директория /etc/firewalld/zone используется для хранения настроек по-умолчанию, а также для возврата к ним в случае необходимости; каталог @PREFIX@/lib/firewalld/zones используется для хранения изменённых файлов конфигурации либо созданных пользователем.

Как указать или изменить зону для соединения?

Для соединения тип зоны сохраняется в значении опции ZONE= для ifcfg. Если данная опция отсутствует или ей не присвоено значение, то применяется зона, указанная FirewallD по умолчанию.

Если соединение управляется NetworkManager, то для изменения зоны вы также можете использовать nm-connection-editor.

Сетевые соединения, обрабатываемые NetworkManager

Межсетевой экран не может обрабатывать сетевые соединения, созданные в представлении NetworkManager, он может обрабатывать лишь сетевые интерфейсы. Поэтому NetworkManager указывает FirewallD отнести сетевые интерфейсы, относящиеся к соединениям, к зонам, определённым в конфигурационном файле соединения (ifcfg), до установления соединения. Если зона не задана в файле конфигурации, интерфейсы будут отнесены к зоне, указанной FirewallD по умолчанию. Если соединение имеет более одного интерфейса, то все они будут отнесены к соответствующей зоне. Изменения в названиях интерфейсов также будут обработаны NetworkManager и сообщены FirewallD.

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

Кроме того, NetworkManager указывает FirewallD удалить соединения из зон в том случае, если соединение разорвано.

Если FirewallD запускается или перезапускается посредством systemd или скриптов инициализации (init scripts), FirewallD уведомляет NetworkManager и соединения добавятся в соответствующие зоны.

Сетевые соединения, обрабатываемые сетевыми скриптами (network scripts)

Для соединений, обрабатываемых сетевыми скриптами, существуют ограничения. Не существует демона, который мог бы указать FirewallD отнести соединения к той или иной зоне. Это делается только в случае использования скриптов ifcfg-post. Поэтому изменения в именах, произведённые после, не могут буть сообщены FirewallD. Кроме того, перезапуск FirewallD в случае, если соединения уже активны, приведёт к потере связи соединений с зонами. Но существуют идеи, как это исправить. Самая простая из них — относить все соединения к зоне, указанной FirewallD по умолчанию, если не задано другого.

Зона определяет функции межсетевого экрана, разрешённые в данной зоне:

Работа с FirewallD

Для того чтобы, например, разрешить или запретить функции брандмауэра в зонах, вы можете использовать либо графическое средство конфигурирования firewall-config, либо консольную утилиту firewall-cmd.

Использование firewall-cmd

Консольное приложение firewall-cmd поддерживает все функции межсетевого экрана. В режимах статуса и запроса утилита не выдаёт ответных сообщений, но команда возвращает состояние.

Общие положения об использовании

  • Получение статуса FirewallD:
 firewall-cmd --state

Эта команда возвращает статус FirewallD, но видимого ответного сообщения нет. Чтобы получить состояние в визуально различимом виде, следует поступить так:

 firewall-cmd --state && echo "Running" || echo "Not running"
  • Перезагрузка брандмауэра без потери информации о состоянии:
 firewall-cmd --reload

Если вместо этого вы используете ключ --complete-reload, информация о состоянии будет потеряна. Эту опцию следует использовать только в случае серьёзных проблем с межсетевым экраном, например, если существуют такие неполадки с информацией о состоянии, что не может быть установлено ни одно соединение, но все правила межсетевого экрана верны.

  • Получение списка всех поддерживаемых зон:
 firewall-cmd --get-zones

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

  • Получение списка всех поддерживаемых служб:
 firewall-cmd --get-services

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

  • Получение списка всех поддерживаемых типов ICMP:
 firewall-cmd --get-icmptypes

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

  • Вывод всех зон с включённым функционалом:
 firewall-cmd --list-all-zones

Формат вывода таков:

 <zone>
   interfaces: <interface1> ..
   services: <service1> ..
   ports: <port1> ..
   forward-ports: <forward port1> ..
   icmp-blocks: <icmp type1> ..
   
   ..
  • Отображение зоны <zone> с включённым функционалом (если зона не задана, задействуется зона, указанная по умолчанию):
 firewall-cmd [--zone=<zone>] --list-all
  • Получение зоны, указанной по умолчанию для сетевых соединений:
 firewall-cmd --get-default-zone
  • Задание зоны по умолчанию:
 firewall-cmd --set-default-zone=<zone>

Все интерфейсы, относящиеся к зоне, указанной по умолчанию, будут отнесены к новой зоне по умолчанию, которая будет определять ограничения для последующих вновь инициируемых сетевых соединений. Активные соединения не подвержены действию этой команды.

  • Получение активных зон:
 firewall-cmd --get-active-zones

Данная команда выводит интерфейсы, указанные в качестве части зоны, в следующей форме:

 <zone1>: <interface1> <interface2> ..
 <zone2>: <interface3> ..
  • Получение зон, относящихся к интерфейсу:
 firewall-cmd --get-zone-of-interface=<interface>

Данная команда выводит имя зоны, если интерфейс является частью зоны.

  • Добавление интерфейса в зону:
 firewall-cmd [--zone=<zone>] --add-interface=<interface>

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

  • Изменение зоны, которой принадлежит интерфейс:
 firewall-cmd [--zone=<zone>] --change-interface=<interface>

Данная команда схожа с опцией --add-interface, но она соотносит интерфейс новой зоне, даже если до этого он принадлежал другой зоне.

  • Удаление интерфейса из зоны:
 firewall-cmd [--zone=<zone>] --remove-interface=<interface>
  • Сделать запрос, относится ли интерфейс к зоне:
 firewall-cmd [--zone=<zone>] --query-interface=<interface>

Осуществляет возврат, если интерфейс в зоне. Видимого ответного сообщения нет.

  • Вывод включённых в зоне служб:
 firewall-cmd [ --zone=<zone> ] --list-services
  • Включение "режима паники", блокирующего весь сетевой трафик в случае крайней необходимости:
 firewall-cmd --panic-on
  • Отключение "режима паники":
 firewall-cmd --panic-off
  • Сделать запрос на предмет "режима паники":
 firewall-cmd --query-panic

Эта команда возвращает статус "режима паники" (0 если включено (on) и 1 в обратном случае), а также выводит на консоль yes/no.

Имена опций были изменены в версии 0.3.0
В предыдущих версиях они назывались соответственно --enable-panic и --disable-panic.

Обработка зон с изменяемыми во время выполнения параметрами

В режиме выполнения изменения в зонах не постоянны. Изменения будут утеряны после перезагрузки или перезапуска.

  • Включение службы в пределах зоны:
 firewall-cmd [--zone=<zone>] --add-service=<service> [--timeout=<seconds>]

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

  • Пример: Включение службы ipp-client в пределах зоны на 60 секунд:
 firewall-cmd --zone=home --add-service=ipp-client --timeout=60
  • Пример: Включение службы http в пределах зоны, указанной по умолчанию:
 firewall-cmd --add-service=http
  • Отключение службы для зоны:
 firewall-cmd [--zone=<zone>] --remove-service=<service>

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

  • Пример: Отключение службы http для зоны home:
 firewall-cmd --zone=home --remove-service=http

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

  • Сделать запрос, включена ли служба в пределах зоны:
 firewall-cmd [--zone=<zone>] --query-service=<service>

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

  • Включение сочетания порта и протокола в пределах зоны:
 firewall-cmd [--zone=<zone>] --add-port=<port>[-<port>]/<protocol> [--timeout=<seconds>]

Данная команда включает сочетание порта и протокола. Порт может представлять собой единственный порт <port> или диапазон портов <port>-<port>. Протоколом может быть как tcp, так и udp.

  • Отключение сочетания порта и протокола в пределах зоны:
 firewall-cmd [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
  • Сделать запрос, включено ли сочетание порта и протокола в пределах зоны:
 firewall-cmd [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

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

  • Включение маскарадинга в пределах зоны:
 firewall-cmd [--zone=<zone>] --add-masquerade

Данная команда включает маскарадинг для зоны. Адреса частной сети спрятаны за доступным извне адресом IP и привязаны к нему. Это разновидность трансляции адресов, обычно используется в роутерах. Маскарадинг доступен только для IPv4 из-за ограничений ядра.

  • Отключение маскарадинга для зоны:
 firewall-cmd [--zone=<zone>] --remove-masquerade
  • Сделать запрос на предмет маскарадинга в пределах зоны:
 firewall-cmd [--zone=<zone>] --query-masquerade

Осуществляет возврат, если маскарадинг включён, видимого ответного сообщения нет.

  • Включение блока ICMP в пределах зоны:
 firewall-cmd [--zone=<zone>] --add-icmp-block=<icmptype>

Эта команда включает блок выбранного межсетевого протокола управляющих сообщений (ICMP). Сообщения ICMP являются либо информационными запросами, либо сообщениями, созданными в ответ на информационные запросы, либо сообщениями об ошибках.

  • Отключение блока ICMP для зоны:
 firewall-cmd [--zone=<zone>] --remove-icmp-block=<icmptype>
  • Сделать запрос на предмет блока ICMP в пределах зоны:
 firewall-cmd [--zone=<zone>] --query-icmp-block=<icmptype>

Осуществляет возврат, если блок включён, видимого ответного сообщения нет.

  • Пример: Включение блока сообщений "эхо-ответ" в зоне public:
 firewall-cmd --zone=public --add-icmp-block=echo-reply
  • Включение перенаправления или переназначения портов в пределах зоны:
 firewall-cmd [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

Порт переназначается либо на такой же порт на другом узле, либо на другой порт на том же узле, либо на другой порт на другом узле. Порт может представлять собой единственный порт <port> или диапазон портов <port>-<port>. Протоколом может быть как tcp, так и udp. Значение опции toport может быть как портом <port>, так и диапазоном портов <port>-<port>. Значение опции toaddr является адресом IPv4. Перенаправление портов доступно только для IPv4 из-за ограничений ядра.

  • Отключение перенаправления или переназначения портов для зоны:
 firewall-cmd [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
  • Сделать запрос на предмет перенаправления или переназначения портов в пределах зоны:
 firewall-cmd [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

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

  • Пример: Перенаправление ssh на узел 127.0.0.2 в пределах зоны home:
 firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

Обработка зон с постоянными/устойчивыми параметрами

Постоянные опции не оказывают влияния непосредственно в среде выполнения. Эти опции доступны только после перезагрузки или перезапуска. Для того чтобы иметь опции, изменяемые в среде выполнения, и постоянные опции, необходимо обеспечить оба варианта. Опция --permanent должна быть первой для всех постоянных вызовов.

  • Получение списка поддерживаемых постоянно служб:
 firewall-cmd --permanent --get-services
  • Получение списка поддерживаемых постоянно типов ICMP:
 firewall-cmd --permanent --get-icmptypes
  • Получение списка поддерживаемых постоянно зон:
 firewall-cmd --permanent --get-zones
  • Включение службы в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --add-service=<service>

Данная команда включает службу в пределах зоны на постоянно. Если опция зоны не задана, задействуется зона, указанная по умолчанию.

  • Отключение службы для зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --remove-service=<service>
  • Сделать запрос, включена ли служба в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --query-service=<service>

Осуществляет возврат, если служба включена, видимого ответного сообщения нет.

  • Пример: Включение службы ipp-client в пределах зоны home на постоянно:
 firewall-cmd --permanent --zone=home --add-service=ipp-client
  • Включение сочетание порта и протокола в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --add-port=<port>[-<port>]/<protocol>
  • Отключение сочетания порта и протокола для зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
  • Сделать запрос, включено ли сочетание порта и протокола в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --query-port=<port>[-<port>]/<protocol>

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

  • Пример: Включение порта 443/TCP для https в пределах зоны home на постоянно:
 firewall-cmd --permanent --zone=home --add-port=443/tcp
  • Включение маскарадинга в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --add-masquerade

Данная команда включает маскарадинг в пределах зоны. Адреса частной сети спрятаны за доступным извне адресом IP и привязаны к нему. Это разновидность трансляции адресов, обычно используется в роутерах. Маскарадинг доступен только для IPv4 из-за ограничений ядра.

  • Отключение маскарадинга для зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --remove-masquerade
  • Сделать запрос, включён ли маскарадинг в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --query-masquerade

Осуществляет возврат, если маскарадинг включён, видимого ответного сообщения нет.

  • Включение блока ICMP в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --add-icmp-block=<icmptype>

Эта команда включает блок выбранного межсетевого протокола управляющих сообщений (ICMP). Сообщения ICMP являются либо информационными запросами, либо сообщениями, созданными в ответ на информационные запросы, либо сообщениями об ошибках.

  • Отключение блока ICMP для зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --remove-icmp-block=<icmptype>
  • Сделать запрос, включён ли блок ICMP в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --query-icmp-block=<icmptype>

Осуществляет возврат, если блок ICMP включён, видимого ответного сообщения нет.

  • Пример: Включение блока сообщений "эхо-ответ" в зоне public на постоянно:
 firewall-cmd --permanent --zone=public --add-icmp-block=echo-reply
  • Включение перенаправления или переназначения портов в пределах зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --add-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

Порт переназначается либо на такой же порт на другом узле, либо на другой порт на том же узле, либо на другой порт на другом узле. Порт может представлять собой единственный порт <port> или диапазон портов <port>-<port>. Протоколом может быть как tcp, так и udp. Значение опции toport может быть как портом <port>, так и диапазоном портов <port>-<port>. Значение опции toaddr является адресом IPv4. Перенаправление портов доступно только для IPv4 из-за ограничений ядра.

  • Отключение перенаправления или переназначения портов для зоны на постоянно:
 firewall-cmd --permanent [--zone=<zone>] --remove-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }
  • Сделать запрос на предмет постоянных перенаправления или переназначения портов в пределах зоны:
 firewall-cmd --permanent [--zone=<zone>] --query-forward-port=port=<port>[-<port>]:proto=<protocol> { :toport=<port>[-<port>] | :toaddr=<address> | :toport=<port>[-<port>]:toaddr=<address> }

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

  • Пример: Перенаправление ssh на узел 127.0.0.2 в пределах зоны home на постоянно:
 firewall-cmd --permanent --zone=home --add-forward-port=port=22:proto=tcp:toaddr=127.0.0.2

Прямые опции

Прямые опции предназначены, в основном, для возможности назначения пользовательских правил службам и приложениям. Правила не сохраняются и должны быть переопределены после перезагрузки или перезапуска. Аргументы <args> сквозной опции такие же, как и соответствующие аргументы iptables, ip6tables ebtables.

Ключ --direct следует указывать перед всеми прямыми опциями.

  • Передача команды через межсетевой экран; аргументами <args> могут быть все аргументы командной строки iptables, ip6tables и ebtables:
 firewall-cmd --direct --passthrough { ipv4 | ipv6 | eb } <args>
  • Добавление новой последовательности <chain> таблице <table>:
 firewall-cmd --direct --add-chain { ipv4 | ipv6 | eb } <table> <chain>
  • Удаление последовательности с именем <chain> из таблицы <table>:
 firewall-cmd --direct --remove-chain { ipv4 | ipv6 | eb } <table> <chain>
  • Сделать запрос, существует ли последовательность <chain> в таблице <table>; возвращает 0, если верно, иначе — 1:
 firewall-cmd --direct --query-chain { ipv4 | ipv6 | eb } <table> <chain>

Осуществляет возврат, если последовательность существует, видимого ответного сообщения нет.

  • Получение перечня всех последовательностей, добавленных в таблицу <table>, в виде списка, разделённого пробелами:
 firewall-cmd --direct --get-chains { ipv4 | ipv6 | eb } <table>
  • Добавление правила с аргументами <args> в последовательность <chain> в таблице <table> с приоритетом <priority>:
 firewall-cmd --direct --add-rule { ipv4 | ipv6 | eb } <table> <chain> <priority> <args>
  • Удаление правила с аргументами <args> из последовательности <chain> в таблице <table>:
 firewall-cmd --direct --remove-rule { ipv4 | ipv6 | eb } <table> <chain> <args>
  • Сделать запрос, существует ли правило с аргументами <args> в последовательности <chain> в таблице <table>; возвращает 0, если верно, иначе — 1:
 firewall-cmd --direct --query-rule { ipv4 | ipv6 | eb } <table> <chain> <args>

Осуществляет возврат, если правило существует, видимого ответного сообщения нет.

  • Получение перечня всех правил, добавленных в последовательность <chain> в таблице <table>, в виде списка, состоящего из строк аргументов.
 firewall-cmd --direct --get-rules { ipv4 | ipv6 | eb } <table> <chain>

Функционал FirewallD на данный момент

Интерфейс D-BUS

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

Зоны

Сетевая зона определяет уровень доверия интерфейса, используемого для сетевого соединения. Существует несколько предопределённых зон, обеспечиваемых FirewallD. Опции конфигурации зоны и общий информационный файл описываются в man-странице firewalld.zone(5).

Службы

Служба может быть списком локальных портов и направлений, а также, кроме того, перечнем вспомогательных модулей межсетевого экрана, загружаемых автоматически, если служба включена. Использование предопределённых служб позволяет пользователю легче разрешать и запрещать доступ к службе. Опции конфигурации службы и общий информационный файл описываются в man-странице firewalld.service(5).

Типы ICMP

Межсетевой протокол управляющих сообщений (Internet Control Message Protocol, ICMP) используется для обмена информацией, а также сообщениями об ошибках в пределах IP-адресации (Internet Protocol, IP). Типы ICMP могут быть использованы в FirewallD для ограничения обмена этими сообщениями. Опции конфигурации типов ICMP и общий информационный файл описываются в man-странице firewalld.icmptype(5).

Прямой интерфейс

Прямой интерфейс используется, главным образом, службами или приложениями для назначения специфических правил межсетевого экрана. Правила не являются постоянными и должны применяться после получения сообщения о запуске, перезапуске или перезагрузке от FirewallD посредством D-BUS.

Конфигурация времени выполнения

Конфигурация времени выполнения не является постоянной/устойчивой и сохраняется только до перезагрузки. После перезапуска или останова службы или перезагрузки системы эти параметры будут потеряны.

Постоянная/устойчивая конфигурация

Постоянная конфигурация хранится в соответствующих файлах и восстанавливается каждый раз при загрузке машины, перезагрузке службы или перезапуске.

Апплет в системном трее

Апплет в системном трее firewall-applet визуализирует для пользователя состояние межсетевого экрана, а также проблемы с брандмауэром. Он также может использован для конфигурирования с помощью возможности запуска утилиты firewall-config.

Графическое средство конфигурирования

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

Консольный клиент

Консольная утилита firewall-cmd обеспечивает большую часть функционала графического средства по настройке.

Поддержка ebtables

Поддержка ebtables нужна для удовлетворения всех потребностей демона libvirt, а также чтобы предотвратить проблемы доступа между ip*tables и ebtables на уровне вспомогательных модулей ядра для межсетевого экрана. Все эти команды получают доступ к одним и тем же структурам, поэтому они не должны использоваться одновременно.

Конфигурация по умолчанию / для отката, хранящаяся в /usr/lib/firewalld

Данная директория содержит конфигурацию по умолчанию и для отката, обеспечиваемую FirewallD для типов ICMP, служб и зон. Файлы, предоставляемые пакетом FirewallD, не должны изменяться, изменения производятся при обновлении пакета FirewallD. Дополнительные типы ICMP, службы и зоны могут быть предоставлены соответствующими пакетами или созданием соответствующих файлов.

Системные параметры конфигурации, хранящиеся в /etc/firewalld

Системная или пользовательская конфигурация, хранящаяся здесь, создаётся как системным администратором, так и в ходе пользовательской настройки посредством конфигурационного интерфейса FirewallD, а также "вручную". Эти конфигурационные файлы будут преобладать над файлами конфигурации по умолчанию.

Для того чтобы "вручную" изменить установки предопределённых типов ICMP, зон или служб, необходимо скопировать файлы из директории конфигурации по умолчанию в соответствующий каталог в системной конфигурационной директории и соответственно их изменить.

Невозможно таким образом подменить параметры неизменяемых зон, так как их нельзя изменить. Если производится возврат к параметрам по умолчанию для зоны, имеющей файлы параметров по умолчанию / для отката, то файл в директории /etc/firewalld будет переименован в <file>.old и произойдёт откат.

Реализуемый в настоящее время функционал

Развитый язык

Данная функция привносит возможность применения высокоуровневого языка для создания и использования более сложных правил межсетевого экрана в сетях IPv4 и IPv6 без специального знания синтаксиса iptables.

В Fedora 19 реализован второй этап разработки развитого языка, поддерживающий интерфейс D-Bus и параметрирование из командной строки. Третий этап разработки обеспечит поддержку языка в графической конфигурационной утилите firewall-config.

Дополнительную информацию можно получить на соответствующей странице: развитый язык FirewallD (firewalld Rich Language)

Блокировка изменения конфигурации

Данная функция добавляет простую опцию, для того чтобы FirewallD мог заблокировать изменение своей конфигурации локальными приложениями или службами. Это очень лёгкая версия политик приложений.

В Fedora 19 реализован второй этап разработки блокировки, поддерживающий интерфейс D-Bus и параметрирование из командной строки. Третий этап разработки обеспечит поддержку блокировки в графической конфигурационной утилите firewall-config.

Дополнительную информацию можно получить на соответствующей странице: блокировка изменения конфигурации FirewallD (firewalld Lockdown)

Постоянные прямые правила

Реализация данной функции находится на ранней стадии разработки. Она привнесёт возможность сохранить на постоянно прямые правила и цепочки. Дополнительную информацию можно получить в разделе Прямые опции.

Уход от служб ip*tables и ebtables

Реализация данной функции находится на ранней стадии разработки. Она имеет целью создание сценария преобразования, который будет создавать постоянные прямые правила на основе конфигураций iptables, ip6tables и ebtables (насколько это возможно). Ограничением здесь может стать сложность интеграции получаемых правил в имеющиеся цепочки, обеспечиваемые FirewallD.

Уход от ip*tables и ebtables требует много тестов на системах со сложными конфигурациями FirewallD.

Запланированный и предлагаемый к реализации функционал

Абстрактная модель межсетевого экрана

Добавление слоя абстракции поверх правил межсетевых экранов ip*tables и ebtables делает создание правил простым и более интуитивным. Слой абстракции должен быть одновременно функциональным и простым, что делает его создание нелёгкой задачей. Для этого должен быть придуман специальный язык межсетевого экрана. Правила межсетевого экрана имеют фиксированную позицию, а также возможно осуществление запроса общей информацию о состоянии доступа, политиках доступа для портов и других функциях брандмауэра.

Поддержка трассировщика

Трассировщик необходим, чтобы было возможно ограничить установленные соединения для отключённого функционала. В некоторых ситуациях ограничивать соединение не стоит: например, в случае включения службы межсетевого экрана на ограниченное время, для того чтобы установить постоянное внешнее соединение.

Режим взаимодействия с пользователем

Это специальный режим брандмауэра, включаемый пользователем или администратором. Все запросы приложений, пытающиеся изменить состояние межсетевого экрана, направляются пользователю, чтобы уведомить его и получить ответ с разрешением или запрещением запроса. Возможно задать промежуток времени для разрешения соединения и его ограничения для узлов, сетей или других соединений. Этот сценарий может быть сохранён для повторения такого же поведения в будущем уже без уведомления.

Дополнительная функция этого режима — предоставление пользователю попыток осуществить прямое внешнее соединение на уровне выбранных заранее служб или портов на тех же условиях, что и у приложений. Ограничение на уровне служб и портов также ограничит число запросов, отправляемых пользователю.

Поддержка пользовательской политики

Администратор может определить, кому разрешено использовать режим взаимодействия с пользователем, а также может ограничить функции межсетевого экрана, доступные в данном режиме.

Информация о мета-данных портов (предложено Леннартом Поттерингом)

Неплохо было бы иметь информацию о мета-данных портов. Текущая модель со статическим назначением портов и протоколов, исходя из /etc/services,— не очень хорошее решение, она не соответствует современным потребностям. Порты для приложений или служб являются динамическими, поэтому порты сами по себе недостаточны при использовании.

Информация о мета-данных могла бы использоваться для формирования простых правил для межсетевого экрана. Вот несколько примеров:

 разрешение внешнего доступа к приложениям или службам, предоставляющим общий доступ к файлам
 разрешение внешнего доступа к приложениям или службам, предоставляющим общий доступ к музыке
 разрешение внешнего доступа к приложениям или службам, предоставляющим общий доступ к любому контенту
 разрешение внешнего доступа к приложениям или службам, предоставляющий общий доступ к файлам посредством протокола torrent
 разрешение внешнего доступа к службами, обеспечивающим работу http

Информация о мета-данных может быть не только специфичной для приложений, но также и для целых категорий применений. Например, группа доступа к любому контенту или группа доступа к файлам могут соответствовать приложениям, предоставляющим общий доступ к файлам или любому другому контенту, например, посредством протокола torrent. Это только примеры, поэтому, возможно, они окажутся бесполезными.

В среде брандмауэра есть два возможных варианта получения информации о метаданных:

Первый вариант — добавить необходимый функционал во вспомогательные модули (пространство ядра). Этот путь имеет преимущество — он может использоваться отовсюду; но также он имеет и ограничение. Для того чтобы получить какую-либо относящуюся к пользователю или системе информацию, соответствующий функционал должен быть также перенесён в пространство ядра.

Второй вариант — добавить такую возможность в демон межсетевого экрана в виде абстрактных правил. Они могут использоваться совместно с такой информацией как уровень доверия сетевых соединений, решение пользователя о предоставлении общего доступа другим пользователям/узлам или однозначное запрещение администратором общего доступа к любому контенту.

Второе решение имеет следующее преимущество: новые группы метаданных или изменения в отношении к уровням доверия, пользовательских настройках или правилах администратора не потребуют обновления ядра. Добавление такого рода абстрактных правил в демон межсетевого экрана сделает его более гибким. Станет простым добавление в том числе и новых уровней безопасности без обновления ядра.

sysctld

В данный момент возможно появление установок sysctl, которые применяются некорректно. Такое случается, если модуль, обеспечивающий установку, не подгружается в момент загрузки системы, когда запускается rc.sysinit, или если модуль подгружается во время выполнения. Другим примером является net.ipv4.ip_forward, который необходим, например, для обеспечения специфичных установок брандмауэра, libvirt, а также изменения пользовательских/административных настроек. Если есть два приложения или демона, включающих перенаправление IP только в случае необходимости, то может случиться так, что одно/один из них отключит перенаправление, не будучи уведомлённым о том, что оставшемуся приложению/демону оно всё ещё требуется включённым.

Демон sysctl мог бы решить эту проблему ведением внутреннего счётчика для установок, что сделает возможным их отключение или возврат к предыдущему состоянию, если процесс, выполнивший запрос, требует осуществить возврат.

Правила межсетевого экрана

Брандмауэры, основанные на netfilter, всегда восприимчивы к проблемам порядка размещения правил, так как правило не имеет фиксированной позиции в цепочке. Позиция может изменяться, если добавляются или удаляются другие правила, предшествующие в очереди раньше по цепочке.

В статической модели межсетевого экрана изменение в установках брандмауэра влечёт за собой пересоздание "чистой" и "правильной" конфигурации, ограниченной функциональностью, поддерживаемой утилитами system-config-firewall (s-c-fw) / lokkit. Правила, создаваемые другими приложениями, не интегрируются, и s-c-fw / lokkit ничего о них не знают, если функции этих правил не используются.

Динамическая модель предусматривает дополнительные цепочки. Они вызываются в определённом порядке, и правила, добавляемые в цепочку, не могут приводить к порче или потере другие правил, вызванных ранее. Это делает конфигурацию брандмауэра более "здоровой".

Вот примеры правил, создаваемых демоном, в виде таблицы фильтрации для ssh, ipp-client и mdns, включённых в зоне "Общественное место"; остальные зоны удалены для упрощения и сокращения вывода:

 *filter
 :INPUT ACCEPT [0:0]
 :FORWARD ACCEPT [0:0]
 :OUTPUT ACCEPT [0:0]
 :FORWARD_ZONES - [0:0]
 :FORWARD_direct - [0:0]
 :INPUT_ZONES - [0:0]
 :INPUT_direct - [0:0]
 :IN_ZONE_public - [0:0]
 :IN_ZONE_public_allow - [0:0]
 :IN_ZONE_public_deny - [0:0]
 :OUTPUT_direct - [0:0]
 -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 -A INPUT -i lo -j ACCEPT
 -A INPUT -j INPUT_direct
 -A INPUT -j INPUT_ZONES
 -A INPUT -p icmp -j ACCEPT
 -A INPUT -j REJECT --reject-with icmp-host-prohibited
 -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
 -A FORWARD -i lo -j ACCEPT
 -A FORWARD -j FORWARD_direct
 -A FORWARD -j FORWARD_ZONES
 -A FORWARD -p icmp -j ACCEPT
 -A FORWARD -j REJECT --reject-with icmp-host-prohibited
 -A OUTPUT -j OUTPUT_direct
 -A IN_ZONE_public -j IN_ZONE_public_deny
 -A IN_ZONE_public -j IN_ZONE_public_allow
 -A IN_ZONE_public_allow -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
 -A IN_ZONE_public_allow -d 224.0.0.251/32 -p udp -m udp --dport 5353 -m conntrack --ctstate NEW -j ACCEPT
 -A IN_ZONE_public_allow -p udp -m udp --dport 631 -m conntrack --ctstate NEW -j ACCEPT

Использована модель "запретить/разрешить", что способствует удалению конфликтов между правилами в поведении межсетевого экрана. Например, блоки ICMP описываются в цепочке IN_ZONE_public_deny, если выбрана зона "Общественное место"; правила, описывающие их поведение, будут применены перед правилами в цепочке IN_ZONE_public_allow chain.

Такая модель позволяет намного легче добавлять или удалять правила из какого-либо блока без порчи или потери правил из другого блока.