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

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

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

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

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

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

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

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

решение1

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

Только сбросить правила firewalld

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

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

На самом деле в предыдущем ответе это уже сделано:nftablesправила идемпотентно удаляеттолькоих собственная таблица: 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 футаблица, если она существовала ранее в это время.

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

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

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

в /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's правила на месте. Аналогично, остановка или перезапускfirewalldоставим эти правила в силе.

Вероятно, необходимо внести улучшения:

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

Связанный контент