太棒了;如果另一个表中存在匹配的丢弃(如firewalld的默认规则),则网桥(见下文)将不起作用。
你好,
我正在构建自己的虚拟机库(类似于Quickemu)。
我对桥接的防火墙规则有疑问。我从 iptables-nft 开始,它工作得很好,直到我在 fedora 上测试了我的脚本。无论我做什么,firewalld 都会阻止一切。因此,我使用 nftables 尝试直接绕过firewalld规则,但即使如此,我也无法找到一种方法使其在不删除firewalld规则的情况下工作。
据我了解,优先级仅影响测试规则的顺序,如果有丢弃,即使在最后,数据包也会被丢弃?
有没有办法绕过我不知道的这种行为?我尝试查看标记,但不确定这是正确的解决方案。
这是我用于桥的规则(如果规则集中没有其他表,则效果很好):
#!/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
}
}
吹毛求疵:尽管
virbr0
是一个桥接接口,但这只是关于路由,而不是桥接。防火墙发生在网桥的路由端:网桥接口本身,而不是网桥端口(这需要防火墙table bridge
而不是table ip
防火墙)。所以下面就不再提及桥接这个词了。当数据包在 netfilter(包括nftables)内被丢弃时,它会保持丢弃状态。当数据包被接受时,它将继续遍历其他钩子,可能会导致该数据包稍后被丢弃,如以下提醒
nft(8)
:这会导致具有默认丢弃行为并仅接受某些流(从安全角度来看这是一个良好的行为)的防火墙工具,而不是具有默认接受行为并丢弃某些流(从安全角度来看这不太好)的工具变得神秘其他防火墙工具的决定:它们会放弃其他工具会选择接受的内容。
因此,要使两种工具共存,通常必须对它们执行操作。
对于这种情况,可以告诉firewalld忽略(即:accept)与一个或多个特定接口相关的流,因此该特定接口的处理仍然由其他工具控制。如果在其他地方不进行此类处理,则可能会打开安全漏洞,因此必须适当考虑这一点。
这个答案需要firewalld >= 0.9.0 来利用最初引入的firewalld策略:
区域用于远程端和主机之间,策略用于区域之间的路由。他们将重用附加到区域的接口。
创建一个新区域:
让该区域默认接受任何内容:
将目标接口添加到该区域:
这将处理虚拟机和主机之间的流量(重新加载规则后)。
添加将使用此区域的防火墙策略,一次用于入口,一次用于出口,与
ANY
另一侧一样,并将它们设置为默认行为ACCEPT
:最后重新加载规则:
这可以保证与
virbr0
不受firewalld阻碍相关的流量。现在(巨大的)nftables表
inet firewalld
应该与 OP 的 table 和平共存ip QEMU
。无论firewalld是否正在运行(即:它的规则被删除)都不应该改变与virbr0
. 所有限制都必须在表中处理ip QEMU
。目前表
ip QEMU
根本不限制任何内容(没有删除规则或删除策略),因此应该正确修复。不应使用丢弃策略,否则这将在另一个方向再次导致刚刚解决的问题。virbr0
只需删除其中任何与(尤其是与virbr0
)相关的不需要的流量即可。可以将其他接口添加到忽略列表中,例如添加
lxcbr0
(意思是:让 LXC 不受firewalld阻碍):