Выполняем первые шаги в настройке службы 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
<?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 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 |
Включить режим блокировки всех исходящих и входящих пакетов:
# 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 |
Более подробную информацию, а также описание всех возможностей можно найти на сайте FedoraProject