====== 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'' | SNMP SNMP 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 service Custom 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]]