Настройка firewalld в CentOS
Firewalld — утилита для управления встроенным в ядро Linux брандмауэром Netfilter. Несмотря на собственный синтаксис, имеет такой же принцип работы, как Iptables.
Установка и запуск
В некоторых системах CentOS может не оказаться firewalld. Для его установки вводим:
yum install firewalldДля автоматического запуска вводим:
systemctl enable firewalldИ для запуска службы:
systemctl start firewalldОбщие команды для управления 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Управление правилами
Рассмотрим разные варианты управления фаервольными правилами c помощью firewalld.
Синтаксис
Общий синтаксис для работы с правилами:
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Добавление сервиса из xml-файла
Данный способ добавления сервиса будет удобен для создания готовых шаблонов с правилами. Их можно использовать при поставке конфигурации или программного обеспечения.
Пример файла:
vi my-app.xml
  my-app
  Provides HTTP Access to my-app application
  
* в моем примере будет создан шаблон для сервиса с именем my-app, который откроет порт 8080/tcp.
Теперь можно добавить сам сервис. Для этого есть два способа.
а) Использовать опцию --new-service-from-file:
firewall-cmd --permanent --new-service-from-file=my-app.xmlб) Перенести его в каталог /usr/lib/firewalld/services:
mv my-app.xml /usr/lib/firewalld/services/Сервис подгружен.
Теперь, чтобы с ним можно было работать, перезапустим firewalld:
firewall-cmd --reloadИнформацию о созданном сервисе можно получить командой:
firewall-cmd --info-service=my-appТеперь созданную службу можно использовать для создания правил, например:
firewall-cmd --permanent --add-service=my-appRich-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
1. Ошибка command not found (команда не найдена).
Возможные причины: не установлен пакет или не запущена служба.
Выполняем установку пакета firewalld:
yum install firewalld firewall-configЗапускаем службу:
systemctl start firewalld2. Не применяются правила.
Причина: не введена команда перезапуска правил.
Перечитываем правила:
firewall-cmd --reloadЕсли это не помогло, делаем перезапуск со сбросом подключений:
firewall-cmd --complete-reloadВ некоторых случаях, необходимо перезапустить сетевые службы:
systemctl restart networkВ исключительных случаях, перезагружаем компьютер:
shutdown -r now3. The interface is under control of NetworkManager and already bound to the default zone.
Ошибка появляется при попытке удалить интерфейс из зоны, настройками которого управляет NetworkManager.
Для решения открываем конфигурационный файл для настройки сетевого интерфейса, например:
vi /etc/sysconfig/network-scripts/ifcfg-eth0И дописываем следующее:
ZONE=external* в данном примере сетевой интерфейс eth0 будет добавлен в зону external.
Перезагружаем сетевую службу:
systemctl restart network
                    
                                
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.