RHEL/CentOS 现在要在系统启动时向firewalld添加nftable规则吗?

RHEL/CentOS 现在要在系统启动时向firewalld添加nftable规则吗?

我在 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/)。

相关内容