Сетевые технологии

Полный обзор Firewalld

Firewalld — динамически управляемый брандмауэр с поддержкой зон сети, который определяет уровень доверия сетевых подключений или интерфейсов.

Он поддерживает IPv4, настройки брандмауэра IPv6, мосты Ethernet и IP-наборы.

Firewalld несмотря на собственный синтаксис, имеет такой же принцип работы, как iptables.

Firewalld фильтрует входящий трафик по различным зонам в зависимости от конкретных правил, применяемых к каждой зоне. При определении зоны для входящего соединения будет применяться следующая логика:

  • Если IP-адрес отправителя соответствует определенным для зоны значениям, то пакет будет направляться через эту зону. Если этот адрес не соответствует ни одной зоне, то проверяется соответствие входящего интерфейса пакета фильтру зоны, и в случае такого соответствия используется эта зона.
  • Во всех остальных случаях используется зона по умолчанию, изначально заданная как public. Для нее предполагается, что вы не доверяете другим компьютерам в сети и разрешаете работу только ограниченного числа служб.

В firewalld есть ряд зон с предварительно настроенными разрешениями для различных служб. Можно изменять эти настройки или создавать собственные зоны. Список зон:

drop — минимальный уровень доверия. Все входящие соединения блокируются без ответа, допускаются только исходящие соединения.

block — аналогично предыдущему, но при отклонении входящих запросов отправляется сообщение icmp-host-prohibited или icmp6-adm-prohibited.

public — представляет общественные, недоверенные сети. Вы не доверяете другим компьютерам, но можете разрешать избранные входящие соединения в индивидуальном порядке.

external — внешние сети при использовании брандмауэра в качестве шлюза. Она настроена для маскирования NAT, поэтому внутренняя сеть остается частной, но доступной.

internal — внутренняя сторона шлюза. Компьютеры обладают достаточным уровнем доверия, доступен ряд дополнительных служб.

dmz — используется для компьютеров, расположенных в DMZ («демилитаризованная зона», изолированные компьютеры без доступа к остальной сети). Разрешены только определенные входящие соединения.

work — используется для рабочих машин. Доверять большинству компьютеров в сети. Может быть разрешено еще несколько служб.

home — домашняя среда. Обычно означает, что вы доверяете большинству других компьютеров и разрешаете работу еще нескольких служб.

trusted — доверять всем машинам в сети. Наиболее открытая из всех доступных опций, должна использоваться с осторожностью.

Firewalld имеет ряд функций:
1. API D-Bus.
2. Временные правила брандмауэра.
3. Богатый язык для описания правил брандмауэра.
4. Поддержка IPv4 и IPv6 NAT.
5. Зоны межсетевого экрана.
6. Поддержка IP-набора.
7. Логи отклоненных пакетов.
8. Прямой интерфейс.
9. Lockdown: Белый список приложений, которые могут изменить брандмауэр.
10. Поддержка iptables, ip6tables, ebtables и брандмауэров ipset firewall.
11. Автоматическая загрузка модулей ядра Linux.
12. Интеграция с Puppet.

Установка Firewalld

Перед установкой Firewalld нужно убедиться, что остановлен iptables. Для этого необходимо ввести:
sudo systemctl stop iptables
Затем убедитесь, что iptables больше не используется вашей системой:
sudo systemctl mask iptables
Проверяем состояние iptables:
sudo systemctl status iptables

Ubuntu/Debian

Чтобы установить Firewalld на Ubuntu, сначала необходимо удалить UFW. Чтобы удалить UFW, выполните команду:
sudo apt-get remove ufw
Команда для установки Firewalld
sudo apt-get install firewall-applet 

RHEL, CentOS & Fedora

Команда для установки:
sudo yum install firewalld firewall-config -y

Общие команды для управления firewalld

После каждой модификации вам нужно перезагрузить Firewalld, чтобы изменения вступили в силу. Команда для автоматического запуска:
systemctl enable firewalld
Запретить автозапуск:
systemctl disable firewalld
Команда для запуска службы:
systemctl start firewalld
Узнаем статус службы:
sudo systemctl status firewalld
Посмотреть состояние:
firewall-cmd --state
Мягко перечитать правила (применить настройки):
firewall-cmd --reload
Перечитать правила и сбросить текущие подключения:
firewall-cmd --complete-reload
Посмотреть созданные правила:
firewall-cmd --list-all
Сохранить текущие правила, сделав их постоянными (permanent):
firewall-cmd --runtime-to-permanent

