Базовые понятия брандмауэра Базовые понятия брандмауэра. Зоны Базовые понятия брандмауэра. Сохранение правил Включение брандмауэра firewalld Включение брандмауэра firewalld. Просмотр правил по умолчанию Включение брандмауэра firewalld. Другие зоны брандмауэра Настройка зон интерфейсов Настройка зон интерфейсов. Изменение зоны интерфейса на одну сессию Настройка зон интерфейсов. Изменение зоны интерфейса на постоянной основе Настройка зон интерфейсов. Настройка зоны по умолчанию Создание правил для приложений. Добавление сервиса в зону Что делать, если нужный сервис недоступен? Способ 1: Настройка порта Способ 2: Определение сервиса Создание зон Автоматический запуск брандмауэра Заключение
Окружение
Демон firewalld управляет группами правил при помощи так называемых зон.
Зоны – это, по сути, наборы правил, которые управляют трафиком на основе уровня доверия к той или иной сети. Зоны присваиваются сетевым интерфейсам и управляют поведением брандмауэра.
Компьютеры, которые часто подключаются к разным сетям (например, ноутбуки) могут использовать зоны, чтобы изменять наборы правил в зависимости от среды. К примеру, при подключении к общественной сети Wi-Fi брандмауэр может применять более строгие правила, а в домашней сети ослаблять ограничения.
В firewalld существуют следующие зоны:
drop: самый низкий уровень доверия сети. Весь входящий трафик сбрасывается без ответа, поддерживаются только исходящие соединения.
block: эта зона похожа на предыдущую, но при этом входящие запросы сбрасываются с сообщением icmp-host-prohibited или icmp6-adm-prohibited.
public: эта зона представляет публичную сеть, которой нельзя доверять, однако поддерживает входящие соединения в индивидуальном порядке.
external: зона внешних сетей. Поддерживает маскировку NAT, благодаря чему внутренняя сеть остается закрытой, но с возможностью получения доступа.
internal: обратная сторона зоны external, внутренние сети. Компьютерам в этой зоне можно доверять. Доступны дополнительные сервисы.
dmz: используется для компьютеров, расположенных в DMZ (изолированных компьютеров, которые не будут иметь доступа к остальной части сети); поддерживает только некоторые входящие соединения.
work: зона рабочей сети. Большинству машин в сети можно доверять. Доступны дополнительные сервисы.
home: зона домашней сети. Окружению можно доверять, но поддерживаются только определённые пользователем входящие соединения.
trusted: всем машинам в сети можно доверять.
Правила firewalld бывают постоянными и временными. Если в наборе появляется или изменяется какое-либо правило, текущее поведение брандмауэра изменяется сразу. Однако после перезагрузки все изменения будут утрачены, если их не сохранить.
Большинство команд firewall-cmd может использовать флаг --permanent, который сохранит правило, после чего оно будет использоваться на постоянной основе.
--permanent
Установка firewalld в РЕД ОС производится из репозитория командой:
sudo dnf install firewalld
После инсталляции активируйте сервис firewalld.service:
sudo systemctl start firewalld.service
Убедитесь, что сервис запущен:
sudo firewall-cmd --state running
Теперь брандмауэр запущен и работает согласно конфигурации по умолчанию.
На данный момент сервис включен, но не будет запускаться автоматически вместе с сервером. Во избежание случайной блокировки своей учетной записи на собственном сервере рекомендуется сначала создать набор правил, а затем настраивать автозапуск.
Обратите внимание, что графический интерфейс не достаточно гибок в возможностях настройки брандмауэра. Для детальной настройки рекомендуется использовать консольную утилиту.
Чтобы узнать, какая зона используется по умолчанию, введите:
firewall-cmd --get-default-zone public
На данный момент firewalld не получал никаких инструкций относительно других зон, кроме того, к другим зонам не привязан ни один интерфейс, поэтому сейчас зона public является зоной по умолчанию, а также единственной активной зоной.
Чтобы получить список активных зон, введите:
firewall-cmd --get-active-zones public (default) interfaces: eth0 eth1
К зоне public привязаны два сетевых интерфейса – eth0 и eth1. Интерфейсы, привязанные к зоне, работают согласно правилам этой зоны.
Чтобы узнать, какие правила использует зона по умолчанию, введите:
sudo firewall-cmd --list-all public (default, active) target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: eth0 eth1 sources: services: dhcpv6-client mdns ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Из вывода команды можно определить:
зоной по умолчанию и единственной активной зоной является зона public;
к зоне по умолчанию привязаны интерфейсы eth0 и eth1;
зона public поддерживает трафик DHCP (присваивание IP-адресов) и SSH (удаленное администрирование).
Теперь следует ознакомиться с другими зонами.
Чтобы получить список всех доступных зон, введите:
firewall-cmd --get-zones block dmz drop external home internal nm-shared public trusted work
Для вывода параметров конкретной зоны добавьте в команду флаг --zone=.
--zone=
sudo firewall-cmd --zone=home --list-all home target: default ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: sources: services: dhcpv6-client mdns samba-client ssh ports: protocols: forward: yes masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Чтобы вывести определения всех доступных зон, добавьте опцию --list-all-zones. Для более удобного просмотра вывод можно передать утилите less:
--list-all-zones
sudo firewall-cmd --list-all-zones | less
Изначально все сетевые интерфейсы привязаны к зоне по умолчанию.
Чтобы перевести интерфейс в другую зону на одну сессию, необходимо использовать опции --zone= и --change-interface=.
--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
Если в настройках интерфейса не указана никакая другая зона, после перезапуска брандмауэра интерфейс будет снова привязан к зоне по умолчанию.
Для смены зоны сетевого интерфейса, например, на зону home, выполните команду:
sudo nmcli connection modify "eth0" connection.zone home
Для обновления настроек перезапустите сетевой сервис и брандмауэр:
sudo systemctl restart NetworkManager.service sudo systemctl restart firewalld.service
После перезапуска интерфейс eth0 будет привязан к зоне home.
Также вы можете выбрать другую зону по умолчанию.
Для этого используется параметр --set-default-zone=. После этого все интерфейсы будут привязаны к другой зоне:
--set-default-zone=
sudo firewall-cmd --set-default-zone=home success firewall-cmd --get-active-zones home (default) 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.
--add-service=
Например, чтобы запустить веб-сервер для обслуживания трафика HTTP, сначала нужно включить поддержку этого трафика в зоне public на одну сессию:
sudo firewall-cmd --zone=public --add-service=http
Если сервис нужно добавить в зону по умолчанию, флаг --zone= можно опустить.
Убедитесь, что операция выполнена успешно:
sudo 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. В таком случае вы можете поступить двумя способами.
Самым простым способом является открытие порта приложения в необходимой зоне брандмауэра. Нужно просто указать порт или диапазон портов и протокол.
Например, приложение, которое использует порт 5000 и протокол TCP, нужно добавить в зону public. Чтобы включить поддержку приложения на одну сессию, используйте параметр --add-port= и укажите протокол tcp или udp.
--
add-port=
sudo firewall-cmd --zone=public --add-port=5000/tcp
Убедитесь, что операция прошла успешно:
sudo 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
Добавлять порты в зоны просто, но если у вас много таких приложений, в результате будет сложно отследить, для чего предназначен тот или иной порт. Чтобы избежать такой ситуации, можно вместо портов определить сервисы.
Сервисы – это просто наборы портов с определенным именем и описанием. С помощью сервисов проще управлять настройками, но сами по себе они сложнее, чем порты.
Для начала нужно скопировать существующий сценарий из каталога /usr/lib/firewalld/services в каталог /etc/firewalld/services (здесь брандмауэр ищет нестандартные настройки).
Например, можно скопировать определение сервиса SSH и использовать его для определения условного сервиса example. Имя сценария должно совпадать с именем сервиса и иметь расширение .xml.
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
Откорректируйте скопированный файл.
sudo nano /etc/firewalld/services/example.xml
В файле находится определение SSH:
Большую часть определения сервиса составляют метаданные. Изменить краткое имя сервиса можно в тегах . Это человекочитаемое имя сервиса. Также нужно добавить описание сервиса. Единственное изменение, которое повлияет на работу сервиса – это изменение номера порта и протокола.
Вернёмся к сервису 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 nm-shared privateDNS public publicweb trusted work
В текущей сессии новые зоны не будут доступны:
Чтобы получить доступ к новым зонам, нужно перезапустить брандмауэр:
sudo firewall-cmd --reload firewall-cmd --get-zones block dmz drop external home internal nm-shared 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 ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: sources: services: http https ssh ports: protocols: forward: no 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 ingress-priority: 0 egress-priority: 0 icmp-block-inversion: no interfaces: sources: services: dns ports: protocols: forward: no 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
Теперь можно протестировать настройку. Если всё работает правильно, вы можете добавить эти правила в постоянные настройки.
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 nmcli connection modify "eth0" connection.zone publicweb
А интерфейс eth1 будет привязан к privateDNS:
sudo nmcli connection modify "eth1" connection.zone privateDNS
Перезапустите сетевые сервисы и брандмауэр:
sudo systemctl restart NetworkManager.servise sudo systemctl restart firewalld.service
Проверьте зоны:
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 — очень гибкий инструмент. Зоны позволяют быстро изменять политику брандмауэра.
Дата последнего изменения: 14.08.2025
Если вы нашли ошибку, пожалуйста, выделите текст и нажмите Ctrl+Enter.
Нажимая «Отправить запрос», вы соглашаетесь с условиями обработки персональных данных.
Вы будете получать только актуальную информацию по обновлению безопасности
Подписываясь на уведомления, вы соглашаетесь с условиями обработки персональных данных.
На ваш почтовый адрес отправлено письмо с подтверждением подписки.