firewalld – это программа для управления политиками брандмауэра, доступная в CentOS 8 по умолчанию. Она работает как интерфейс для систем фильтрации пакетов nftables или iptables.
Данный мануал поможет вам настроить firewalld на сервере CentOS 8 и познакомит вас с основами управления брандмауэром с помощью инструмента firewall-cmd.
Требования
Для работы вам понадобится сервер CentOS 8, настроенный по этому мануалу. Войдите в систему как пользователь sudo и приступайте к работе.
Базовые понятия firewalld
Прежде чем начать работу с утилитой firewall-cmd, давайте ознакомимся с основными понятиями брандмауэра.
Зоны
Демон firewalld управляет группами правил, используя зоны. Зоны – это наборы правил, которые определяют, какой трафик должен быть разрешен, в зависимости от уровня доверия к сети. Для определения поведения, которое должен разрешать брандмауэр, зоне присваиваются сетевые интерфейсы.
Для компьютеров, которые могут часто менять сети (это, например, ноутбуки), такая гибкость позволяет быстро менять правила в зависимости от текущей среды. К примеру, при работе в общедоступной сети Wi-Fi это могут быть строгие правила, запрещающие большую часть трафика, а при подключении к домашней сети ограничения можно смягчить. Для сервера зоны чаще всего не имеют большого значения, поскольку сетевое окружение серверов меняется редко (если вообще меняется).
Независимо от того, насколько динамична ваша сетевая среда, все же будет полезно ознакомиться с общей идеей стандартных зон firewalld. Вот список предопределенных зон firewalld (в порядке от самой строгой):
- drop: самый низкий уровень доверия. Все входящие соединения сбрасываются без ответа, возможны только исходящие соединения.
- block: похож на drop, но входящие запросы не сбрасываются, а отклоняются сообщением icmp-host-prohibited или icmp6-adm-prohibited .
- public: представляет публичные ненадежные сети. При этом брандмауэр не доверяет другим компьютерам, но может разрешать отдельные входящие подключения в зависимости от случая.
- external: представляет внешние сети, если вы используете брандмауэр в качестве шлюза. Она поддерживает маскарадинг NAT, поэтому ваша внутренняя сеть остается частной, но доступной.
- internal: обратная сторона зоны external, используемая для внутренней части шлюза. Машинам этой зоны можно доверять, доступны некоторые дополнительные сервисы.
- dmz: используется для компьютеров, расположенных в DMZ (это изолированные компьютеры, которые не будут иметь доступа к остальной части вашей сети). Поддерживаются только определенные входящие соединения.
- work: используется для рабочих машин. Считает, что большинству компьютеров в сети можно доверять, поддерживает несколько сервисов.
- home: домашняя среда. Как правило, эта зона подразумевает, что вы доверяете большинству других компьютеров и что можно принимать несколько сервисов.
- trusted: самая доверительная зона, которую следует использовать очень осторожно. Согласно ей, доверять можно всем машинам в сети.
Чтобы использовать брандмауэр, мы можем создавать правила и изменять свойства зон, а также присваивать зонам сетевые интерфейсы, которые наиболее им подходят.
Сохранение правил
В firewalld правила бывают временными (применяются только к текущему набору правил среды выполнения) и постоянными. По умолчанию при добавлении или изменении правила оно сохраняется только в текущей сессии. После перезагрузки сервера или брандмауэра firewalld эти изменения удаляются, остаются только постоянные правила.
Во многих операция firewall-cmd применяется флаг –permanent, который указывает, что изменения должны быть применены к постоянной конфигурации. Кроме того, внесенные изменения можно сохранить в постоянной конфигурации брандмауэра в текущей сессии с помощью команды firewall-cmd –runtime-to-constant.
Такое разделение среды выполнения и постоянной конфигурации позволяет вам безопасно протестировать правила в активном брандмауэре, а затем сбросить их при перезагрузке, если возникнут проблемы.
Установка и включение брандмауэра
Как правило, firewalld установлен по умолчанию на многих дистрибутивах Linux, включая CentOS 8. Если же это не так, установите его вручную:
sudo dnf install firewalld
После установки firewalld вы можете включить сервис и перезагрузить сервер. Имейте в виду, включение сервиса firewalld добавит сервис в автозагрузку. Перед настройкой этого поведения рекомендуем создать правила брандмауэра и проверить их, чтобы избежать потенциальных проблем.
sudo systemctl enable firewalld
sudo systemctl start firewalld
После перезапуска сервера ваш брандмауэр запустится автоматически, а сетевые интерфейсы будут распределены между настроенными зонами.
Убедитесь, что сервис запущен и работает:
sudo firewall-cmd --state
running
Правила брандмауэра по умолчанию
Прежде ем начать менять правила, давайте ознакомимся со стандартным набором правил firewalld.
Просмотр правил по умолчанию
Чтобы узнать, какая зона используется по умолчанию, введите:
firewall-cmd --get-default-zone
public
На данный момент firewalld не получал никаких инструкций относительно других зон, кроме того, к другим зонам не привязан ни один интерфейс, поэтому сейчас зона public является зоной по умолчанию, а также единственной активной зоной.
Чтобы получить список активных зон, введите:
firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
К зоне public привязаны два сетевых интерфейса: eth0 и eth1. Интерфейсы, привязанные к зоне, работают согласно правилам этой зоны.
Чтобы узнать, какие правила использует зона по умолчанию, введите:
sudo firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Итак, теперь вы знаете, что:
- public является зоной по умолчанию и единственной активной зоной.
- К ней привязаны интерфейсы eth0 и eth1.
- Она поддерживает трафик DHCP (присваивание IP-адресов), SSH (удаленное администрирование) и Cockpit (веб-консоль).
Другие зоны брандмауэра
Теперь следует ознакомиться с другими зонами.
Чтобы получить список всех доступных зон, введите:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Чтобы получить конфигурацию конкретной зоны, добавьте в команду –list-all флаг –zone=.
sudo firewall-cmd --zone=home --list-all
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Чтобы вывести все определения зон, добавьте опцию –list-all-zones. Для более удобного просмотра вывод можно передать в пейджер:
sudo firewall-cmd --list-all-zones | less
Настройка зон интерфейсов
Изначально все сетевые интерфейсы привязаны к зоне по умолчанию.
Изменение зоны интерфейса
Чтобы перевести интерфейс в другую зону на одну сессию, используйте опции –zone= и –change-interface=. Почти все команды брандмауэра требуют доступа к sudo.
Например, чтобы перевести eth0 в зону home, нужно ввести:
sudo firewall-cmd --zone=home --change-interface=eth0
success
Примечание: При переводе интерфейса в другую зону нужно учитывать, что это может повлиять на работу некоторых сервисов. К примеру, зона home поддерживает SSH, поэтому соединения этого сервиса не будут сброшены. Но некоторые зоны сбрасывают все соединения, включая SSH, и тогда вы можете случайно заблокировать себе доступ к собственному серверу.
Чтобы убедиться, что интерфейс привязан к новой зоне, введите:
firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1
Настройка зоны по умолчанию
Все ваши интерфейсы могут находиться в одной зоне, но проще все же выбрать удобную зону по умолчанию и использовать ее в конфигурации.
Для этого существует параметр –set-default-zone=. После этого все интерфейсы будут привязаны к этой зоне:
sudo firewall-cmd --set-default-zone=home
success
Создание правил для приложений
Теперь давайте посмотрим, как делать исключения для сервисов, которые должно поддерживать ваше приложение.
Добавление сервиса в зону
Для этого проще всего добавить сервис или порт в зону, которую использует брандмауэр. Просмотрите доступные сервисы с флагом –get-services:
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
Примечание: Больше информации о каждом конкретном сервисе можно найти в файлах .xml в каталоге /usr/lib/firewalld/services. К примеру, сведения о сервисе SSH хранятся в /usr/lib/firewalld/services/ssh.xml и выглядят так:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
Чтобы включить поддержку сервиса в той или иной зоне, используйте опцию –add-service=. Указать целевую зону можно с помощью опции –zone=. По умолчанию эти изменения будут работать в течение одной сессии. Чтобы сохранить изменения и использовать их на постоянной основе, добавьте флаг –permanent.
Например, чтобы запустить веб-сервер для обслуживания трафика HTTP, для начала нужно включить временную поддержку этого трафика в зоне public:
sudo firewall-cmd --zone=public --add-service=http
Если сервис нужно добавить в зону по умолчанию, флаг –zone= можно опустить.
Убедитесь, что операция выполнена успешно:
sudo firewall-cmd --zone=public --list-services
cockpit dhcpv6-client http ssh
Протестируйте работу сервиса и брандмауэра. Если все работает правильно, можно изменить постоянный набор правил и добавить в него правило для поддержки этого сервиса.
sudo firewall-cmd --zone=public --add-service=http --permanent
Также можно использовать флаг –runtime-to-permanent, чтобы сохранить текущие конфигурации в постоянный набор правил:
sudo firewall-cmd --runtime-to-permanent
Этот флаг следует использовать осторожно, потому что он сохранит абсолютно все временные изменения, которые вы внесли в текущей сессии.
Чтобы просмотреть список постоянных правил, введите:
sudo firewall-cmd --zone=public --list-services --permanent
cockpit dhcpv6-client http ssh
Теперь зона public поддерживает HTTP и порт 80 на постоянной основе. Если веб-сервер может обслуживать трафик SSL/TLS, вы также можете добавить сервис https (временно или в набор постоянных правил):
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --add-service=https --permanent
Что делать, если нужный сервис недоступен?
Брандмауэр firewalld по умолчанию включает в себя многие наиболее распространённые сервисы. Однако некоторым приложениям необходимы сервисы, поддержка которых отсутствует в firewalld. В таком случае у вас есть два выхода.
Способ 1: Настройка порта
Проще всего в такой ситуации открыть порт приложения в необходимой зоне брандмауэра. Нужно просто указать порт или диапазон портов и протокол (TCP или UDP).
Допустим, приложение, которое использует порт 5000 и протокол TCP, нужно добавить в зону public. Чтобы включить временную поддержку приложения, используйте параметр –add-port= и укажите протокол tcp или udp.
sudo firewall-cmd --zone=public --add-port=5000/tcp
success
Убедитесь, что операция прошла успешно:
sudo firewall-cmd --zone=public --list-ports
5000/tcp
Также можно указать последовательный диапазон портов, отделив первый и последний порт диапазона с помощью тире. Например, если приложение использует UDP-порты 4990-4999, чтобы добавить их в зону public, нужно ввести:
sudo firewall-cmd --zone=public --add-port=4990-4999/udp
После тестирования можно добавить эти правила в постоянный набор правил брандмауэра.
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
sudo firewall-cmd --zone=public --permanent --list-ports
success
success
5000/tcp 4990-4999/udp
Способ 2: Определение сервиса
Добавлять порты в зоны просто, но если вам нужно добавить много приложений, в результате будет сложно отследить, для чего предназначен тот или иной порт. Чтобы избежать такой ситуации, можно вместо портов определить сервисы.
Сервисы – это наборы портов с определенным именем и описанием. С помощью сервисов проще управлять настройками, но сами по себе они устроены сложнее, чем порты.
Для начала нужно скопировать существующий сценарий из каталога /usr/lib/firewalld/services в каталог /etc/firewalld/services (здесь брандмауэр ищет нестандартные настройки).
Например, можно скопировать определение сервиса SSH и использовать его для определения условного сервиса example. Имя сценария должно совпадать с именем сервиса и иметь расширение .xml.
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
Откорректируйте скопированный файл.
sudo vi /etc/firewalld/services/example.xml
В файле находится определение SSH:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SSH</short>
<description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
<port protocol="tcp" port="22"/>
</service>
Большую часть определения сервиса составляют метаданные. Изменить краткое имя сервиса можно в тегах <short> – это человекочитаемое имя сервиса. Также нужно добавить описание сервиса. Единственное изменение, которое повлияет на работу сервиса – это изменение номера порта и протокола. Вы можете использовать несколько тегов <port/>.
Вернёмся к сервису example; допустим, он требует открыть TCP-порт 7777 и UDP-порт 8888. Определение будет выглядеть так:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Example Service</short>
<description>This is just an example service. It probably shouldn't be used on a real system.</description>
<port protocol="tcp" port="7777"/>
<port protocol="udp" port="8888"/>
</service>
Сохраните и закройте файл.
Перезапустите брандмауэр:
sudo firewall-cmd --reload
Теперь он появится в списке доступных сервисов:
firewall-cmd --get-services
RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server example finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
Создание пользовательских зон
Брандмауэр предоставляет много предопределенных зон, которых в большинстве случаев достаточно для работы. Но в некоторых ситуациях возникает необходимость создать пользовательскую зону.
Например, для веб-сервера можно создать зону publicweb, а для DNS-сервиса – зону privateDNS.
Создавая зону, нужно добавить её в постоянные настройки брандмауэра.
Попробуйте создать зоны publicweb и privateDNS:
sudo firewall-cmd --permanent --new-zone=publicweb
sudo firewall-cmd --permanent --new-zone=privateDNS
Убедитесь, что зоны существуют:
sudo firewall-cmd --permanent --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work
В текущей сессии новые зоны не будут доступны:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Чтобы получить доступ к новым зонам, нужно перезапустить брандмауэр:
sudo firewall-cmd --reload
firewall-cmd --get-zones
block dmz drop external home internal privateDNS public publicweb trusted work
Теперь вы можете присвоить новым зонам требуемые сервисы и порты. Обычно рекомендуется настраивать брандмауэр в среде выполнения и затем сохранить эти изменения в постоянной конфигурации после тестирования. К примеру, в зону publicweb можно добавить SSH, HTTP и HTTPS.
sudo firewall-cmd --zone=publicweb --add-service=ssh
sudo firewall-cmd --zone=publicweb --add-service=http
sudo firewall-cmd --zone=publicweb --add-service=https
sudo firewall-cmd --zone=publicweb --list-all
publicweb
target: default
icmp-block-inversion: no
interfaces:
sources:
services: http https ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
В зону privateDNS можно добавить сервис DNS:
sudo firewall-cmd --zone=privateDNS --add-service=dns
sudo firewall-cmd --zone=privateDNS --list-all
privateDNS
target: default
icmp-block-inversion: no
interfaces:
sources:
services: dns
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Затем можно привязать сетевые интерфейсы к новым зонам:
sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1
Теперь можно протестировать настройку. Если всё работает правильно, вы можете добавить эти правила в постоянные настройки. Вы можете снова запустить все команды с флагом –permanent, но в данной ситуации мы используем флаг –runtime-to-permanent, чтобы сохранить все внесенные изменения за раз.
sudo firewall-cmd --runtime-to-permanent
Перезапустите брандмауэр, чтобы убедиться, что ваши новые зоны остались:
sudo firewall-cmd --reload
Проверьте зоны:
firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0
Убедитесь, что в зонах работают нужные сервисы:
sudo firewall-cmd --zone=publicweb --list-services
http https ssh
sudo firewall-cmd --zone=privateDNS --list-services
dns
Пользовательские зоны полностью готовы к работе. Вы можете сделать любую из них зоной по умолчанию с помощью этой команды:
sudo firewall-cmd --set-default-zone=publicweb
Заключение
Теперь вы знаете, как работает firewalld, знакомы с основными понятиями брандмауэра, умеете создавать пользовательские зоны и добавлять сервисы.
Брандмауэр firewalld позволяет настраивать гибкие наборы правил, которые учитывают вашу сетевую среду. Благодаря этому вы можете беспрепятственно переходить между различными политиками брандмауэра посредством использования зон. Практические навыки работы с этой системой позволят вам воспользоваться гибкостью и мощью этого инструмента.
Много полезного вы найдете в официальной документации firewalld.