Управление правилами

Чтобы правила применялись, не забываем их перечитывать (—reload). Общий синтаксис для работы с правилами:
firewall-cmd [опции] [зона] [правило]
[опции] — дополнительные параметры для создаваемого правила, например —permanent — постоянное правило, то есть будет действовать после перезагрузки. Не обязательный.
[зона] — по умолчанию, правила создаются для зоны public. Для работы с конкретной зоной ее необходимо указать, например, —zone=dmz. Не обязательный.
[правило] — само правило. Обязательный.

Добавление портов

Открыть порт 80:
firewall-cmd --permanent --add-port=80/tcp
# ключ --permanent — добавить постоянное правило (будет действовать после перезагрузки).

Добавить правило для определенной зоны:
firewall-cmd --permanent --zone=external --add-port=80/tcp

Добавить диапазон портов:
firewall-cmd --permanent --add-port=6500-6700/udp

Добавить несколько правил одной командой:
firewall-cmd --permanent --add-port=80/tcp --add-port=443/tcp

Добавление сервиса

Посмотреть список доступных служб:
firewall-cmd --get-services
Разрешить порт для сервиса ntp:
firewall-cmd --permanent --add-service=ntp
Создать собственную службу:
firewall-cmd --permanent --new-service=name-service
# name-service — произвольное имя создаваемой службы
Добавить порт, например TCP 2200 к службе:
firewall-cmd --permanent --service=name-service --add-port=2200/tcp
Информацию о созданном сервисе можно получить командой:
firewall-cmd --info-service=name-service
Созданную службу можно использовать для создания правил, например:
firewall-cmd --permanent --add-service=name-service

Rich-Rule

rich-rule позволяет создавать правила с условиями. Рассмотрим несколько примеров:
Разрешаем службу http с условием, что запросы будут с определенных IP-адресов (подсети 192.168.0):
firewall-cmd --permanent --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
Чтобы заблокировать подсеть можно воспользоваться командой:
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject"
Список правил с условиями можно отобразить командой:
firewall-cmd --list-rich-rules

Удаление правил

Удаляем правило для открытия 80 порта:
firewall-cmd --permanent --remove-port=80/tcp

Управление зонами

Посмотреть список всех имеющихся зон:
firewall-cmd --list-all-zones
Посмотреть список используемых зон:
firewall-cmd --get-active-zones
Информация о конкретной зоне:
firewall-cmd --list-all --zone=public
Создать правило для зоны public:
firewall-cmd --permanent --zone=public --add-port=80/tcp
Добавить сетевой интерфейс в зону:
# сначала нужно удалить адаптер из текущей зоны
firewall-cmd --permanent --zone=public --remove-interface=ens192

# добавляем сетевой интерфейс в зону
firewall-cmd --permanent --zone=internal --add-interface=ens192
Задать действие по умолчанию для зоны:
firewall-cmd --permanent --zone=public --set-target=DROP
Создать новую зону:
firewall-cmd --permanent --new-zone=new_zone
firewall-cmd --reload
# чтобы система увидела новую зону new_zone, команда reload обязательная.

Пример настройки NAT (шлюза)

NAT — это специальный механизм, реализованный в сетях TCP/IP, который позволяет изменять ip-адреса пересылаемых пакетов, т.е. тех внутренних ip, которые присылаются на сетевой шлюз — в глобальные для дальнейшей отправки во внешний интернет.
Включить маскарадинг:
Маскарадинг — это подмена некоторых параметров в заголовках IP-пакетов, позволяющая машинам, не имеющим реальных IP-адресов, практически полноценно работать в интернете.
firewall-cmd --permanent --zone=dmz --add-masquerade
# без указания зон, будет включен для public и external

Проброс портов

Проброс настраивается со следующим синтаксисом:
firewall-cmd --add-forward-port=port=[порт прослушивания]:proto=tcp|udp|sctp|dccp:toport=[порт назначения]:toaddr=[куда перенаправить]

Запретить трафик между интерфейсами

Применяется в случаях, когда на сервере включен FORWARD, но необходимо блокировать трафик между определенными сегменами сети.
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens192 -o ens224 -j DROP
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens224 -o ens192 -j DROP

Разрешить трафик в одном направлении

firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens192 -o ens224 -j ACCEPT
Firewalld