Учимся работать с Firewalld. Первые шаги.
Выполняем первые шаги в настройке службы Firewalld.
В статье Знакомство с Firewalld я коротко рассказал о том, что из себя представляет данный инструмент.
Предлагаю рассмотреть более детальную настройку на рабочих примерах.
Концепция зон Firewalld
Firewalld использует сетевые зоны для определения уровня доверия сетевого соединения, соединение может являться частью только одной зоны, но одна зона может определять несколько сетевых подключений.
Для использования в общих случаях создано несколько предопределённых зон:
drop
– входящие сетевые пакеты сбрасываются, без ответа, допускаются только исходящие соединения;block
– входящие сетевые соединения отклоняются с сообщениемicmp-host-prohibited
, допускаются только сетевые соединения инициированные внутри нашей системы;public
– при недоверии к компьютерам, разрешается устанавливать только конкретные входящие соединения;external
– для использования во внешних сетях с разрешенным маскарадингом, особенно для роутеров, разрешается устанавливать только конкретные входящие соединения;dmz
– для компьютеров собственнойdemilitarized zone
которые публично доступны с ограниченным доступом к нашей внутренней сети, разрешается устанавливать только конкретные входящие соединения;work/home/internal
– максимальное доверие к компьютерам, уверенность в том, что они не приченяет вреда нашему компьютеру, разрешается устанавливать только конкретные входящие соединения;trusted
– все сетевые соединения разрешены.
Посмотреть список зон можем командой:
1 | # 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
— узел запрещен.
Настройка правил
Настройка правил может выполняться “на лету” либо через XML.
Предлагаю начать с настройки правила для нестандартного порта, например для SSH.
Проверяем, что разрешено на нашем сервере:
1 | # firewall-cmd --permanent --list-all |
Если в конфигурации сервера не используется 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 | # firewall-cmd --zone=public --list-ports |
Отлично. Теперь можно смело изменять настройки SSH и удалять правило на сервис с 22 портом.
1 | # firewall-cmd --permanent --zone=public --remove-service=ssh |
Проверяем результат:
1 | # firewall-cmd --list-all |
Второй вариант настройки - через XML.
Рассмотрим на примере настройки SNMP.
Создаем файл /etc/firewalld/services/snmp.xml
1 |
|
Перезагружаем 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 | -A INPUT -p tcp --dport 2008 -j DROP |
В файле /etc/firewalld/zones/public.xml
добавляем строчки:
1 | <rule family="ipv4"> |
Создаем файл /etc/firewalld/services/custom_ports.xml
:
1 |
|
Либо всю процедуру можно выполнить следующим образом:
1 | # firewall-cmd --permanent --zone=drop --add-port=2008/tcp |
Перезагружаем Firewalld и проверяем:
1 | # firewall-cmd --list-all |
1 | drop |
Маскарадинг
Данная команда включает маскарадинг для зоны. Адреса частной сети спрятаны за доступным извне 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