我在 RHEL 8 上使用 firewalld,并且还需要添加一些 nftable 规则。
(nftable 规则基于对CentOS 8 作为 NAT 路由器的回答,带有 nft 和 firewalld - 如何让它通过 TFTP?)
在正在运行的防火墙中,这与 nft -f 命令配合得很好。
但是,这会在重新启动时丢失。
RedHat 文档(在付费墙后面)建议使用 nftables.service 服务在重新启动时加载规则,但这不能与 firewalld 一起使用。这两个服务被列为冲突,即使它们不是,firewalld 也可能会刷新 nftable 规则。
是否有另一种方法可以让 nftable 规则在重新启动时加载?
使用nftables后端时,firewalld实用程序不会刷新不属于它的表:
在管理其他表时也必须这样做。
实际上在前面的答案中,它已经完成了:nftables规则幂等地只删除他们自己的 table:
handletftp
。可悲的是,
nftables.service
停止操作并非如此:必须确保 systemd 服务的停止部分在仍在执行工作时不会直接刷新所有规则。该作业将被委派给停止操作的专用nftables规则。
所以这是一个实用的方法:复制(例如:)
systemctl cat nftables.services
并更改为要放入nftables.service
的实例化版本:[email protected]
/etc/systemd/system/[email protected]
创建上面使用的专用配置目录:
放置规则,对于定义的每个表,总是这样开始,因此加载规则独立于其他表和幂等(例如表
ip foo
和bridge bar
):或者每个文件只使用一个表。该
flush ruleset
声明被禁止,因为它是全球性的。创建,删除和重新创建表的原因是为了获得结果幂等性:虽然删除不存在的表是一个错误,并且会原子地使整个加载失败,声明一个现有的表而不定义它(通过添加一个空表)如果它以前不存在,则永远不会失败并且除了将其创建为空之外什么都不做。在这两种情况下(在启动时不存在,在重新加载时存在)删除现在可以工作,留下真正定义表的地方。所有这些都发生在同一个事务中并且仍然是原子的:如果在此期间之前存在丢失的 ip foo 表,则不会使用丢失的ip foo表来评估任何数据包。
准备上面的停止版本,它只会删除(这里的空声明不是严格需要的,如果只有一个表可以删除,但如果有多个表则应该保留:失败是针对整个事务的):
并将所有内容放在他们的位置:
现在可以通过以下方式激活:
先前OP问题的示例:
在
/etc/nftables/idempotent/handletftp.nft
:在
/etc/nftables/idempotent/stop-handletftp.nft
启用并启动它:
停止它:
这将保留firewalld的规则。同样,停止或重新启动firewalld将保留这些规则。
可能需要改进:
nf_nat_tftp
不会自动完成的加载(与nf_conntrack_tftp
规则中的引用自动加载相反,或者与将显式加载的firewalldnf_nat_tftp
相反)。所以相关但非严格的nftables配置应该牢记在心(这个设置可以简单地放入/etc/modules-load.d/
)。