太长不看;如果另一个表中存在匹配的删除项(如firewalld 的默认规则),则桥接(见下文)不起作用。
你好,
我正在构建自己的 VM 库(有点像快喵)。
我对用于桥接的防火墙规则有疑问。我一开始使用 iptables-nft,它工作正常,直到我在 Fedora 上测试我的脚本。无论我做什么,防火墙都会阻止一切。所以我使用 nftables 尝试直接绕过防火墙规则,但即便如此,我还是找不到在不删除防火墙规则的情况下使其工作的方法。
据我了解,优先级只影响测试规则的顺序,如果出现丢弃,即使在最后,数据包也会被丢弃?
有没有我不知道的方法来绕过这种行为?我尝试查看标记,但我不确定这是否是正确的解决方案。
这是我用于桥梁的规则(如果规则集中没有其他表格,则可以完美运行):
#!/usr/bin/nft -f
# vim:set ts=2 sw=2 et:
table ip QEMU
delete table ip QEMU
table ip QEMU {
chain input {
type filter hook input priority filter - 1;
ct state {established,related} iifname "virbr0" counter accept
}
chain forward {
type filter hook forward priority filter - 1;
ct state {established,related} iifname "virbr0" counter accept
}
chain postrouting {
type nat hook postrouting priority srcnat;
iifname "virbr0" counter masquerade
}
}
答案1
挑剔:尽管virbr0
是桥接接口,但这与路由有关,而不是与桥接有关。防火墙发生在桥接的路由端:桥接接口本身,而不是桥接端口(这需要防火墙table bridge
而不是table ip
防火墙)。所以这个词桥接下文不再提及。
当数据包在 netfilter 中被丢弃时,包括nftables,则数据包会被丢弃。当数据包被接受时,它将继续遍历其他钩子,这可能会导致该数据包稍后被丢弃,如nft(8)
:
接受
终止规则集评估并接受数据包。数据包稍后仍可以通过另一个钩子丢弃,例如,在前向钩子中接受仍然允许稍后在后路由钩子中丢弃数据包,或者在处理管道中随后评估的另一个具有更高优先级号的前向基链中丢弃数据包。
降低
终止规则集评估并丢弃数据包。掉落瞬间发生,不再评估任何链或钩子。无法在后续链中再次接受数据包,因为对于数据包来说这些不再被评估。
这会导致具有默认丢弃行为并仅接受某些流(从安全角度来看这是一种好的行为)的防火墙工具而不是具有默认接受行为并丢弃某些流(从安全角度来看这不是很好)的工具掩盖其他防火墙工具的决定:它们丢弃其他工具会选择接受的东西。
因此,要使两种工具共存,通常必须对它们两种工具都采取行动。
对于这种情况,我们可以说防火墙忽略(即:接受) 与一个或多个特定接口相关的流程,因此此特定接口的处理仍由其他工具控制。如果未在其他地方进行此类处理,则可能会打开安全漏洞,因此必须妥善考虑这一点。
这个答案需要防火墙>= 0.9.0 以利用防火墙政策作为最初引入:
策略以有状态的单向方式应用于区域间流动的流量。这允许根据流量方向实施不同的策略。
+----------+ policyA +----------+ | | <------------ | | | libvirt | | public | | | ------------> | | +----------+ policyB +----------+
区域用于远程端和主机之间,策略用于区域之间的路由。它们将重用连接到区域的接口。
创建新区域:
firewall-cmd --permanent --new-zone=local-ignore
让此区域默认接受任何内容:
firewall-cmd --permanent --zone=local-ignore --set-target=ACCEPT
将目标接口添加到此区域:
firewall-cmd --permanent --zone=local-ignore --add-interface=virbr0
这将处理虚拟机和主机之间的流量(一旦重新加载规则)。
添加防火墙使用此区域的策略,一次用于入口,一次用于出口,作为ANY
另一侧,并将它们设置为默认行为ACCEPT
:
firewall-cmd --permanent --new-policy=local-ignore-from
firewall-cmd --permanent --policy=local-ignore-from --add-ingress-zone=local-ignore
firewall-cmd --permanent --policy=local-ignore-from --add-egress-zone=ANY
firewall-cmd --permanent --policy=local-ignore-from --set-target=ACCEPT
firewall-cmd --permanent --new-policy=local-ignore-to
firewall-cmd --permanent --policy=local-ignore-to --add-egress-zone=local-ignore
firewall-cmd --permanent --policy=local-ignore-to --add-ingress-zone=ANY
firewall-cmd --permanent --policy=local-ignore-to --set-target=ACCEPT
最后重新加载规则:
firewall-cmd --reload
这可以确保virbr0
与防火墙。
现在(巨大的)nftables表inet firewalld
应该与 OP 的表和平共处ip QEMU
。无论防火墙是否正在运行(即:其规则被删除)不应改变与 相关的任何行为virbr0
。所有限制都必须在表中处理ip QEMU
。
目前表格ip QEMU
没有任何限制(没有丢弃规则或丢弃策略)因此应该得到妥善修复。不应使用丢弃策略,否则会再次导致刚刚修复的问题,而问题又会反过来出现。只需丢弃其中与 相关的任何不需要的流量virbr0
(尤其是朝向 的流量)。virbr0
可以将其他接口添加到忽略列表中,例如添加lxcbr0
(意思是:让 LXC 不受防火墙):
firewall-cmd --permanent --zone=local-ignore --add-interface=lxcbr0
firewall-cmd --reload