Firewalld использует сетевые зоны для определения уровня доверия сетевого соединения, соединение может являться частью только одной зоны, но одна зона может определять несколько сетевых подключений.

Для использования в общих случаях создано несколько предопределённых зон:

  • drop - все входящие пакеты отбрасываются (drop) без ответа. Разрешены только исходящие соединения.
  • block - входящие соединения отклоняются (rejected) с ответом icmp-host-prohibited (или icmp6-adm-prohibited). Разрешены только инициированные системой соединения.
  • public - зона по-умолчанию. Из названия ясно, что эта зона нацелена на работу в общественных сетях. Мы не доверяем этой сети и разрешаем только определенные входящие соединения.
  • external - зона для внешнего интерфейса роутера (т.н. маскарадинг). Разрешены только определенные нами входящие соединения.
  • dmz - зона DMZ, разрешены только определенные входящие соединения.
  • work - зона рабочей сети. Мы все еще не доверяем никому, но уже не так сильно, как раньше :) Разрешены только определенные входящие соединения.
  • home - домашняя зона. Мы доверяем окружению, но разрешены только определенные входящие соединения
  • internal - внутренняя зона. Мы доверяем окружению, но разрешены только определенные входящие соединения
  • trusted - разрешено все.

 

Посмотреть список зон можем командой:

# firewall-cmd --get-zones

 

Аргументы ICMP error messages:

icmp-net-unreachable — сеть недоступна;

icmp-host-unreachable — узел недоступен;

icmp-port-unreachable — порт недоступен;

icmp-proto-unreahable — неподдерживаемый протокол;

icmp-net-prohibited — сеть запрещена;

icmp-host-prohibited — узел запрещен.

 

 

Настройка Firewalld на примере Centos 7

Настройка правил может выполняться “на лету” либо через XML.

проверка статуса:

# systemctl status firewalld 

# firewall-cmd --state

 

Проверяем, что разрешено на нашем сервере:

# firewall-cmd --permanent --list-all

 

Просто добавить порт:

# firewall-cmd --permanent --zone=public --add-port=80/tcp

* где ключ --permanent — добавить постоянное правило (будет действовать после перезагрузки).

Удалить порт:

# firewall-cmd --permanent --zone=public --remove-port=80/tcp

Добавить диапазон портов:

# firewall-cmd --permanent --add-port=6500-6700/udp

 

Если в конфигурации сервера не используется IPv6 протокол, то лучше его убрать:

# firewall-cmd --permanent --zone=public --remove-service=dhcpv6-client

---------------------------------------------+

Выбираем новый порт для SSH, но запоминаем его в уме.

Не надо рваться его сразу поменять в настройках SSH, добавим сразу правило для него на постоянной основе (--permanent):

# firewall-cmd --permanent --zone=public --add-port=32784/tcp

 

После каждых изменений перезагружаем правила:

# firewall-cmd --reload

 

Проверяем:

# firewall-cmd --zone=public --list-ports

 

Но SELinux, которую вы, надеюсь, не отключали, не даст подключиться к ssh на нестандартном порте (порт 32784/tcp для sshd - нестандартный). Вы можете этот шаг пропустить и проверить, как сработатет защита SELinux, а можете сразу все настроить:

# yum provides semanage

# yum install policycoreutils-python

# semanage port -a -t ssh_port_t -p tcp 32784



Теперь можно смело изменять настройки SSH в файле  sudo vi /etc/ssh/sshd_config и удалять правило на сервис с 22 портом.

# firewall-cmd --permanent --zone=public --remove-service=ssh

# firewall-cmd --reload

 

Проверяем результат:

# firewall-cmd --list-all

-----------------------------------------------+

Второй вариант настройки - через XML. Рассмотрим на примере настройки SNMP.

Создаем файл /etc/firewalld/services/snmp.xml и указываем в нем:

<?xml version="1.0" encoding="utf-8"?>

<service>

<short>SNMP</short>

<description>SNMP protocol</description>

<port protocol="udp" port="161"/>

</service>

 

Перезагружаем Firewalld:

# firewall-cmd --reload

 

Добавляем правило на постоянной основе:

