Учимся работать с Firewalld. Первые шаги.

Учимся работать с Firewalld. Первые шаги.

Roman Bogachev VMware Specialist | Drone Pilot | Traveler

Выполняем первые шаги в настройке службы Firewalld.

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

Концепция зон Firewalld

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

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

  • drop – входящие сетевые пакеты сбрасываются, без ответа, допускаются только исходящие соединения;
  • block – входящие сетевые соединения отклоняются с сообщением icmp-host-prohibited, допускаются только сетевые соединения инициированные внутри нашей системы;
  • public – при недоверии к компьютерам, разрешается устанавливать только конкретные входящие соединения;
  • external – для использования во внешних сетях с разрешенным маскарадингом, особенно для роутеров, разрешается устанавливать только конкретные входящие соединения;
  • dmz – для компьютеров собственной demilitarized zone которые публично доступны с ограниченным доступом к нашей внутренней сети, разрешается устанавливать только конкретные входящие соединения;
  • work/home/internal – максимальное доверие к компьютерам, уверенность в том, что они не приченяет вреда нашему компьютеру, разрешается устанавливать только конкретные входящие соединения;
  • trusted – все сетевые соединения разрешены.

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

1
2
# 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.

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

1
2
3
4
5
6
7
8
9
10
# firewall-cmd --permanent --list-all
public (default)
interfaces:
sources:
services: dhcpv6-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

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

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

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

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

Перезагрузим правила:

1
# firewall-cmd --reload

Проверяем:

1
2
# firewall-cmd --zone=public --list-ports
32784/tcp

Отлично. Теперь можно смело изменять настройки SSH и удалять правило на сервис с 22 портом.

1
2
# firewall-cmd --permanent --zone=public --remove-service=ssh
# firewall-cmd --reload

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 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

1
2
3
4
5
6
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>SNMP</short>
<description>SNMP protocol</description>
<port protocol="udp" port="161"/>
</service>

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

1
# firewall-cmd --reload

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

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

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

1
# firewall-cmd --reload

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

Многих пугает переход с Iptables на Firewalld из-за того, что нет привычного вида правил и это заблуждение.

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

1
2
3
-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 добавляем строчки:

1
2
3
4
5
<rule family="ipv4">
<source address="127.0.0.0/16"/>
<port protocol="tcp" port="2008"/>
<accept/>
</rule>

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

1
2
3
4
5
6
7
<?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>

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

1
2
3
# 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 и проверяем:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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
1
2
3
4
5
6
7
8
9
drop
interfaces:
sources:
services:
ports: 2008/tcp 900/udp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Маскарадинг

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

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

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

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

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

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

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

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

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

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

1
# firewall-cmd --panic-on

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

1
# firewall-cmd --panic-off

Проверить режим “паника”:

1
# firewall-cmd --query-panic

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

1
# firewall-cmd --reload

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

1
# firewall-cmd --complete-reload

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

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

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

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

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

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

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

Более подробную информацию, а также описание всех возможностей можно найти на сайте FedoraProject