Firewalld
Служба firewalld включена в репозиторий RHEL7 и выше, а также в дистрибутивы созданные на базе RHEL (CentOS, Fedora, Oracle Linux, Roky Linux, и т.д.).
Установка
# RHEL 7 yum install firewalld # RHEL 8 dnf install firewalld
Принцип работы
Непосредственную функцию файрвола выполняет ядро линукса. В современных ядрах используется формат правил nftables, в старых ядрах формат iptables. Ядро имеет только оперативную конфигурацию, которая хранится в памяти пока система работает. Чтобы в опреативной конфигурации появились какие-либо правила их туда нужно записать после старта системы. Этим занимаются такие сервисы как iptables, nftables, firewalld и т.д. Все они записывают в ядро правила в формате ядра, генерируя их из своего формата определения правил. Не стоит путать часть ядра линукс nftables и сервис nftables. Для работы ядра устанавливать сервис nftables не нужно.
Конфигурация сервиса nftables осуществляется утилитой nft, которая устанавливается в составе пакета сервиса. Утилита iptables включена в базовые пакеты и для ее работы не нужно устанавливать сервис iptables. Данная утилита конвертирует правила из своего формата в формат nftables и пишет их напрямую в ядро, изменять конфигурацию сервиса iptables она не умеет.
Конфигурация
# файл общей конфигурации сервиса cat /etc/firewalld/firewalld.conf # файлы конфигурации зон ls /etc/firewalld/zones # файлы конфигурации сервисов (кроме определенных по умолчанию) ls /etc/firewalld/services # вывод конфигурации всех зон firewall-cmd --list-all-zones # пример добавления правил в конфигурацию firewall-cmd --zone=public --add-port=8080/tcp --permanent firewall-cmd --zone=public --add-service=ssh --permanent firewall-cmd --reload
Именованные списки, работает начиная с версии 0.4.0
# создание именнованного списка firewall-cmd --permanent --new-ipset=IP-whitelist --type=hash:ip firewall-cmd --permanent --new-ipset=NET-whitelist --type=hash:net # добавление записей в именованный список firewall-cmd --permanent --ipset=IP-whitelist --add-entry=192.168.1.4 firewall-cmd --permanent --ipset=NET-whitelist --add-entry=192.168.2.0/24 firewall-cmd --permanent --ipset=NET-whitelist --add-entry="192.168.5.0-192.168.7.0" # добавление записей в именованный список из файла firewall-cmd --permanent --ipset=NET-whitelist --add-entries-from-file=whitelist.txt # удаление записей из именованного списка firewall-cmd --permanent --ipset=IP-whitelist --remove-entry=192.168.1.4 firewall-cmd --permanent --ipset=NET-whitelist --remove-entry=192.168.2.0/24 firewall-cmd --permanent --ipset=NET-whitelist --remove-entry="192.168.5.0-192.168.7.0" # удаление записей из именованного списка по списку из файла firewall-cmd --permanent --ipset=NET-whitelist --remove-entries-from-file=remove.txt # использование именованных списков в правилах firewall-cmd --permanent --zone=trusted --add-source=ipset:IP-whitelist firewall-cmd --permanent --zone=trusted --add-source=ipset:NET-whitelist firewall-cmd --permanent --zone=trusted --remove-source=ipset:IP-whitelist firewall-cmd --permanent --zone=trusted --remove-source=ipset:NET-whitelist # удаление именованного списка firewall-cmd --permanent --delete-ipset=IP-whitelist firewall-cmd --permanent --delete-ipset=NET-whitelist # вывод списка именованных списков firewall-cmd --get-ipsets # вывод содержимого конкретного именованного списка firewall-cmd --ipset=IP-whitelist --get-entries
Блокировка установленных сессий
Правила в зоне drop блокируют только новые подключения. Если сессия установлена, то трафик будет проходить пока она не разорвется. Это объясняется наличием разрешающего правила на установленные ESTABLISHED сессии.
# iptables -L | head Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere INPUT_direct all -- anywhere anywhere
Чтобы заблокировать трафик установленной ESTABLISHED сессии, необходимо добавить правило блокировки выше разрешающего, но способа это сделать через firewall-cmd я не нашел. Правила rich и direct добавляются ниже. Единственный рабочий способ который я пока нашел, это добавить правило через iptables.
iptables -I INPUT 1 -m set --match-set IP-blacklist src -j DROP
Но необходимо учитывать, что правила добавленные напрямую в ядро будут сброшены при выполнении команды
firewall-cmd --reload
Стандартные зоны
1. Зоны для доверенных сетей
trusted (Доверенная): Самая открытая зона. Разрешены абсолютно все входящие соединения. Используется крайне редко, например, для интерфейсов внутри изолированной тестовой лаборатории.
home (Домашняя): Для сетей, где вы доверяете окружающим. Разрешены сервисы: ssh, mdns, ipp-client, samba-client и dhcpv6-client.
internal (Внутренняя): Аналог home. Используется для внутренних сетей компаний. Набор разрешенных сервисов такой же.
2. Зоны общего назначения
work (Рабочая): Для рабочих мест. Доверие чуть выше, чем в публичных местах. Разрешены ssh, ipp-client и dhcpv6-client.
public (Публичная): Зона по умолчанию для всех новых интерфейсов. Вы не доверяете никому в сети. Разрешен только ssh и dhcpv6-client. Всё остальное блокируется.
3. Зоны с ограничениями
external (Внешняя): Специальная зона для роутеров (где включен NAT). Входящий трафик почти весь закрыт (кроме ssh), но исходящий трафик «маскируется» под IP-адрес этого интерфейса.
dmz (Демилитаризованная зона): Для серверов, которые должны быть доступны извне, но ограничены в доступе к остальной вашей сети. Разрешен только ssh.
4. Зоны блокировки (Самые безопасные)
block (Блокирующая): Все входящие соединения отклоняются с ответом icmp-host-prohibited (или icmp6-adm-prohibited). То есть отправитель получит сообщение, что связь запрещена.
drop (Сброс): Самый высокий уровень безопасности. Все входящие пакеты просто удаляются без ответа. Отправитель не получит ничего и будет ждать по тайм-ауту. Именно её часто требуют стандарты вроде PCI DSS для минимизации «шума» от сервера.