Как настроить брандмауэр с помощью Firewalld на Linux (Полное руководство)
Защита вашего Linux сервера от несанкционированного доступа и вредоносного трафика — это не опция, а фундаментальная ответственность любого системного администратора. Независимо от того, запускаете ли вы личный проект, бизнес-приложение или production веб-сервер, правильно настроенный firewall является вашей первой и наиболее критической линией защиты. Firewalld — это один из самых мощных и гибких инструментов управления firewall, доступных в Linux, предлагающий динамическое управление правилами, контроль трафика на основе зон и богатую поддержку правил — все это без необходимости полной перезагрузки сервиса при применении изменений.
Это подробное руководство проведет вас через все, что вам нужно знать: установка Firewalld, понимание зон, управление сервисами и портами, написание rich rules и мониторинг вашего firewall в реальном времени. Если вы размещаете свой проект на VPS или Dedicated Server от AlexHost, это руководство поможет вам защитить вашу среду и поддерживать сильную, адаптивную позицию безопасности.
Что такое Firewalld и почему его следует использовать?
Firewalld — это демон динамического управления брандмауэром, доступный в большинстве основных дистрибутивов Linux, включая CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux, а также все чаще в Debian и Ubuntu. В отличие от старого подхода iptables — где каждое изменение правила требовало очистки и перезагрузки всего набора правил — Firewalld применяет изменения динамически во время выполнения без прерывания активных соединений.
Ключевые преимущества Firewalld
- Архитектура на основе зон — назначайте разные уровни доверия различным сетевым интерфейсам или диапазонам IP
- Динамическое обновление правил — применяйте изменения без перезагрузки брандмауэра или разрыва существующих соединений
- Абстракция сервисов — управляйте трафиком по имени сервиса (например,
http,ssh) вместо номеров портов - Расширенные правила — создавайте сложные условные правила, нацеленные на конкретные IP-адреса, протоколы и действия
- Интеграция D-Bus — позволяет другим приложениям и сервисам взаимодействовать с брандмауэром программно
- Поддержка IPv4 и IPv6 — управляйте обоими семействами протоколов из одного интерфейса
Предварительные требования
Перед началом убедитесь, что у вас есть:
- Linux сервер с CentOS 7/8/9, RHEL, Fedora, Rocky Linux, AlmaLinux, Debian или Ubuntu
- Root или
sudoдоступ к серверу - Базовое понимание команд Linux терминала
- Активная SSH сессия (держите её открытой на протяжении всего процесса — вы будете изменять правила брандмауэра)
> Критическое предупреждение: Всегда убедитесь, что SSH (порт 22 по умолчанию) явно разрешён в правилах брандмауэра перед включением Firewalld. Заблокировать себя на удалённом сервере — это распространённая и предотвратимая ошибка.
Шаг 1: Установка Firewalld
Firewalld включен в репозитории по умолчанию большинства основных дистрибутивов Linux. Используйте соответствующий менеджер пакетов для вашей системы.
На CentOS / RHEL / Rocky Linux / AlmaLinux
sudo yum install firewalld -yИли на более новых версиях с использованием DNF:
sudo dnf install firewalld -yНа Fedora
sudo dnf install firewalld -y
На Debian / Ubuntu
Хотя Firewalld чаще всего ассоциируется с системами на основе RHEL, он полностью поддерживается в дистрибутивах на основе Debian:
sudo apt update
sudo apt install firewalld -y> Примечание для пользователей Ubuntu/Debian: Если ufw в настоящее время активен в вашей системе, отключите его перед включением Firewalld, чтобы избежать конфликтов:
> “`bash
> sudo ufw disable
> “`
Шаг 2: Запуск и включение Firewalld
После установки запустите сервис Firewalld и настройте его на автоматический запуск при загрузке системы:
sudo systemctl start firewalld
sudo systemctl enable firewalldПроверьте, что сервис работает правильно:
sudo systemctl status firewalldВы должны увидеть вывод, похожий на:
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since ...Если статус показывает active (running), Firewalld работает и готов к настройке.
Шаг 3: Понимание зон Firewalld
Модель на основе зон является основой архитектуры Firewalld. Зона определяет уровень доверия для сетевого подключения или интерфейса. Каждая зона содержит свой набор правил, которые определяют, какой трафик разрешен или запрещен.

