
Я использую 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/
).