# firewall-cmd --zone=public --add-service snmp --permanent

 

И снова перезагружаем Firewalld:

# firewall-cmd --reload

 ----------------------------------------------+

Конвертируем правила Iptables в Firewalld

Преобразуем, для примера, следующие правила Iptables

-A INPUT -p tcp --dport 2008 -j DROP

-A INPUT -p udp --sport 1900 -j DROP

-A INPUT -s 127.0.0.0/16 -p tcp --dport 2008 -j ACCEPT

 

В файле /etc/firewalld/zones/public.xml добавляем строчки:

<rule family="ipv4">

<source address="127.0.0.0/16"/>

<port protocol="tcp" port="2008"/>

<accept/>

</rule>

 

Создаем файл /etc/firewalld/services/custom_ports.xml:

<?xml version="1.0" encoding="utf-8"?>

<service>

<short>Custom Ports for service</short>

<description>Custom Ports for my service</description>

<port protocol="tcp" port="2008"/>

<port protocol="udp" port="1900"/>

</service>

 

! Либо всю процедуру можно выполнить следующим образом:

# firewall-cmd --permanent --zone=drop --add-port=2008/tcp

# firewall-cmd --permanent --zone=drop --add-port=1900/udp

# firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.0/16" port port=2008 protocol="tcp" accept'

 

Перезагружаем Firewalld и проверяем:

# firewall-cmd --list-all

------------------------------------------------------------------------------------------------------------------+

Добавление сервиса

Посмотреть список доступных служб:

# 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

------------------------------------------------------------------------------------------------------------------+

Rich-Rule


rich-rule позволяет создавать правила с условиями.
Например, разрешаем службу 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'

------------------------------------------------------------------------------------------------------------------+

Маскарадинг

Данная команда включает маскарадинг для зоны. Адреса частной сети спрятаны за доступным извне IP адресом и привязаны к нему. Это разновидность трансляции адресов, обычно используется в роутерах. Маскарадинг доступен только для IPv4 из-за ограничений ядра.

 

# firewall-cmd --permanent --zone=external --add-masquerade

 

Проверяем статус работы:

# firewall-cmd --zone=external --query-masquerade

 

Перенаправим запросы входящие на настроенный ранее SSH порт на нужный хост:

# firewall-cmd --permanent --zone=external --add-forward-port=port=32784:proto=tcp:toaddr=192.168.2.11

 

Также мы можем перенаправить запросы с изменением порта назначения, например:

# firewall-cmd --permanent --zone=external --add-forward-port=port=22:proto=tcp:toport=32784:toaddr=192.168.2.11

 

Полезные команды при работе в Firewalld

Включить режим блокировки всех исходящих и входящих пакетов:

# firewall-cmd --panic-on

Выключить режим блокировки всех исходящих и входящих пакетов:

# firewall-cmd --panic-off

 

Перезагрузить правила firewalld без потери текущих соединений:

# firewall-cmd --reload

Перезагрузить правила firewalld и сбросить текущие соединения:

# firewall-cmd --complete-reload

 

Добавить к зоне сетевой интерфейс:

# firewall-cmd --permanent --zone=public --add-interface=ens3

 

В конфигурации интерфейса ens3 можно указать, какой зоне принадлежит этот интерфейс. Для этого добавим ZONE=work.

Если параметр ZONE не указан, будет назначена зона по-умолчанию.

 

Разрешить диапазон портов:

# firewall-cmd --zone=public --add-port=9000-9912/udp

Открыть порт MySQL

# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="$IP_or_IP_Range" service name="mysql" accept' --permanent

 

Материалы:

https://bogachev.biz/2017/01/09/%D0%A3%D1%87%D0%B8%D0%BC%D1%81%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C-%D1%81-Firewalld-%D0%9F%D0%B5%D1%80%D0%B2%D1%8B%D0%B5-%D1%88%D0%B0%D0%B3%D0%B8/

https://bozza.ru/art-259.html  -вернуть iptables

https://www.dmosk.ru/miniinstruktions.php?mini=firewalld-centos

https://www.dmosk.ru/miniinstruktions.php?mini=router-centos