Firewalld

Материал из sysadm
Перейти к навигации Перейти к поиску

Служба 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