为什么虚拟机启动前添加的 IPv6 路由不起作用

为什么虚拟机启动前添加的 IPv6 路由不起作用

我在 Hetzner 有一个安装有 Debian 7 的外部服务器,并尝试使用 IPv6 路由设置 KVM(相同设置适用于 IPv4,没有问题)。

我有一台 Ubuntu Server VM,它有两个接口,位于两个不同的子网中。第一个接口通过网桥连接到主机:

Host-eth0 <-- external bridge --> vnet0-VM-vnet1 <-- internal bridge

我配置了网桥以通过第一个 VM 接口向第二个子网添加静态路由:

ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external

这会在虚拟机启动之前添加路由条目。当我使用 ping6 从主机到 vnet1 接口 (2::2) 时,我收到以下错误消息:

ping: sendmsg: Network is down

当我不在接口配置中添加路由并在虚拟机启动后手动调用它时,一切都正常。

所以我的问题是为什么只有在虚拟机启动后,IPv6 地址的路由添加才有效?

其他配置详细信息:

主机接口

auto lo
iface lo inet6 loopback

auto eth0
iface eth0 inet6 static
    address 2a01:4f8:X:Y:0::2
    netmask 128
    gateway fe80::1

# Bridge between Host and VM
auto virbr_external
iface virbr_external inet6 static
    bridge_ports none
    bridge_stp off
    bridge_fd 0
    address 2a01:4f8:X:Y:1::2
    netmask 80

up ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external

# Bridge between VM and other VMs
auto virbr_internal
iface virbr_internal inet6 manual
    bridge_ports none
    bridge_stp off
    bridge_fd 0

虚拟机接口

auto lo
iface lo inet6 loopback

auto eth0
iface eth0 inet6 static
    address 2a01:4f8:X:Y:1::3
    netmask 80
    gateway 2a01:4f8:X:Y:1::2

auto eth1
iface eth1 inet6 static
    address 2a01:4f8:X:Y:2::2
    netmask 80

如果您需要更多日志(工作前后),请告诉我,我会收集它。

答案1

这里有同样的问题。解决方案是在设置路由后刷新 IPV6 路由缓存:

ip -6 route flush cache

将接口部分更改为:

...
auto virbr_external
iface virbr_external inet6 static
   bridge_ports none
   bridge_stp off
   bridge_fd 0
   address 2a01:4f8:X:Y:1::2
   netmask 80
   up ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external
   up ip -6 route flush cache # Flush cache after setting route
   ...

修复了启动时的问题。

答案2

我不确定这是否与虚拟机启动/路由添加的顺序有关,除非有一些逻辑将度量设置得低于其他路由...多个接口可能想要路由你的 ipv6 流量,内核会选择度量最低的路由。

在我的系统上,我的网桥的默认度量为 425,因此当虚拟机启动并设置度量为 256 的默认路由时,它优先于默认的 bridge0 路由,并导致流量默认发送到我的虚拟机。可以使用以下命令打印路由:

ip -6 route show

Libvirt 可能甚至不允许该接口具有 ipv6 地址和路由,因为它是网桥的一部分,但事实确实如此,所以我的解决方法是将网桥的默认路由设置为低于 vmnet 接口的值。使用网络管理器:

nmcli connection modify bridge0 ipv6.route-metric 128

现在,即使 libvirt 在 vnet0 接口上创建了路由,但由于桥接优先,因此该路由不会被使用。

错误报告似乎是相关的,虽然它很古老,所以它可能是我所看到的较新的错误......

相关内容