====== Firewalld. Учимся работать. ======
Выполняем первые шаги в настройке службы Firewalld.
Предлагаю рассмотреть более детальную настройку на рабочих примерах.
===== Концепция зон Firewalld =====
**Firewalld** использует сетевые зоны для определения уровня доверия сетевого соединения, соединение может являться частью только одной зоны, но одна зона может определять несколько сетевых подключений.
Для использования в общих случаях создано несколько предопределённых зон:
* ''drop'' – входящие сетевые пакеты сбрасываются, без ответа, допускаются только исходящие соединения;
* ''block'' – входящие сетевые соединения отклоняются с сообщением ''icmp-host-prohibited'', допускаются только сетевые соединения инициированные внутри нашей системы;
* ''public'' – при недоверии к компьютерам, разрешается устанавливать только конкретные входящие соединения;
* ''external'' – для использования во внешних сетях с разрешенным маскарадингом, особенно для роутеров, разрешается устанавливать только конкретные входящие соединения;
* ''dmz'' – для компьютеров собственной ''demilitarized zone'' которые публично доступны с ограниченным доступом к нашей внутренней сети, разрешается устанавливать только конкретные входящие соединения;
* ''work/home/internal'' – максимальное доверие к компьютерам, уверенность в том, что они не приченяет вреда нашему компьютеру, разрешается устанавливать только конкретные входящие соединения;
* ''trusted'' – все сетевые соединения разрешены.
Посмотреть список зон можем командой:
|
# firewall-cmd --get-zones
work drop internal external trusted home dmz public block
|
Аргументы **ICMP error messages**:
''icmp-net-unreachable'' — сеть недоступна; ''icmp-host-unreachable'' — узел недоступен; ''icmp-port-unreachable'' — порт недоступен; ''icmp-proto-unreahable'' — неподдерживаемый протокол; ''icmp-net-prohibited'' — сеть запрещена; ''icmp-host-prohibited'' — узел запрещен.
==== Настройка правил ====
Настройка правил может выполняться “на лету” либо через **XML**. Предлагаю начать с настройки правила для нестандартного порта, например для **SSH**.
Проверяем, что разрешено на нашем сервере:
|
# firewall-cmd --permanent --list-all
public (default)
interfaces:
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
|
Если в конфигурации сервера не используется **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
32784/tcp
|
Отлично. Теперь можно смело изменять настройки **SSH** и удалять правило на сервис с 22 портом.
|
# firewall-cmd --permanent --zone=public --remove-service=ssh
# firewall-cmd --reload
|
Проверяем результат:
|
# firewall-cmd --list-all
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services:
ports: 32784/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
|
Второй вариант настройки - через **XML**. Рассмотрим на примере настройки **SNMP**.
Создаем файл ''/etc/firewalld/services/snmp.xml''
|SNMPSNMP protocol |
Перезагружаем **Firewalld**:
|
# firewall-cmd --reload
|
Добавляем правило на постоянной основе:
|
# firewall-cmd --zone=public --add-service snmp --permanent
|
И снова перезагружаем **Firewalld**:
|
# firewall-cmd --reload
|
==== Конвертируем правила Iptables в Firewalld ====
Многих пугает переход с **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'' добавляем строчки:
| |
Создаем файл ''/etc/firewalld/services/custom_ports.xml'':
|Custom Ports for serviceCustom Ports for my 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
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: snmp
ports: 32784/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="127.0.0.0/16" port port="2008" protocol="tcp" accept
|
|
drop
interfaces:
sources:
services:
ports: 2008/tcp 900/udp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
|
==== Маскарадинг ====
Данная команда включает маскарадинг для зоны. Адреса частной сети спрятаны за доступным извне IP адресом и привязаны к нему. Это разновидность трансляции адресов, обычно используется в роутерах. Маскарадинг доступен только для **IPv4** из-за ограничений ядра.
|
# firewall-cmd --zone=external --add-masquerade
|
Проверяем статус работы:
|
# firewall-cmd --zone=external --query-masquerade
|
Перенаправим запросы входящие на настроенный ранее **SSH** порт на нужный хост:
|
# firewall-cmd --zone=external --add-forward-port=port=32784:proto=tcp:toaddr=192.168.2.11
|
Также мы можем перенаправить запросы с изменением порта назначения, например:
|
# firewall-cmd --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
|
Проверить режим “паника”:
|
# firewall-cmd --query-panic
|
Перезагрузить правила **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://fedoraproject.org/wiki/Firewalld?rd=FirewallD|FedoraProject]]