====== Общие команды для управления 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