2.5.6.1 Настройка брандмауэра Firewall
Скачать документ Базовые понятия брандмауэра
Базовые понятия брандмауэра. Зоны
Базовые понятия брандмауэра. Сохранение правил
Включение брандмауэра firewalld
Включение брандмауэра firewalld. Просмотр правил по умолчанию
Включение брандмауэра firewalld. Другие зоны брандмауэра
Настройка зон интерфейсов
Настройка зон интерфейсов. Изменение зоны интерфейса на одну сессию
Настройка зон интерфейсов. Изменение зоны интерфейса на постоянной основе
Настройка зон интерфейсов. Настройка зоны по умолчанию
Создание правил для приложений. Добавление сервиса в зону
Что делать, если нужный сервис недоступен?
Способ 1: Настройка порта
Способ 2: Определение сервиса
Создание зон
Автоматический запуск брандмауэра
Заключение
Базовые понятия брандмауэра
Зоны
Демон 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
Установка firewalld в РЕД ОС производится из репозитория командой:
sudo dnf install firewalld
После инсталляции активируйте сервис firewalld.service:
sudo systemctl start firewalld.service
Убедитесь, что сервис запущен:
firewall-cmd --state running
Теперь брандмауэр запущен и работает согласно конфигурации по умолчанию.
На данный момент сервис включен, но не будет запускаться автоматически вместе с сервером. Чтобы случайно не заблокировать себя на собственном сервере, сначала создайте набор правил, а затем настройте автозапуск.
Стоит сделать небольшое замечание по поводу GUI-интерфейса, он очень удобен, но совершенно не гибок в отличие от способа, если бы мы конфигурировали МЭ через консольные команды
Об этом прямо говорит справка при открытии GUI.
Просмотр правил по умолчанию
Чтобы узнать, какая зона используется по умолчанию, введите:
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
Изменение зоны интерфейса на постоянной основе
Если в настройках интерфейса не указана никакая другая зона, после перезапуска брандмауэра интерфейс будет снова привязан к зоне по умолчанию. В РЕД ОС такие конфигурации хранятся в каталоге /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>
Большую часть определения сервиса составляют метаданные. Изменить краткое имя сервиса можно в тегах . Это человекочитаемое имя сервиса. Также нужно добавить описание сервиса. Единственное изменение, которое повлияет на работу сервиса – это изменение номера порта и протокола.
Вернёмся к сервису 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 — очень гибкий инструмент. Зоны позволяют быстро изменять политику брандмауэра.
Дата последнего изменения: 03.09.2024
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.