我在 Rocky Linux(基于 RHEL8)上运行,对防火墙和 iptables 有点困惑。好吧,其实不是 iptables……让我解释一下。
我在 VMWare ESXi 上设置了一个 K8S 集群,其中有六台虚拟机,全部一样。我需要在这种环境下运行防火墙。我使用 Weave 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-save
。nft list ruleset
这意味着即使 weave 使用 iptables 设置其规则,它们实际上也被设置到了 nftables 中。
现在,我的问题是,如果我在 weave 设置规则后重新加载firewalld(使用firewall-cmd --reload
或),所有规则都会被刷新!我可以使用或来确认这一点。systemctl reload firewalld.service
iptables-save
nft list ruleset
iptables
这可能与使用命令而不是有关吗nft
?即使 iptables 使用 nf_tables 后端?
请注意,weave 部分解决了这个问题,因为它们会监控规则,以查看是否存在特殊(空)链 WEAVE-CANARY。如果不存在,它们会重新创建路由,但不会为网络策略规则执行任何操作。目前这是一个功能要求。
可能的解决方案是什么?我考虑过挂接到防火墙服务以添加ExecStopPre
和ExecReloadPre
保存除防火墙规则之外的其他规则/etc/sysconfig/nftables.conf
(或从那里包含的另一个文件),但这有点黑客化,我不喜欢这种“解决方案”。此外,鉴于 nftables 服务已停止,我甚至不确定这是否会起作用。
编辑:我做了一些测试,行为确实很奇怪。
我添加了一条规则iptables
:iptables -I INPUT 3 -s 10.1.1.9 -j DROP
,然后重新加载了防火墙,规则却不见了!我尝试了同样的方法nft
:nft add rule ip filter INPUT ip saddr 10.1.1.9 drop
,重新加载了防火墙,结果还是一样……
这让我抓狂了,firewalld 不应该触碰它自己的规则表以外的其他规则表,但这里的情况并非如此!
答案1
来源:来自firewalld 合作者的 GitHub 问题回复
这里发生了几件事。
- 的nft变体将在已知表中
iptables
添加规则: 、、等。nftables
filter
nat
raw
- Firewalld 始终刷新所有
iptables
规则(例如iptables -F -t filter
),这将刷新表中的所有链filter
。这对应于nftables
上面提到的已知表名。
Firewalld 的nftables
后端仅有的接触firewalld
表,但表filter
、nat
、raw
等是通过间接接触的,以iptables-nft
支持 iptables 直接规则。由于兼容性,此行为无法更改。但是,Firewalld 不会接触其他nftables
表,例如名为 的表foobar
不会被刷新。
不幸的是,我们在这里无能为力。我们要么 a) 保持兼容性并让iptables
命名表被刷新,要么 b) 放弃iptables
直接规则支持。选项 A 是最用户友好的。