iptables 在防火墙重新加载时刷新

iptables 在防火墙重新加载时刷新

我在 Rocky Linux(基于 RHEL8)上运行,对防火墙和 iptables 有点困惑。好吧,其实不是 iptables……让我解释一下。

我在 VMWare ESXi 上设置了一个 K8S 集群,其中有六台虚拟机,全部一样。我需要在这种环境下运行防火墙。我使用 Wea​​ve CNI,它使用 iptables 来创建其网络规则。

以下是我的初步发现:

  • 在 Weave Docker 容器上VM 主机,使用带有 nf_tables 后端的 iptables
    • iptables -V输出证实了这一点iptables v1.8.4 (nf_tables)
  • Firewalld 设置为使用 nftables 作为其后端(FirewallBackend
  • iptables 服务不存在Unit iptables.service could not be found.
  • nftables 服务已加载,但处于非活动状态
  • 防火墙服务正在运行
  • 如果我启动 nftables 服务,firewalld 服务就会停止,反之亦然

据我对firewalld的理解,因为它使用nftables,所以它根本不应该刷新iptables,按照他们的博客文章关于 nftables 后端。

当 weave 设置其 iptables 规则(用于路由和网络策略)时,我可以使用 或 来查看它们iptables-savenft list ruleset这意味着即使 weave 使用 iptables 设置其规则,它们实际上也被设置到了 nftables 中。

现在,我的问题是,如果我在 weave 设置规则后重新加载firewalld(使用firewall-cmd --reload或),所有规则都会被刷新!我可以使用或来确认这一点。systemctl reload firewalld.serviceiptables-savenft list ruleset

iptables这可能与使用命令而不是有关吗nft?即使 iptables 使用 nf_tables 后端?

请注意,weave 部分解决了这个问题,因为它们会监控规则,以查看是否存在特殊(空)链 WEAVE-CANARY。如果不存在,它们会重新创建路由,但不会为网络策略规则执行任何操作。目前这是一个功能要求

可能的解决方案是什么?我考虑过挂接到防火墙服务以添加ExecStopPreExecReloadPre保存除防火墙规则之外的其他规则/etc/sysconfig/nftables.conf(或从那里包含的另一个文件),但这有点黑客化,我不喜欢这种“解决方案”。此外,鉴于 nftables 服务已停止,我甚至不确定这是否会起作用。

编辑:我做了一些测试,行为确实很奇怪。

我添加了一条规则iptablesiptables -I INPUT 3 -s 10.1.1.9 -j DROP,然后重新加载了防火墙,规则却不见了!我尝试了同样的方法nftnft add rule ip filter INPUT ip saddr 10.1.1.9 drop,重新加载了防火墙,结果还是一样……

这让我抓狂了,firewalld 不应该触碰它自己的规则表以外的其他规则表,但这里的情况并非如此!

答案1

来源:来自firewalld 合作者的 GitHub 问题回复

这里发生了几件事。

  • 的nft变体将在已知表中iptables添加规则: 、、等。nftablesfilternatraw
  • Firewalld 始终刷新所有iptables规则(例如iptables -F -t filter),这将刷新表中的所有链filter。这对应于nftables上面提到的已知表名。

Firewalld 的nftables后端仅有的接触firewalld表,但表filternatraw等是通过间接接触的,以iptables-nft支持 iptables 直接规则。由于兼容性,此行为无法更改。但是,Firewalld 不会接触其他nftables表,例如名为 的表foobar不会被刷新。

不幸的是,我们在这里无能为力。我们要么 a) 保持兼容性并让iptables命名表被刷新,要么 b) 放弃iptables直接规则支持。选项 A 是最用户友好的。

相关内容