====== Общие команды для управления firewalld ======
Посмотреть состояние:
firewall-cmd --state
Мягко перечитать правила (применить настройки):
firewall-cmd --reload
Перечитать правила и сбросить текущие подключения:
firewall-cmd --complete-reload
В официальной документации сказано, что данную команду стоит применять только в случаях проблем с firewalld.
Посмотреть созданные правила:
firewall-cmd --list-all
Остановить службу:
systemctl stop firewalld
Запустить сервис:
systemctl start firewalld
Запретить автозапуск:
systemctl disable firewalld
Разрешить автозапуск:
systemctl enable firewalld
Сохранить текущие правила, сделав их постоянными (permanent):
firewall-cmd --runtime-to-permanent
====== Управление правилами ======
===== Синтаксис =====
Общий синтаксис для работы с правилами:
firewall-cmd [опции] [зона] <правило>
Порядок следования параметров не важен.\\
где:
* **[опции]** — дополнительные параметры для создаваемого правила, например --permanent — постоянное правило, то есть будет действовать после перезагрузки. Не обязательный.
* **[зона]** — по умолчанию, правила создаются для зоны public. Для работы с конкретной зоной ее необходимо указать, например, --zone=dmz. Не обязательный.
* **<правило>** — само правило. Обязательный.
Чтобы правила применялись, не забываем их перечитывать:
firewall-cmd --reload
==== Добавление портов ====
Открыть порт 80:
firewall-cmd --permanent --add-port=80/tcp
где ключ **--permanent** — добавить постоянное правило (будет действовать после перезагрузки).
Добавить правило для определенной зоны:
firewall-cmd --permanent --zone=external --add-port=80/tcp
Добавить диапазон портов:
firewall-cmd --permanent --add-port=6500-6700/udp
Добавить несколько правил одной командой:
firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp
==== Добавление сервиса ====
Использование служб, вместо портов, может повысить удобство управления правилами за счет объединения нескольких портов в одну службу.\\
Посмотреть список доступных служб:
firewall-cmd --get-services
Разрешить порт, например, для сервиса ntp:
firewall-cmd --permanent --add-service=ntp
Создать собственную службу:
firewall-cmd --permanent --new-service=name-service
где **name-service** — произвольное имя создаваемой службы.
Добавить порт, например TCP 2200 к службе:
firewall-cmd --permanent --service=name-service --add-port=2200/tcp
Задать описание для удобства:
firewall-cmd --permanent --service=name-service --set-short="Service With This Name"
firewall-cmd --permanent --service=name-service --set-description="Long Description For Service With This Name"
Информацию о созданном сервисе можно получить командой:
firewall-cmd --info-service=name-service
Теперь созданную службу можно использовать для создания правил, например:
firewall-cmd --permanent --add-service=name-service
==== Rich-Rule ====
**rich-rule** позволяет создавать правила с условиями. Рассмотрим несколько примеров:\\
1. Разрешаем службу http с условием, что запросы будут с определенных IP-адресов (подсети 192.168.0):
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
2. Или для конкретного порта:
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" port port="5038" protocol="tcp" accept'
3. Чтобы заблокировать подсеть можно воспользоваться командой:
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject"
Список правил с условиями можно отобразить командой:
firewall-cmd --list-rich-rules
==== Удаление правил ====
Аналогично созданию, но вместо add вводим remove, например --remove-port (удалит порт) или --remove-service (службу).\\
Удалим правило для открытия 80-о порта:
firewall-cmd --permanent --remove-port=80/tcp
===== Управление зонами =====
Все правила в firewalld могут быть разбиты по зонам. Для каждой свой набор правил и свои сетевые интерфейсы. Это нужно использовать, если мы захотим для разных сетевых адаптеров сделать разные по строгости правила.\\
Посмотреть список всех имеющихся зон:
firewall-cmd --list-all-zones
Посмотреть список используемых зон:
firewall-cmd --get-active-zones
Информация о конкретной зоне:
firewall-cmd --list-all --zone=public
Создать правило для зоны public:
firewall-cmd --permanent --zone=public --add-port=80/tcp
Добавить сетевой интерфейс в зону:
firewall-cmd --permanent --zone=public --remove-interface=ens34
firewall-cmd --permanent --zone=internal --add-interface=ens34
Сначала нужно удалить адаптер из текущей зоны.
Задать действие по умолчанию для зоны:
firewall-cmd --permanent --zone=public --set-target=DROP
Создать новую зону:
firewall-cmd --permanent --new-zone=custom_zone
firewall-cmd --reload
Чтобы система увидела новую зону custom_zone, команда reload обязательная.
====== Пример настройки NAT (шлюза) ======
Включить маскарадинг:
firewall-cmd --permanent --zone=dmz --add-masquerade
Без указания зон, будет включен для public и external.
Для примера берем два ethernet интерфейса — ens32 (внутренний) и ens33 (внешний). Для настройки nat последовательно вводим следующие 4 команды:
firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o ens33 -j MASQUERADE
правило включает маскарадинг на внешнем интерфейсе ens33. Где опция **--direct** требуется перед всеми пользовательскими правилами (--passthrough, --add-chain, --remove-chain, --query-chain, --get-chains, --add-rule, --remove-rule, --query-rule, --get-rules); **nat** — таблица, в которую стоит добавить правило; **POSTROUTING 0** — цепочка в таблице nat; опция **MASQUERADE** указывает сетевому экрану менять внутренний IP-адрес на внешний.
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens32 -o ens33 -j ACCEPT
Добавляет в таблицу **filter** (цепочку **FORWARD**) правило, позволяющее хождение трафика с **ens32** на **ens33**.
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens33 -o ens32 -m state --state RELATED,ESTABLISHED -j ACCEPT
добавляет правило в таблицу **filter** (цепочку **FORWARD**), позволяющее хождение трафика с **ens33** на **ens32** для пакетов, открывающих новый сеанс, который связан с уже открытым другим сеансом (**RELATED**) и пакетов, которые уже являются частью существующего сеанса (**ESTABLISHED**).
systemctl restart firewalld
для того, чтобы сервер CentOS заработал в качестве шлюза, также необходимо настроить ядро.
Для просмотра созданных данным способом правил используем команду:
firewall-cmd --direct --get-all-rules
===== Проброс портов =====
Проброс настраивается со следующим синтаксисом:
firewall-cmd --add-forward-port=port=<порт прослушивания>:proto=tcp|udp|sctp|dccp:toport=<порт назначения>:toaddr=<куда перенаправить>
Например:
firewall-cmd --zone=external --permanent --add-forward-port=port=25:proto=tcp:toport=8025:toaddr=192.168.0.15
в данном примере мы будем слушать запросы на порту **25** и передодить их на узел **192.168.0.15** и порт **8025**.
===== Запретить или разрешить трафик между интерфейсами =====
Предположим, у нас есть два внутренних сетевых интерфейса ens35 и ens36. Мы хотим контролировать трафик между ними.
==== Запретить ====
Применяется в случаях, когда на сервере включен FORWARD, но необходимо блокировать трафик между определенными сегменами сети.\\
Вводим следующие команды:
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens35 -o ens36 -j DROP
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens36 -o ens35 -j DROP
==== Разрешить ====
Применяется в случаях, когда интерфейсы находятся в зонах, где по умолчанию, трафик блокируется.\\
Для разрешения команды, практически, аналогичные:
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens35 -o ens36 -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens36 -o ens35 -j ACCEPT
==== Разрешить трафик в одном направлении ====
В предыдущих примерах мы разрешали трафик в обоих направлениях. Если необходимо сделать так, чтобы только сеть ens35 видела сеть ens36, вводим одну команду:
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens35 -o ens36 -j ACCEPT
====== Возможные проблемы при работе с firewalld ======
===== Ошибка command not found (команда не найдена). =====
Возможные причины: не установлен пакет или не запущена служба.\\
Выполняем установку пакета firewalld:
yum install firewalld firewall-config
Запускаем службу:
systemctl start firewalld
===== Не применяются правила. =====
Причина: не введена команда перезапуска правил.
Перечитываем правила:
firewall-cmd --reload
Если это не помогло, делаем перезапуск со сбросом подключений:
firewall-cmd --complete-reload
В некоторых случаях, необходимо перезапустить сетевые службы:
systemctl restart network
В исключительных случаях, перезагружаем компьютер:
shutdown -r now
===== The interface is under control of NetworkManager and already bound to the default zone. =====
Ошибка появляется при попытке удалить интерфейс из зоны, настройками которого управляет NetworkManager.\\
Для решения открываем конфигурационный файл для настройки сетевого интерфейса, например:
vi /etc/sysconfig/network-scripts/ifcfg-ens34
И дописываем следующее:
ZONE=external
В данном примере сетевой интерфейс ens34 будет добавлен в зону external.
Перезагружаем сетевую службу:
systemctl restart network