Встроенные зоны Firewalld
| Зона | Уровень доверия | Типичный случай использования |
|---|---|---|
drop | Самый низкий | Все входящие соединения отбрасываются без ответа |
block
| Очень низкий | Входящие соединения отклоняются с сообщением ICMP |
public | Низкий | Зона по умолчанию для ненадежных публичных сетей |
external | Низкий | Для внешних интерфейсов с маскировкой NAT |
dmz | Средний | Серверы, доступные извне, но изолированные внутри |
work | Средне-высокий | Рабочие сети с умеренным уровнем доверия |
home | Высокий | Домашние сети, где другие хосты являются надежными |
internal | Высокий | Внутренние сети, аналогично домашним |
trusted | Самый высокий | Все соединения принимаются |
Проверить текущую зону по умолчанию
sudo firewall-cmd --get-default-zone
Список всех доступных зон
sudo firewall-cmd --get-zones
Просмотр активных зон и их интерфейсов
sudo firewall-cmd --get-active-zonesПример вывода:
public
interfaces: eth0
Шаг 4: Изменение зоны по умолчанию
Пример 1 — Установка зоны по умолчанию на public (Рекомендуется для VPS/Dedicated Servers)
Для большинства серверов, доступных в интернете, public является подходящей зоной по умолчанию. Она применяет консервативный уровень доверия и разрешает только явно разрешенный трафик:
sudo firewall-cmd --set-default-zone=publicПроверьте изменение:
sudo firewall-cmd --get-default-zoneОжидаемый результат:
publicПример 2 — Установка зоны по умолчанию на home
Если ваш сервер работает в доверенной частной сети (например, домашняя лаборатория или внутренняя среда разработки), зона home позволяет более свободное взаимодействие между доверенными хостами:
sudo firewall-cmd --set-default-zone=homeПроверьте:
sudo firewall-cmd --get-default-zoneОжидаемый результат:
homeПример 3 — Установка зоны по умолчанию на work
Для серверов в корпоративной или рабочей сети, где уместна средняя степень доверия:
sudo firewall-cmd --set-default-zone=workПроверьте:
sudo firewall-cmd --get-default-zoneОжидаемый результат:
workШаг 5: Управление сервисами с помощью Firewalld
Firewalld включает библиотеку предопределенных определений сервисов, которые сопоставляют имена сервисов с соответствующими портами и протоколами. Это значительно облегчает управление правилами по назначению, а не по номерам портов.
Список всех предопределенных сервисов
sudo firewall-cmd --get-servicesРазрешить сервис в зоне
Чтобы разрешить HTTP-трафик (порт 80/TCP) в зоне public постоянно:
sudo firewall-cmd --zone=public --add-service=http --permanentЧтобы разрешить HTTPS-трафик (порт 443/TCP):
sudo firewall-cmd --zone=public --add-service=https --permanentЧтобы разрешить SSH (порт 22/TCP) — всегда убедитесь, что это разрешено перед внесением других изменений:
sudo firewall-cmd --zone=public --add-service=ssh --permanentПрименить изменения путем перезагрузки Firewalld
Флаг --permanent записывает правило в постоянную конфигурацию, но не применяет его немедленно к работающему брандмауэру. Всегда перезагружайте после внесения постоянных изменений:
sudo firewall-cmd --reloadПроверить сервисы в зоне
sudo firewall-cmd --zone=public --list-servicesПример вывода:
dhcpv6-client http https sshУдалить сервис из зоны
Чтобы удалить HTTPS из зоны public:
sudo firewall-cmd --zone=public --remove-service=https --permanent
sudo firewall-cmd --reloadШаг 6: Прямое управление портами
В случаях, когда служба не имеет предопределённого определения Firewalld, вы можете открывать или закрывать определённые порты напрямую.
Открыть определённый порт
Чтобы открыть порт 8080 через TCP в зоне public:
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --reloadЧтобы открыть UDP порт (например, порт 53 для DNS):
sudo firewall-cmd --zone=public --add-port=53/udp --permanent
sudo firewall-cmd --reloadЧтобы открыть диапазон портов (например, 6000–6100 TCP):
sudo firewall-cmd --zone=public --add-port=6000-6100/tcp --permanent
sudo firewall-cmd --reloadЗакрыть определённый порт
Чтобы закрыть порт 8080:
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
sudo firewall-cmd --reloadСписок всех открытых портов в зоне
sudo firewall-cmd --zone=public --list-portsStep 7: Advanced Configuration with Rich Rules
Rich rules предоставляют вам детальное условное управление трафиком — намного больше, чем позволяют простые правила сервиса или порта. Они поддерживают фильтрацию по исходному IP, целевому IP, протоколу, порту и действию (accept, reject, drop, log).
Синтаксис Rich Rule
rule [family="<ipv4|ipv6>"]
[source address="<IP/CIDR>"]
[destination address="<IP/CIDR>"]
[service name="<service>"] | [port port="<port>" protocol="<tcp|udp>"]
[log [prefix="<prefix>"] [level="<level>"] [limit value="<rate>"]]
[accept|reject|drop]Пример 1 — Разрешить SSH только с определённого IP-адреса
Это одна из наиболее важных конфигураций безопасности для любого удалённого сервера. Если вы управляете сервером с фиксированного IP-адреса, ограничьте доступ SSH исключительно этим IP:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="203.0.113.50" service name="ssh" accept' --permanent
sudo firewall-cmd --reloadПример 2 — Заблокировать весь трафик с определённого IP-адреса
Чтобы полностью заблокировать IP-адрес, генерирующий вредоносный трафик:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadПример 3 — Разрешить HTTP с определённой подсети
Чтобы разрешить трафик HTTP только с доверенной внутренней подсети (например, 192.168.1.0/24):
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept' --permanent
sudo firewall-cmd --reloadПример 4 — Ограничить скорость SSH-соединений для предотвращения brute force
Логируйте и ограничивайте попытки подключения SSH, чтобы снизить уязвимость к атакам перебора:
sudo firewall-cmd --zone=public --add-rich-rule='rule service name="ssh" log prefix="SSH-ATTEMPT" level="notice" limit value="3/m" accept' --permanent
sudo firewall-cmd --reloadПример 5 — Разрешить определённый порт с определённого IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
sudo firewall-cmd --reloadСписок всех Rich Rules в зоне
sudo firewall-cmd --zone=public --list-rich-rulesУдалить Rich Rule
sudo firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="198.51.100.25" drop' --permanent
sudo firewall-cmd --reloadШаг 8: Мониторинг и аудит вашего брандмауэра
Регулярный пересмотр конфигурации брандмауэра необходим для поддержания надежной безопасности. Firewalld предоставляет несколько команд для проверки текущего состояния ваших правил.
Просмотр полной конфигурации для зоны по умолчанию
sudo firewall-cmd --list-allПример вывода:
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client http https ssh
ports: 8080/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="203.0.113.50" service name="ssh" acceptПросмотр конфигурации для всех зон
sudo firewall-cmd --list-all-zonesПросмотр конфигурации для определенной зоны
sudo firewall-cmd --zone=dmz --list-allПроверка разрешения определенной службы
sudo firewall-cmd --zone=public --query-service=httpПроверка открытия определенного порта
sudo firewall-cmd --zone=public --query-port=8080/tcpШаг 9: Runtime vs. Permanent Rules — Понимание различий
Firewalld работает с двумя отдельными слоями конфигурации:
| Слой | Флаг | Постоянство | Случай использования |
|---|---|---|---|
| Runtime | *(без флага)* | Теряется при перезагрузке/перезапуске | Временное тестирование правил |
| Permanent | --permanent | Сохраняется при перезагрузке и перезапуске | Производственные конфигурации |
Рекомендуемый рабочий процесс
- Сначала протестируйте правило в режиме runtime (без
--permanent), чтобы убедиться, что оно работает как ожидается - Добавьте правило постоянно после подтверждения
- Перезагрузите Firewalld, чтобы синхронизировать конфигурации runtime и permanent
# Step 1: Test at runtime
sudo firewall-cmd --zone=public --add-service=http
# Step 2: Verify it works as expected, then make it permanent
sudo firewall-cmd --zone=public --add-service=http --permanent
# Step 3: Reload to sync
sudo firewall-cmd --reloadКроме того, примените постоянное правило и немедленно перезагрузитесь в одном рабочем процессе:
sudo firewall-cmd --zone=public --add-service=http --permanent && sudo firewall-cmd --reloadШаг 10: Назначение сетевых интерфейсов зонам
Если ваш сервер имеет несколько сетевых интерфейсов (обычно на Dedicated Servers с публичными и приватными NIC), вы можете назначить каждый интерфейс другой зоне с разными уровнями доверия.
Назначить интерфейс зоне
sudo firewall-cmd --zone=internal --add-interface=eth1 --permanent
sudo firewall-cmd --reloadИзменить зону интерфейса
sudo firewall-cmd --zone=public --change-interface=eth0 --permanent
sudo firewall-cmd --reloadУдалить интерфейс из зоны
sudo firewall-cmd --zone=internal --remove-interface=eth1 --permanent
sudo firewall-cmd --reloadШаг 11: Включение IP Masquerading и Port Forwarding
Для серверов, действующих в качестве шлюзов или работающих с NAT (Network Address Translation), Firewalld поддерживает masquerading и port forwarding встроенно.
Включить Masquerading (NAT)
sudo firewall-cmd --zone=external --add-masquerade --permanent
sudo firewall-cmd --reloadПеренаправить порт (например, перенаправить внешний порт 80 на внутренний порт 8080)
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
sudo firewall-cmd --reloadПеренаправить трафик на другой хост
sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.1.10 --permanent
sudo firewall-cmd --reloadПрактические конфигурации безопасности для серверов AlexHost
Если вы запускаете веб-сервер, сервер базы данных или сервер приложений на инфраструктуре AlexHost, вот рекомендуемые базовые конфигурации Firewalld:
Базовая конфигурация веб-сервера
# Allow SSH (restrict to your IP in production)
sudo firewall-cmd --zone=public --add-service=ssh --permanent
# Allow HTTP and HTTPS
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# Reload to apply
sudo firewall-cmd --reload
# Verify
sudo firewall-cmd --list-all> Совет профессионала: Сочетайте конфигурацию брандмауэра с действительным SSL-сертификатом, чтобы обеспечить сквозное шифрование всего веб-трафика. AlexHost предлагает SSL-сертификаты для всех сред хостинга.
Базовая конфигурация сервера базы данных (MySQL/MariaDB)
# Allow MySQL only from a specific application server IP
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port port="3306" protocol="tcp" accept' --permanent
# Block direct MySQL access from the public internet
sudo firewall-cmd --zone=public --remove-service=mysql --permanent 2>/dev/null
sudo firewall-cmd --reloadБазовая конфигурация сервера cPanel/WHM
Если вы используете VPS с cPanel, вам потребуется открыть порты, необходимые для cPanel и WHM:
# Web traffic
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
# cPanel/WHM ports
sudo firewall-cmd --zone=public --add-port=2082/tcp --permanent # cPanel HTTP
sudo firewall-cmd --zone=public --add-port=2083/tcp --permanent # cPanel HTTPS
sudo firewall-cmd --zone=public --add-port=2086/tcp --permanent # WHM HTTP
sudo firewall-cmd --zone=public --add-port=2087/tcp --permanent # WHM HTTPS
sudo firewall-cmd --zone=public --add-port=2095/tcp --permanent # Webmail HTTP
sudo firewall-cmd --zone=public --add-port=2096/tcp --permanent # Webmail HTTPS
# Mail ports
sudo firewall-cmd --zone=public --add-service=smtp --permanent
sudo firewall-cmd --zone=public --add-service=imaps --permanent
sudo firewall-cmd --zone=public --add-service=pop3s --permanent
sudo firewall-cmd --reloadУстранение распространённых проблем Firewalld
Проблема 1: Firewalld не запускается
Проверьте конфликты с другими инструментами брандмауэра:
sudo systemctl status iptables
sudo systemctl stop iptables
sudo systemctl disable iptables
sudo systemctl start firewalldПроблема 2: Правила не сохраняются после перезагрузки
Убедитесь, что вы использовали флаг --permanent и перезагрузили:
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --reloadКоманда --runtime-to-permanent сохраняет все текущие правила времени выполнения в постоянную конфигурацию.
Проблема 3: Заблокирован доступ по SSH
Если вы случайно заблокировали доступ SSH, вам потребуется получить доступ к серверу через консоль (доступна через панель управления VPS AlexHost) и выполнить:
sudo firewall-cmd --zone=public --add-service=ssh --permanent
sudo firewall-cmd --reloadПроблема 4: Проверка журналов Firewalld
sudo journalctl -u firewalld -fИли проверьте системный журнал на наличие сообщений, связанных с брандмауэром:
sudo grep -i firewall /var/log/messagesFirewalld Quick Reference Cheat Sheet
| Задача | Команда |
|---|---|
| Проверить статус | sudo systemctl status firewalld |
| Запустить Firewalld | sudo systemctl start firewalld |
| Остановить Firewalld | sudo systemctl stop firewalld |
| Включить при загрузке | sudo systemctl enable firewalld |
| Получить зону по умолчанию | sudo firewall-cmd --get-default-zone |
| Список всех зон | sudo firewall-cmd --get-zones |
| Список активных зон | sudo firewall-cmd --get-active-zones |
| Установить зону по умолчанию | sudo firewall-cmd --set-default-zone=public |
| Добавить сервис | sudo firewall-cmd --zone=public --add-service=http --permanent |
| Удалить сервис | sudo firewall-cmd --zone=public --remove-service=http --permanent |
| Открыть порт | sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent |
| Закрыть порт | sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent |
| Список сервисов | sudo firewall-cmd --zone=public --list-services |
| Список портов | sudo firewall-cmd --zone=public --list-ports |
| Список всех правил | sudo firewall-cmd --list-all |
| Добавить расширенное правило | sudo firewall-cmd --zone=public --add-rich-rule='...' --permanent |
| Сохранить правила времени выполнения | sudo firewall-cmd --runtime-to-permanent |
| Перезагрузить Firewalld | sudo firewall-cmd --reload |
| Режим паники (заблокировать все) | sudo firewall-cmd --panic-on |
| Отключить режим паники | sudo firewall-cmd --panic-off |
Заключение
Firewalld — это исключительно мощный и гибкий инструмент управления брандмауэром, который дает администраторам систем Linux точное динамическое управление сетевым трафиком. Овладев зонами, сервисами, правилами портов и расширенными правилами, вы можете построить многоуровневую адаптивную архитектуру безопасности, которая защищает ваш сервер от несанкционированного доступа, атак перебора и сетевых угроз.
Ключевые принципы, которые следует запомнить:
- Всегда разрешайте SSH перед включением брандмауэра, чтобы избежать блокировки доступа к себе
- Используйте флаг
--permanentдля всех правил в production, и всегда следуйте с--reload - Ограничивайте доступ к чувствительным сервисам (SSH, базы данных, панели администратора) конкретными доверенными IP-адресами, используя расширенные правила
- Регулярно проверяйте правила брандмауэра — ваша политика безопасности должна развиваться по мере изменения инфраструктуры
- Сначала протестируйте правила во время выполнения, а затем сделайте их постоянными после проверки
Управляете ли вы одним VPS или парком Dedicated Servers, AlexHost предоставляет инфраструктуру, производительность и полный root-доступ, необходимые для реализации конфигураций безопасности корпоративного уровня. Дополните вашу настройку Firewalld SSL Certificates для зашифрованной коммуникации и изучите VPS Control Panels для упрощенного управления сервером — все доступно на надежной высокопроизводительной платформе AlexHost.
на всех хостинговых услугах