我正在使用基于策略的路由设置 KVM 虚拟化主机(192.168.1.0/24 管理网络用于主机相关流量,如更新、ssh 等,192.168.2.0/24 DMZ 网络路由到虚拟机)
设置看起来像这样(^^^ 我的意思是像上面一样表示树结构)
#external connectivity
eth0 -> vlan110 -> brhost (192.168.1.9)
^^^ -> vlan120 -> brguest (192.168.2.4)
#internal connectivity
brguestA (10.0.1.1) -> tapA0
^^^ -> tapA1
^^^ -> tapA2
brguestB (10.0.2.1) -> tapB0
^^^ -> tapB1
# ... and so on for each VM group subnet
机器 An 在一个“交换机”中,Bn 在第二个“交换机”中,依此类推。主机的行为类似于路由器并安装了 iptables。源 IP 在 iptables 级别上对每个网桥进行验证。
一般来说,一切“正常”都有效,但是当我执行一些边界情况操作时,它仍然按应有的方式运行,但日志表明这更多是巧合,而不是实际的正常运行。例如:
从虚拟机(管理网络中的不同主机)连接到 192.168.1.3,该虚拟机在 iptables 级别(tcp-reset)上被阻止操作,给出
(iptables reject log) IN=brguestA OUT=brguest SRC=10.0.1.2 DST=192.168.1.3 ... IPv4: martian source 10.0.1.2 from 192.168.1.3 on dev brhost
请注意,OUT
考虑到主机/来宾网络分离的逻辑,接口实际上是正确的,根据它应该执行的操作,即使此类数据包将由主机转发,它们无论如何也会被丢弃在防火墙上。然而,主机 iptables 无法正确拒绝 tcp-reset,因此此类连接只会挂在虚拟机上并且不会收到重置
从 VM 连接到 192.168.1.9 给出
IPv4: martian source 192.168.1.9 from 10.0.1.2 on dev brguestA
没有别的。在这些日志中交换 10.0.1.x 和 192.168.1.x 的位置让我非常困惑,我真的不明白它们的含义(哪个是 src ip,哪个是 dst ip)。我真的不知道主机正在尝试做什么以及为什么失败。这是我的ip rule
输出ip route
:
ip rule
0: from all lookup local
32763: from 10.0.0.0/16 lookup guest
32764: from 192.168.2.0/24 lookup guest
32765: from all iif lo lookup host
32766: from all lookup main
32767: from all lookup default
ip route show table host
default via 192.168.1.1 dev brhost proto static
192.168.1.0/24 dev brhost proto static
ip route show table guest
default via 192.168.2.1 dev brguest proto static
10.0.0.0/24 dev brguestA proto static
10.0.1.0/24 dev brguestB proto static
# ... so on for other networks
ip route show table main
192.168.1.0/24 dev brhost proto static
10.0.0.0/24 dev brguestA proto static
10.0.1.0/24 dev brguestB proto static
# ...
我用于systemd-networkd
网络管理。我想法发生这种情况是因为主机总是尝试使用brhost
设备作为其设置的OUTPUT
数据包类型进行响应,以便被规则捕获。然而,情况似乎并非如此,因为连接被正确拒绝,因此它并不总是选择作为输出源。iif
lo
from iif lookup host
192.168.2.4
brhost