Firewalld – это полноценный брандмауэр, доступный в CentOS 7 по умолчанию. Данное руководство поможет настроить брандмауэр на сервере, а также ознакомит вас с инструментом firewall-cmd.
Читайте также: Переход с FirewallD на IPTables в CentOS 7
Базовые понятия брандмауэра
Зоны
Демон firewalld управляет группами правил при помощи так называемых зон.
Зоны – это, по сути, наборы правил, которые управляют трафиком на основе уровня доверия к той или иной сети. Зоны присваиваются сетевым интерфейсам и управляют поведением брандмауэра.
Компьютеры, которые часто подключаются к разным сетям (например, ноутбуки) могут использовать зоны, чтобы изменять наборы правил в зависимости от среды. К примеру, при подключении к общественной сети WiFi брандмауэр может применять более строгие правила, а в домашней сети ослаблять ограничения.
В firewalld существуют следующие зоны:
- drop: самый низкий уровень доверия сети. Весь входящий трафик сбрасывается без ответа, поддерживаются только исходящие соединения.
- block: эта зона похожа на предыдущую, но при этом входящие запросы сбрасываются с сообщением icmp-host-prohibited или icmp6-adm-prohibited.
- public: эта зона представляет публичную сеть, которой нельзя доверять, однако поддерживает входящие соединения в индивидуальном порядке.
- external: зона внешних сетей. Поддерживает маскировку NAT, благодаря чему внутренняя сеть остается закрытой, но с возможностью получения доступа.
- internal: обратная сторона зоны external, внутренние сети. Компьютерам в этой зоне можно доверять. Доступны дополнительные сервисы.
- dmz: используется для компьютеров, расположенных в DMZ (изолированных компьютеров, которые не будут иметь доступа к остальной части сети); поддерживает только некоторые входящие соединения.
- work: зона рабочей сети. Большинству машин в сети можно доверять. Доступны дополнительные сервисы.
- home: зона домашней сети. Окружению можно доверять, но поддерживаются только определённые пользователем входящие соединения.
- trusted: всем машинам в сети можно доверять.
Сохранение правил
Правила firewalld бывают постоянными и временными. Если в наборе появляется или изменяется какое-либо правило, текущее поведение брандмауэра изменяется сразу. Однако после перезагрузки все изменения будут утрачены, если их не сохранить.
Большинство команд firewall-cmd может использовать флаг –permanent, который сохранит правило, после чего оно будет использоваться на постоянной основе.
Включение брандмауэра firewalld
Для начала нужно включить демон. Unit-файл systemd называется firewalld.service. Чтобы запустить демон, введите.
sudo systemctl start firewalld.service
Убедитесь, что сервис запущен:
firewall-cmd --state
running
Теперь брандмауэр запущен и работает согласно конфигурации по умолчанию.
На данный момент сервис включен, но не будет запускаться автоматически вместе с сервером. Чтобы случайно не заблокировать себя на собственном сервере, сначала создайте набор правил, а затем настройте автозапуск.
Правила брандмауэра по умолчанию
Просмотр правил по умолчанию
Чтобы узнать, какая зона используется по умолчанию, введите:
firewall-cmd --get-default-zone
public
На данный момент firewalld не получал никаких инструкций относительно других зон, кроме того, к другим зонам не привязан ни один интерфейс, поэтому сейчас зона public является зоной по умолчанию, а также единственной активной зоной.
Чтобы получить список активных зон, введите:
firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
К зоне public привязаны два сетевых интерфейса: eth0 и eth1. Интерфейсы, привязанные к зоне, работают согласно правилам этой зоны.
Чтобы узнать, какие правила использует зона по умолчанию, введите:
firewall-cmd --list-all
public (default, active)
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Итак, теперь вы знаете, что:
- public является зоной по умолчанию и единственной активной зоной.
- К ней привязаны интерфейсы eth0 и eth1.
- Она поддерживает трафик DHCP (присваивание IP-адресов) и SSH (удаленное администрирование).
Другие зоны брандмауэра
Теперь следует ознакомиться с другими зонами.
Чтобы получить список всех доступных зон, введите:
firewall-cmd --get-zones
block dmz drop external home internal public trusted work
Чтобы получить параметры конкретной зоны, добавьте в команду флаг –zone=.
firewall-cmd --zone=home --list-all
home
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Чтобы вывести определения всех доступных зон, добавьте опцию –list-all-zones. Для более удобного просмотра вывод можно передать в пейджер:
firewall-cmd --list-all-zones | less
Настройка зон интерфейсов
Изначально все сетевые интерфейсы привязаны к зоне по умолчанию.
Изменение зоны интерфейса на одну сессию
Чтобы перевести интерфейс в другую зону на одну сессию, используйте опции –zone= и –change-interface=.
Например, чтобы перевести 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
После перезагрузки брандмауэра интерфейс будет снова привязан к зоне по умолчанию.
sudo systemctl restart firewalld.service
firewall-cmd --get-active-zones
public
interfaces: eth0 eth1
Изменение зоны интерфейса на постоянной основе
Если в настройках интерфейса не указана никакая другая зона, после перезапуска брандмауэра интерфейс будет снова привязан к зоне по умолчанию. В CentOS такие конфигурации хранятся в каталоге /etc/sysconfig/network-scripts, в файлах формата ifcfg-interface.
Чтобы определить зону интерфейса, откройте конфигурационный файл этого интерфейса, например:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
В конец файла добавьте переменную ZONE= и в качестве значения укажите другую зону, например, home:
. . .
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=home
Сохраните и закройте файл.
Чтобы обновить настройки, перезапустите сетевой сервис и брандмауэр:
sudo systemctl restart network.service
sudo systemctl restart firewalld.service
После перезапуска интерфейс eth0 будет привязан к зоне home.
firewall-cmd --get-active-zones
home
interfaces: eth0
public
interfaces: eth1
Настройка зоны по умолчанию
Также вы можете выбрать другую зону по умолчанию.
Для этого используется параметр –set-default-zone=. После этого все интерфейсы будут привязаны к другой зоне:
sudo firewall-cmd --set-default-zone=home
home
interfaces: eth0 eth1
Создание правил для приложений
Добавление сервиса в зону
Проще всего добавить сервис или порт в зону, которую использует брандмауэр. Просмотрите доступные сервисы:
firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec 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 samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
Примечание: Больше информации о каждом конкретном сервисе можно найти в файлах .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= можно опустить.
Убедитесь, что операция выполнена успешно:
firewall-cmd --zone=public --list-services
dhcpv6-client http ssh
Протестируйте работу сервиса и брандмауэра. Если все работает правильно, можно изменить постоянный набор правил и добавить в него правило для поддержки этого сервиса.
sudo firewall-cmd --zone=public --permanent --add-service=http
Чтобы просмотреть список постоянных правил, введите:
sudo firewall-cmd --zone=public --permanent --list-services
dhcpv6-client http ssh
Теперь зона public поддерживает HTTP и порт 80 на постоянной основе. Если веб-сервер может обслуживать трафик SSL/TLS, вы также можете добавить сервис https (для одной сессии или в набор постоянных правил):
sudo firewall-cmd --zone=public --add-service=https
sudo firewall-cmd --zone=public --permanent --add-service=https
Что делать, если нужный сервис недоступен?
Брандмауэр firewalld по умолчанию включает в себя многие наиболее распространённые сервисы. Однако некоторым приложениям необходимы сервисы, поддержка которых отсутствует в firewalld. В таком случае вы можете поступить двумя способами.
Способ 1: Настройка порта
Проще всего в такой ситуации открыть порт приложения в необходимой зоне брандмауэра. Нужно просто указать порт или диапазон портов и протокол.
Например, приложение, которое использует порт 5000 и протокол TCP, нужно добавить в зону public. Чтобы включить поддержку приложения на дну сессию, используйте параметр –add-port= и укажите протокол tcp или udp.
sudo firewall-cmd --zone=public --add-port=5000/tcp
Убедитесь, что операция прошла успешно:
firewall-cmd --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
4990-4999/udp 5000/tcp
Способ 2: Определение сервиса
Добавлять порты в зоны просто, но если у вас много таких приложений, в результате будет сложно отследить, для чего предназначен тот или иной порт. Чтобы избежать такой ситуации, можно вместо портов определить сервисы.
Сервисы – это просто наборы портов с определенным именем и описанием. С помощью сервисов проще управлять настройками, но сами по себе они сложнее, чем порты.
Для начала нужно скопировать существующий сценарий из каталога /usr/lib/firewalld/services в каталог /etc/firewalld/services (здесь брандмауэр ищет нестандартные настройки).
Например, можно скопировать определение сервиса SSH и использовать его для определения условного сервиса example. Имя сценария должно совпадать с именем сервиса и иметь расширение .xml.
sudo cp /usr/lib/firewalld/services/service.xml /etc/firewalld/services/example.xml
Откорректируйте скопированный файл.
sudo nano /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>. Это человекочитаемое имя сервиса. Также нужно добавить описание сервиса. Единственное изменение, которое повлияет на работу сервиса – это изменение номера порта и протокола.
Вернёмся к сервису 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 bacula bacula-client dhcp dhcpv6 dhcpv6-client dns example ftp high-availability http https imaps ipp ipp-client ipsec 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 samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
Создание зон
Брандмауэр предоставляет много предопределенных зон, которых в большинстве случаев достаточно для работы. Но в некоторых ситуациях возникает необходимость создать пользовательскую зону.
Например, для веб-сервера можно создать зону 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
firewall-cmd --zone=publicweb --list-all
publicweb
interfaces:
sources:
services: http https ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
В зону privateDNS можно добавить DNS:
sudo firewall-cmd --zone=privateDNS --add-service=dns
firewall-cmd --zone=privateDNS --list-all
privateDNS
interfaces:
sources:
services: dns
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Затем можно привязать сетевые интерфейсы к новым зонам:
sudo firewall-cmd --zone=publicweb --change-interface=eth0
sudo firewall-cmd --zone=privateDNS --change-interface=eth1
Теперь можно протестировать настройку. Если всё работает правильно, вы можете добавить эти правила в постоянные настройки.
sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
sudo firewall-cmd --zone=publicweb --permanent --add-service=http
sudo firewall-cmd --zone=publicweb --permanent --add-service=https
sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns
После этого можно настроить сетевые интерфейсы для автоматического подключения к правильной зоне.
К примеру, eth0 будет привязан к publicweb:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth0
. . .
IPV6_AUTOCONF=no
DNS1=2001:4860:4860::8844
DNS2=2001:4860:4860::8888
DNS3=8.8.8.8
ZONE=publicweb
А интерфейс eth1 будет привязан к privateDNS:
sudo nano /etc/sysconfig/network-scripts/ifcfg-eth1
. . .
NETMASK=255.255.0.0
DEFROUTE='no'
NM_CONTROLLED='yes'
ZONE=privateDNS
Перезапустите сетевые сервисы и брандмауэр:
sudo systemctl restart network
sudo systemctl restart firewalld
Проверьте зоны:
firewall-cmd --get-active-zones
privateDNS
interfaces: eth1
publicweb
interfaces: eth0
Убедитесь, что в зонах работают нужные сервисы:
firewall-cmd --zone=publicweb --list-services
http htpps ssh
firewall-cmd --zone=privateDNS --list-services
dns
Пользовательские зоны полностью готовы к работе. Вы можете сделать любую из них зоной по умолчанию. Например:
sudo firewall-cmd --set-default-zone=publicweb
Автоматический запуск брандмауэра
Теперь, когда вы проверили все настройки и убедились, что все правила работают должным образом, вы можете настроить автозапуск брандмауэра.
Для этого введите:
sudo systemctl enable firewalld
Теперь брандмауэр будет запускаться вместе с сервером.
Заключение
Брандмауэр firewalld – очень гибкий инструмент. Зоны позволяют быстро изменять политику брандмауэра.
Теперь вы знаете, как работает firewalld, знакомы с основными понятиями брандмауэра, умеете создавать пользовательские зоны и добавлять сервисы.