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