15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать
01.11.2024

Как настроить брандмауэр с помощью Firewalld на Linux (Полное руководство)

Защита вашего Linux-сервера от несанкционированного доступа и вредоносного трафика — это не опция, а фундаментальная ответственность любого системного администратора. Независимо от того, запускаете ли вы личный проект, бизнес-приложение или production веб-сервер, правильно настроенный брандмауэр — это ваша первая и наиболее критическая линия защиты. Firewalld — один из самых мощных и гибких инструментов управления брандмауэром, доступных на Linux, предлагающий динамическое управление правилами, контроль трафика на основе зон и богатую поддержку правил — всё без необходимости полной перезагрузки сервиса при применении изменений.

Это подробное руководство проведёт вас через всё, что вам нужно знать: установка Firewalld, понимание зон, управление сервисами и портами, написание расширенных правил и мониторинг вашего брандмауэра в реальном времени. Если вы размещаете свой сервис на VPS или Dedicated Server от AlexHost, это руководство поможет вам защитить вашу среду и поддерживать сильную, адаптивную позицию безопасности.

Что такое Firewalld и почему его использовать?

Firewalld — это демон динамического управления брандмауэром, доступный в большинстве основных дистрибутивов Linux, включая CentOS, RHEL, Fedora, Rocky Linux, AlmaLinux, а также всё чаще на Debian и Ubuntu. В отличие от старого подхода с iptables — где каждое изменение правила требовало очистки и перезагрузки всего набора правил — Firewalld применяет изменения динамически во время выполнения без прерывания активных соединений.

Ключевые преимущества Firewalld

  • Архитектура на основе зон — назначайте разные уровни доверия разным сетевым интерфейсам или диапазонам IP
  • Динамическое обновление правил — применяйте изменения без перезагрузки брандмауэра или разрыва существующих соединений
  • Абстракция сервисов — управляйте трафиком по имени сервиса (например, http, https) вместо номеров портов
  • Расширенные правила — пишите сложные условные правила, нацеленные на конкретные 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 — Установка зоны по умолчанию на internal

Если ваш сервер работает в надёжной частной сети (например, домашняя лаборатория или внутренняя среда разработки), зона internal позволяет более разрешительное взаимодействие между надёжными хостами:

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-ports

Шаг 7: Расширенная конфигурация с расширенными правилами

Расширенные правила дают вам детальный, условный контроль над трафиком — намного больше, чем позволяют простые правила сервисов или портов. Они поддерживают фильтрацию по исходному IP, целевому IP, протоколу, порту и действию (accept, reject, drop, log).

Синтаксис расширенного правила

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-соединений для предотвращения перебора

Логируйте и ограничивайте попытки подключения 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

Список всех расширенных правил в зоне

sudo firewall-cmd --zone=public --list-rich-rules

Удаление расширенного правила

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: Правила времени выполнения и постоянные правила — понимание различия

Firewalld работает с двумя отдельными слоями конфигурации:

СлойФлагПостоянствоСлучай использования
Время выполнения*(без флага)*Теряется при перезагрузке/перезагрузкеВременное тестирование правил
Постоянный–permanentСохраняется при перезагрузке и перезагрузкеProduction-конфигурации

Лучший рабочий процесс

  1. Сначала протестируйте правило во время выполнения (без –permanent), чтобы убедиться, что оно работает как ожидается
  2. Добавьте правило постоянно после подтверждения
  3. Перезагрузите Firewalld, чтобы синхронизировать конфигурации времени выполнения и постоянные
# 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 и переадресации портов

Для серверов, действующих как шлюзы или работающих с NAT (Network Address Translation), Firewalld поддерживает маскировку и переадресацию портов изначально.

Включение маскировки (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)

###PPT_NOTR

15%

Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код:

Skills
Начать