我在 RHEL 8 上使用 Firewalld,并且还需要添加一些 nftable 规则。
(nftable 规则基于以下问题的答案:CentOS 8 作为带有 nft 和firewalld 的 NAT 路由器-如何让它通过 TFTP?)
在运行的防火墙中,它可以与 nft -f 命令配合使用。
然而,重启后该功能就会丢失。
这RedHat 文档(付费墙后面) 建议使用 nftables.service 服务在重启时加载规则,但这与防火墙不兼容。这两项服务被列为冲突,即使它们不冲突,防火墙也可能会刷新 nftable 规则。
还有其他方法可以让 nftable 规则在重启时加载吗?
答案1
这防火墙实用程序,使用时nftables后端,不会刷新不属于它的表:
仅刷新firewalld的规则
由于 nftables 允许命名空间(通过表)firewalld 不再完全刷新防火墙规则。它只会刷新 防火墙表。这可以避免在重新启动或重新加载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 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
这将留下防火墙的规则。同样,停止或重新启动防火墙将保留这些规则。
可能需要做以下改进:
- nftables有一个包括可以以某种方式使用语句来避免样板的重复。
nf_nat_tftp
关于 TFTP 的具体示例依赖于不会自动加载(nf_conntrack_tftp
与规则中的引用自动加载相反,或与防火墙这将nf_nat_tftp
明确加载)。因此相关但不严格nftables应牢记配置(这一设置可以简单地放入/etc/modules-load.d/
)。