Firewalld — решение для управления брандмауэром, доступное во многих дистрибутивах Linux, которое работает как интерфейс для системы фильтрации пакетов iptables, предоставляемой ядром Linux. В данном руководстве мы рассмотрим установку и настройку брандмауэра при помощи административного инструмента firewall-cmd.
Зоны и службы Firewalld
Прежде всего важно понять концепцию зон. Зоны используются для определения уровня доверия к сетевым соединениям за счет разделения входящего трафика по его уникальным характеристикам. Таким образом, к различным зонам можно применять различные правила. Для зоны указываются активные опции брандмауэра в виде предварительно определенных служб, портов и протоколов, маскарадинга/перенаправления портов и rich rules.
Firewalld фильтрует входящий трафик по различным зонам в зависимости от конкретных правил, применяемых к каждой зоне. При определении зоны для входящего соединения будет применяться следующая логика. Если IP-адрес отправителя соответствует определенным для зоны значениям, то пакет будет направляться через эту зону. Если этот адрес не соответствует ни одной зоне, то проверяется соответствие входящего интерфейса пакета фильтру зоны, и в случае такого соответствия используется эта зона. Во всех остальных случаях используется зона по умолчанию, изначально заданная как public. Для нее предполагается, что вы не доверяете другим компьютерам в сети и разрешаете работу только ограниченного числа служб.
В firewalld есть ряд зон с предварительно настроенными разрешениями для различных служб. Вы можете изменять эти настройки или создавать собственные зоны. В порядке от наименее доверенных к наиболее доверенным эти зоны следующие:
drop — минимальный уровень доверия. Все входящие соединения блокируются без ответа, допускаются только исходящие соединения.
block — аналогично предыдущему, но при отклонении входящих запросов отправляется сообщение icmp-host-prohibited или icmp6-adm-prohibited.
public — представляет общественные, недоверенные сети. Вы не доверяете другим компьютерам, но можете разрешать избранные входящие соединения в индивидуальном порядке.
external — внешние сети при использовании брандмауэра в качестве шлюза. Она настроена для маскирования NAT, поэтому ваша внутренняя сеть остается частной, но доступной.
internal — внутренняя сторона шлюза. Компьютеры обладают достаточным уровнем доверия, доступен ряд дополнительных служб.
dmz — используется для компьютеров, расположенных в DMZ («демилитаризованная зона», изолированные компьютеры без доступа к остальной сети). Разрешены только определенные входящие соединения.
work — используется для рабочих машин. Доверять большинству компьютеров в сети. Может быть разрешено еще несколько служб.
home — домашняя среда. Обычно означает, что вы доверяете большинству других компьютеров и разрешаете работу еще нескольких служб.
trusted — доверять всем машинам в сети. Наиболее открытая из всех доступных опций, должна использоваться с осторожностью.
В зонах могут быть установлены разрешения для пользовательских или предварительно заданных служб. Конфигурация предварительно заданных служб находится в директории /usr/lib/firewalld/services. Например, вот содержимое файла /usr/lib/firewalld/services/kerberos.
$ cat kerberos.xml
Можно создавать свои службы для использования в firewalld, создавая файл аналогичного формата в директории /usr/lib/firewalld/services, имя файла также должно заканчиваться на .xml. После создания пользовательских файлов в этой директории нужно запустить команду restorecon для применения подходящих контекстов SELinux.
Управление Firewalld
В Centos 7 firewalld установлен по умолчанию, если же его нет, то можно установить следующей командой:
$ yum install firewalld
После установки нужно включить службу
$ systemctl start firewalld
Добавляем в автозагрузку
$ systemctl enable firewalld
После запуска сервиса брандмауэр должен заработать, ваши сетевые интерфейсы распределятся по настроенным зонам (или попадут в зону по умолчанию), и к ним будут применяться соответствующие правила.
Проверить работу и доступность службы можно командой
$ sudo firewall-cmd --state
Этот результат показывает, что брандмауэр работает с конфигурацией по умолчанию.
При настройке конфигурации firewalld командой firewall-cmd можно указать опцию —permanent для изменения постоянных файлов конфигурации, записанных на диске. Если запускать команду без этой опции, изменится только текущая конфигурация, и при перезапуске все изменения будут потеряны. Если вы внесли изменения в текущую конфигурацию, можно сохранить их в постоянную при помощи команды
sudo firewall-cmd --runtime-to-permanent
При внесении изменений в постоянную конфигурацию они не будут применены, пока вы не выполните
firewall-cmd --reload
Изменения можно сделать временными при помощи опции —timeout, в которой мы можем указать время действия правила в секундах, по истечении которого оно будет удалено.
Это очень полезно при удаленном управлении системой: вы не сможете постоянно заблокировать себе доступ из-за ошибки в правиле, так как по истечении указанного времени изменение будет отменено. Опции —timeout и —permanent нельзя использовать одновременно.
Далее мы рассмотрим ряд других распространенных и полезных опций команды firewall-cmd. Если не указывать зону при изменении конфигурации, будет использоваться зона по умолчанию. Зону можно указать при помощи опции —zone=ИМЯ_ЗОНЫ
—get-default-zone — вывод зоны, установленной в качестве зоны по умолчанию, изначально это зона public.
$ firewall-cmd --get-default-zone
—new-zone=ИМЯ_ЗОНЫ — создание новой пользовательской зоны, требуется опция —permanent.
$ firewall-cmd --permanent --new-zone=testing success
—set-default-zone — изменение зоны по умолчанию public на любую желаемую зону. Данная зона по умолчанию будет использоваться на всех интерфейсах, если не указано иное.
$ firewall-cmd --permanent --set-default-zone=testing
—get-zones — вывод списка всех доступных зон.
$ firewall-cmd --get-zones
—list-all-zones выводит более подробную информацию о каждой зоне, для примера приведем результат для одной из них.
$ firewall-cmd --list-all-zones
—get-active-zones выводит только те зоны, которые в данный момент используются и связаны с каким-либо интерфейсом.
$ firewall-cmd --get-active-zones
—get-services позволяет получить список предварительно заданных служб, которые можно использовать в правилах брандмауэра. Эти службы привязаны к портам.
$ firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https
—list-services используется для получения списка служб, разрешенных для зоны. Ниже приведен заданный по умолчанию список для зоны public.
$ firewall-cmd --list-services dhcpv6-client dns http https ssh
—add-service применяется для добавления служб в указанной зоне, в данном примере мы добавим предварительно заданную службу kerberos в зону public.
$ firewall-cmd --add-service=kerberos success
$ firewall-cmd --list-services dhcpv6-client dns http https kerberos ssh
—remove-service выполняет обратную процедуру и прекращает доступ службы в зону.
$ firewall-cmd --remove-service=kerberos success $ firewall-cmd --list-services dhcpv6-client dns http https ssh
—add-source=IP-адрес — добавить в зону IP-адрес или диапазон адресов. Это означает, что если адрес источника входящего трафика будет соответствовать диапазону, то к этому трафику будет применяться установленная зона. В данном случае мы установим соответствие зоны testing и трафика с диапазона 10.10.10.0/24.
$ firewall-cmd --permanent --zone=testing --add-source=10.10.10.0/24 success --list-sources -- вывод списка адресов источников для зоны $ firewall-cmd --permanent --zone=testing --list-sources 10.10.10.0/24
—remove-source=IP-адрес — удаление IP-адреса или диапазона адресов, ранее добавленных для зоны.
$ firewall-cmd --permanent --zone=testing --remove-source=10.10.10.0/24 success
Для одной зоны можно указывать в качестве источника несколько IP-адресов или диапазонов.
—add-port=ПОРТ/ПРОТОКОЛ — добавить в зону TCP или UDP порт. Принцип действия аналогичен —add-source.
$ firewall-cmd --add-port=9000/tcp success
—list-ports — вывод списка портов, разрешенных для указанной зоны. Мы только что добавили TCP-порт 9000 в зоне по умолчанию и видим его в списке.
$ firewall-cmd --list-ports 9000/tcp
—remove-port удаляет порты, ранее добавленные —add-port.
Более подробную информацию об этих и других опциях можно получить на соответствующей странице руководства. В ее конце есть несколько примеров.
man 1 firewall-cmd
В следующем примере создается новая зона ‘test’, применяемая к трафику с диапазона 192.168.1.0/24. После чего мы разрешаем для зоны службу ssh и TCP-порт 9000.
$ firewall-cmd --permanent --new-zone=test success $ firewall-cmd --permanent --zone=test --add-source=192.168.1.0/24 success $ firewall-cmd --permanent --zone=test --add-service=ssh success $ firewall-cmd --permanent --add-port=9000/tcp --zone=test success $ firewall-cmd --reload success
Так как все изменения вносились с опцией —permanent, требуется перезапуск текущей конфигурации.
Судя по имени службы ssh, в данном случае разрешается входящее подключение к TCP-порту 22, но мы можем удостовериться в этом, проверив файл конфигурации службы.
$ cat /usr/lib/firewalld/services/ssh.xml
Также можно просмотреть информацию о зоне test и увидеть, какие изменения мы внесли.
$ firewall-cmd --list-all --zone=test
Диапазон адресов источника 192.168.1.0/24, разрешены входящие подключения для службы ssh и TCP-порта 9000.
Рассмотренные правила достаточно просты. Далее мы познакомимся с rich rules, которые обеспечивают гораздо большую гибкость.
Rich rules в firewalld
Rich rules предоставляют гораздо больший уровень контроля, благодаря более тонким настройкам. Также их можно использовать для настройки ведения лога, маскарадинга, проброс портов и ограничения трафика.
Синтаксис и примеры rich rules подробно описаны в соответствующей странице руководства.
man 5 firewalld.richlanguage
При наличии нескольких rich rules они обрабатываются в определенном порядке. Сначала применяются правила перенаправления портов и маскарадинга. Далее идут правила ведения логов. Потом разрешающие правила, а в самом конце — запрещающие. Для пакета используется первое правило из указанного порядка, которое ему подойдет. если он не соответствует ни одному правилу, то к нему будет применено отклонение по умолчанию.
Рассмотрим наиболее важные опции для работы с rich rules.
—add-rich-rule=’ПРАВИЛО’ — добавить правило, в данном примере мы разрешаем трафик с диапазона 10.0.0.0/24 только в диапазон 192.168.0.10/32 через TCP-порты c 8080 по 8090.
$ firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 destination address=192.168.0.10/32 port port=8080-8090 protocol=tcp accept' success
—list-rich-rules — вывод всех rich rules для указанной зоны. Мы видим только что созданное нами правило.
$ firewall-cmd --permanent --zone=testing --list-rich-rules
—remove-rich-rule — удалить rich rule, синтаксис такой же как у —add-rich-rule.
$ firewall-cmd --permanent --zone=testing --remove-rich-rule='rule family=ipv4 source address=10.0.0.0/24 destination address=192.168.0.10/32 port port=8080-8090 protocol=tcp accept' success
Создадим rich rule, отклоняющее любой трафик с диапазона 192.168.0.10/24.
$ firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.0.10/24 reject' success
Reject выдает ICMP-пакет об отклонении, тогда как drop просто отклоняет трафик без дополнительных действий. Поэтому drop может быть предпочтительнее в плане безопасности, так как ответ об отклонении раскрывает существование системы.
При использовании в rich rules адресов источника или получателя нужно указывать семейство rule family ipv4 или ipv6 в зависимости от используемой адресации.
Rich rules могут использоваться для ограничения трафика. Например, так можно ограничить количество входящих SSH-соединений десятью в минуту:
$ firewall-cmd --permanent --add-rich-rule='rule service name=ssh limit value=10/m accept' success
Также можно применять rich rules для записи сообщений в файл лога. Которое также может быть ограничено. Здесь мы ведем лог SSH-соединений с диапазона адресов 192.168.0.0/24, но количество записей ограничено 50 в минуту. Записываются только сообщения уровня ‘info’ или более важные.
$ firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" limit value="50/m" accept' success
Трансляция сетевых адресов (NAT)
Командой firewall-cmd можно настроить NAT с маскарадингом или пробросом портов. Маскарадинг можно настроить только для IPv4, но не для IPv6.
Настройка маскарадинга в firewalld
Маскарадинг -это подмена ip адреса отправителя(маскарад) на внешний адрес нашего сервера, когда компьютер с неким внутренним ip адресом пытается получить к доступ к ресурсам в интернете. Ответы на эти пакеты также пойдут через наш сервер. И адрес сервера будет подменен на ip отправителя, чтобы трафик отправлялся на узел, который инициировал отправку.
Маскарадинг для зоны можно включить опцией —add-masquerade
$ firewall-cmd --permanent --zone=testing --add-masquerade success
При помощи опции —query-masquerade мы можем убедиться, что маскарадинг успешно включен. В данном случае мы запросим постоянную конфигурацию, так как изменили только ее и еще не выполнили перезапуск.
$ firewall-cmd --permanent --query-masquerade yes
В нашем примере маскарадингу будет подвергаться любой пакет, отправляемый на адреса, указанные в зоне ‘testing’. Для более тонкой настройки можно воспользоваться rich rules.
$ firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 masquerade' success
Здесь маскарадинг выполняется для всего трафика с диапазона адресов 192.168.1.0/24.
проброс портов в firewalld
Как следует из названия, при пробросе портов весь трафик, отправленный на конкретный порт, будет перенаправляться либо на другой порт локальной системы, либо на порт внешней системы. Если требуется проброс на внешнюю сеть, нужно также настроить маскарадинг.
В рассмотренном ниже примере локальная система будет перенаправлять весь трафик, отправленный на порт 22, на TCP-порт 2222 на адрес 10.0.0.10. Правило перенаправления портов будет применяться только для отправителей, указанных в зоне ‘testing’.
$ firewall-cmd --permanent --zone=testing --add-forward-port=port=22:proto=tcp:toport=2222:toaddr=10.0.0.10 success
Убедиться в успешной работе проброса портов можно при помощи опции —query-forward-port.
$ firewall-cmd --permanent --zone=testing --query-forward-port=port=22:proto=tcp:toport=2222:toaddr=10.0.0.10 yes
Целиком вводить запись, которую вы делали при добавлении проброса портов, достаточно неудобно. Лучше воспользоваться опцией —list-all, она покажет все перенаправляемые порты.
$ firewall-cmd --permanent --list-all --zone=testing testing interfaces: sources: services: ports: masquerade: yes forward-ports: port=22:proto=tcp:toport=2222:toaddr=10.0.0.10 icmp-blocks: rich rules: rule family="ipv4" source address="192.168.1.0/24" masquerade
Также эта команда показывает включен или отключен маскарадинг.
Для более тонкой настройки снова можно воспользоваться rich rules. В данном примере мы можем указать конкретный адрес отправителя в зоне testing, а не всю зону.
$ firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 forward-port port=22 protocol=tcp to-port=2222 to-addr=10.0.0.10' success
Также мы можем не использовать параметр to-addr, в этом случае перенаправление портов полностью будет выполняться на локальной системе. Действующие rich rules можно просмотреть, используя опцию —list-rich-rules.
$ firewall-cmd --permanent --zone=testing --list-rich-rules rule family="ipv4" source address="192.168.1.0/24" masquerade rule family="ipv4" source address="192.168.1.0/24" forward-port port="22" protocol="tcp" to-port="2222" to-addr="10.0.0.10"
Заключение
Команда firewall-cmd позволяет нам создавать базовые правила для firewalld, а также rich rules с очень подробными пользовательскими параметрами. Мы также рассмотрели маскарадинг и перенаправление портов для отправки трафика на другие узлы при помощи трансляции сетевых адресов (NAT).
Неосиляторам iptables счастье привалило!