RHEL / CentOS Теперь, чтобы добавить настраиваемые правила в firewalld при загрузке системы?

Dec 15 2020

Я использую firewalld на RHEL 8, и мне также нужно добавить несколько правил nftable.

(Правила nftable основаны на ответе на CentOS 8 как маршрутизатор NAT с nft и firewalld - как заставить его проходить TFTP? )

В работающем брандмауэре это хорошо работает с командой nft -f.

Однако при перезагрузке это теряется.

В документации RedHat (за платным доступом) предлагается использовать службу nftables.service для загрузки правил при перезагрузке, но это не работает в сочетании с firewalld. Эти две службы указаны как конфликтующие, и даже если бы это было не так, firewalld, скорее всего, сбросил бы правила nftable.

Есть ли другой способ загрузить правила nftable при перезапуске?

Ответы

2 A.B Dec 15 2020 at 18:45

Firewalld утилита, при использовании nftables бэкенд, не будет скрытой таблицы , которые не принадлежат к нему :

Только правила Firewalld

Поскольку nftables позволяет использовать пространства имен (через таблицы), firewalld больше не выполняет полную очистку правил межсетевого экрана . Он только сбрасывает правила в таблице firewalld . Это позволяет избежать сценариев, в которых пользовательские правила или правила, установленные другими инструментами, неожиданно стираются при перезапуске или перезагрузке firewalld.

То же самое нужно сделать и при управлении другими таблицами.

На самом деле в предыдущем ответе, это уже сделано: nftables правила idempotently удаляет только свою собственную таблицу: handletftp.

К сожалению, nftables.serviceдля стоп- действия это не так:

ExecStop=/sbin/nft flush ruleset

Надо просто убедиться, что часть остановки службы systemd не сбрасывает все правила напрямую, продолжая выполнять свою работу. Это задание будет делегировано в специальные правила nftables для действия остановки .

Итак, вот практический метод: дублировать (например systemctl cat nftables.services:) и nftables.serviceпреобразовать в созданную версию, которую [email protected]нужно вставить /etc/systemd/system/[email protected]:

[Unit]
Description=Idempotent nftables rules for %I
Wants=network-pre.target
Before=network-pre.target

[Service]
Type=oneshot
ProtectSystem=full
ProtectHome=true
ExecStart=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# As the rules are idempotent, ExecReload is same as ExecStart
ExecReload=/sbin/nft -f /etc/nftables/idempotent/%I.nft
# The stop rules should only have the first boilerplate parts
ExecStop=/sbin/nft -f /etc/nftables/idempotent/stop-%I.nft
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Создайте специальный каталог конфигурации, использованный выше:

mkdir -p /etc/nftables/idempotent

Разместите правила, которые для каждой определенной таблицы всегда начинаются так, поэтому загрузка правил не зависит от других таблиц и идемпотента (пример с таблицами ip fooи bridge bar):

table ip foo
delete table ip foo

table bridge bar
delete table bridge bar

table ip foo {
    ...
}

table bridge bar {
    ....
}

или просто используйте одну таблицу для каждого файла. flush rulesetЗаявление запрещено , так как это глобальная.

Причина, по которой таблица создается, удаляется и воссоздается, состоит в том, чтобы получить идемпотентный результат: удаление несуществующей таблицы является ошибкой и атомарно приведет к сбою всей загрузки, объявив существующую таблицу без ее определения (путем добавления пустой таблицы) никогда не дает сбоев и ничего не делает, кроме создания пустого, если его раньше не было. В обоих случаях (не существует при загрузке, существует при перезагрузке) удаление теперь может работать, оставляя место для реального определения таблицы сразу после этого. Все это происходит в одной транзакции и по-прежнему является атомарным: ни один пакет никогда не будет оцениваться с отсутствующей таблицей ip foo, если она существовала ранее во время этого.

Подготовьте стоп- версию, описанную выше, которая будет только удалять (здесь пустые объявления не являются строго необходимыми и могут быть удалены, если была только одна таблица, но должны быть сохранены, если таблиц больше одной: сбой для всей транзакции):

table ip foo
delete table ip foo

table bridge bar
delete table bridge bar

и поместите все на свои места:

/etc/nftables/idempotent/foobar.nft
/etc/nftables/idempotent/stop-foobar.nft

Теперь это можно активировать с помощью:

systemctl enable --now local-idempotent-nft@foobar

Пример из предыдущего вопроса OP:

в /etc/nftables/idempotent/handletftp.nft:

table ip handletftp
delete table ip handletftp

table ip handletftp {
    ct helper helper-tftp {
        type "tftp" protocol udp
    }

    chain sethelper {
        type filter hook forward priority 0; policy accept;
        ip saddr 192.168.1.0/24 ip daddr 10.0.10.10 udp dport 69 ct helper set "helper-tftp"
    }
}

В /etc/nftables/idempotent/stop-handletftp.nft

table ip handletftp
delete table ip handletftp

Включение и запуск:

systemctl enable --now local-idempotent-nft@handletftp

Остановка:

systemctl stop local-idempotent-nft@handletftp

что оставит правила firewalld на месте. Аналогичным образом, остановка или перезапуск firewalld оставит эти правила в силе.

Вероятно, есть улучшения, которые нужно сделать:

  • В nftables есть оператор include, который можно как-то использовать, чтобы избежать дублирования шаблона.
  • конкретный пример с TFTP полагается на то, что загрузка nf_nat_tftpне будет выполняться автоматически (в отличие от того, nf_conntrack_tftpчто автоматически загружается из ссылки в правилах или в отличие от firewalld, которая загружается nf_nat_tftpявно). Поэтому следует иметь в виду связанные, но не строго nftables конфигурации (этот параметр можно просто ввести /etc/modules-load.d/).