RHEL / CentOS Теперь, чтобы добавить настраиваемые правила в firewalld при загрузке системы?
Я использую firewalld на RHEL 8, и мне также нужно добавить несколько правил nftable.
(Правила nftable основаны на ответе на CentOS 8 как маршрутизатор NAT с nft и firewalld - как заставить его проходить TFTP? )
В работающем брандмауэре это хорошо работает с командой nft -f.
Однако при перезагрузке это теряется.
В документации RedHat (за платным доступом) предлагается использовать службу nftables.service для загрузки правил при перезагрузке, но это не работает в сочетании с firewalld. Эти две службы указаны как конфликтующие, и даже если бы это было не так, firewalld, скорее всего, сбросил бы правила nftable.
Есть ли другой способ загрузить правила nftable при перезапуске?
Ответы
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/
).