Вопрос или проблема
У меня есть несколько машин с CentOS 7 в одной локальной сети. Каждая из них общается с несколькими другими и имеет одно или несколько приложений, установленных, каждое из которых слушает на различных портах (база данных, веб-сервер, служба балансировки нагрузки и т. д.). Типичные веб-архитектурные вещи.
Сейчас firewalld
отключен на всех этих машинах. И я хочу включить его повсюду.
Обычно это происходит так:
systemctl enable firewalld
systemctl start firewalld
firewall-cmd <...>
(добавить порты, источники, службы и т. д.)
Проблема в том, что как только я запускаю службу firewalld, по умолчанию он блокирует большую часть моего трафика1, пока я не смогу выполнить 3-й шаг. И, учитывая большое количество конфигураций (порты, источники), которые мне нужно добавить, мои службы фактически станут недоступны, пока я не разберусь с этим.
Меня больше всего беспокоят некоторые из этих функций:
- Я использую GlusterFS на некоторых машинах для создания сетевой файловой системы, которую затем монтирую на другие машины
- Я использую Corosync+Pacemaker для создания нескольких кластеров между некоторыми из машин; эти инструменты используют различные порты для функциональности, похожей на heartbeat
Если я включу firewalld на этих машинах, он немедленно заблокирует все эти службы, пока я не смогу выполнить мои многочисленные firewall-cmd <...>
команды. И я не знаю, к каким последствиям это приведет.
Мой вопрос: Есть способ выполнить 3-й шаг ПЕРЕД 2-м шагом? Чтобы все было готово, когда я включу службу.
Единственная моя идея – это как-то вручную отредактировать XML файлы в папке /etc/firewalld/zones
. Но это кажется очень подверженным ошибкам, особенно поскольку я не настолько знаком с firewalld, чтобы быть уверенным в таких правках.
1 = Насколько я знаю, только порты 80/443 (HTTP/HTTPS) и 22 (SSH) будут открыты, все остальные заблокированы, пока вы не откроете их явно.
Перед тем как начать службу firewalld
, вам следует указать параметры через конфигурационные файлы.
Я рекомендую создать файл правил для каждой службы (GlusterFS, Pacemaker…) и поместить в файл все порты, которые вам нужны. Например (для pacemaker, взято из Настройка iptables Firewall для разрешения компонентов кластера) /etc/firewalld/services/pacemaker.xml
:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Pacemaker</short>
<description>Служба Pacemaker</description>
<port protocol="tcp" port="2224"/>
<port protocol="tcp" port="3121"/>
<port protocol="tcp" port="5403"/>
<port protocol="udp" port="5404"/>
<port protocol="udp" port="5405"/>
<port protocol="tcp" port="21064"/>
</service>
Больше информации с примерами вы можете найти на Как настроить брандмауэр с использованием FirewallD на CentOS 7.
Затем вы можете безопасно запустить firewalld
.
Если вы боитесь поломать firewalld
, редактируя файлы зон вручную, вы можете протестировать в виртуальной среде перед применением в рабочей системе.
Просто добавьте опцию --permanent
ко всем вашим правилам, например:
firewall-cmd --zone=trusted --add-port=1234/tcp --permanent
Это зарегистрирует правила в постоянной конфигурации, но не применит их, пока вы не выполните команду
firewall-cmd --reload
Кстати, это рекомендованный способ работы с firewalld
; если вы не используете опцию --permanent
, изменения будут применены временно и будут стерты при следующей перезагрузке или перезапуске брандмауэра.
В наши дни большинство продуктов больше не документируют свои сетевые протоколы, поэтому вам придется выяснить, что происходит, прежде чем начинать настройки брандмауэра.
Например, чтобы увидеть все TCP-сокеты, которые слушают, вы можете использовать ss -tln
(TCP, слушающие, неразрешенные):
# ss -tln
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 100 127.0.0.1:25 0.0.0.0:*
LISTEN 0 100 [::1]:25 [::]:*
LISTEN 0 128 [::]:22 [::]:*
Так как список может быть намного длиннее, вы также можете отфильтровать по процессам, использующим сокеты, добавив опцию -p
:
# ss -tlnp
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=10392,fd=3))
LISTEN 0 100 127.0.0.1:25 0.0.0.0:* users:(("master",pid=1876,fd=13))
LISTEN 0 100 [::1]:25 [::]:* users:(("master",pid=1876,fd=14))
LISTEN 0 128 [::]:22 [::]:* users:(("sshd",pid=10392,fd=4))
Вам следует перекрестно проверить существующие соединения, исключив опцию -l
.
(UDP – это другой протокол, который стоит рассмотреть)
Когда закончите, организуйте порты и протоколы по приложениям и определите службы для каждого (если их еще нет).
Вы также можете определить “супер услуги”, которые включают в себя другие службы. Например, приложение использует веб-сервер и сервер базы данных, поэтому вы можете определить две службы для базы данных и веба, а затем включить обе в приложение.
Поскольку другие вопросы касаются определенияFirewall служб, я не буду повторять ответы здесь.
Ответ или решение
Как включить firewalld на CentOS 7, не нарушая работу приложений
Введение в настройку firewalld может вызвать некоторые опасения, особенно когда на ваших CentOS 7 машинах уже работают различные сервисы, такие как базы данных, веб-серверы и кластеры, использующие GlusterFS и Corosync+Pacemaker. Включение firewalld без предварительной настройки правил может привести к тому, что ваши приложения станут недоступны. Ниже представлены шаги, которые помогут вам безопасно активировать firewalld, предварительно настроив необходимые правила.
1. Подготовка к включению firewalld
Перед тем как активировать firewalld, важно заранее определить, какие порты и протоколы будут необходимы для работы ваших сервисов. Для этого выполните следующие действия:
-
Соберите информацию о портах:
Используйте командуss -tln
для получения списка всех открытых TCP-портов на машинах. Если вы хотите увидеть, какие порты используются конкретными процессами, добавьте флаг-p
:ss -tlnp
Это позволит вам избежать блокировки критически важных сервисов при включении firewalld.
-
Создайте XML-файлы для сервисов:
Для каждого вашего приложения, например Pacemaker или GlusterFS, создайте XML-файл в директории/etc/firewalld/services/
. Этот файл будет содержать информацию о необходимых портах. Например, для Pacemaker файл/etc/firewalld/services/pacemaker.xml
может выглядеть следующим образом:<?xml version="1.0" encoding="utf-8"?> <service> <short>Pacemaker</short> <description>Pacemaker service</description> <port protocol="tcp" port="2224"/> <port protocol="tcp" port="3121"/> <port protocol="tcp" port="5403"/> <port protocol="udp" port="5404"/> <port protocol="udp" port="5405"/> <port protocol="tcp" port="21064"/> </service>
-
Убедитесь в создании правил для всех необходимых сервисов:
По аналогии создайте XML-файлы для GlusterFS и любых других приложений. Эта структура позволит избежать ошибок при ручном редактировании.
2. Настройка правил перед включением firewalld
Теперь, когда у вас есть все необходимые правила, вы можете зарегистрировать их, не активируя firewalld. Используйте ключ --permanent
для добавления необходимых правил:
firewall-cmd --add-service=pacemaker --permanent
Или добавляйте порты напрямую:
firewall-cmd --zone=trusted --add-port=2224/tcp --permanent
firewall-cmd --zone=trusted --add-port=5404/udp --permanent
3. Применение правил
После добавления всех необходимых настроек и сервисов, чтобы изменения вступили в силу, выполните команду:
firewall-cmd --reload
Эта команда перезагрузит конфигурации вашего фаервола и применит все добавленные вами правила.
4. Активирование firewalld
Теперь вы готовы активировать firewalld. Используйте команды:
systemctl enable firewalld
systemctl start firewalld
После этого ваши приложения должны работать без перебоев, поскольку необходимые порты будут уже открыты.
Заключение
Следуя указанным шагам, вы сможете успешно включить firewalld на ваших CentOS 7 машинах, предварительно настроив правила для всех необходимых сервисов. Это обеспечит безопасность системы, сохранив доступность приложений, что крайне важно для поддержания общей производительности и надежности вашего окружения.