我在 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 接口上创建了路由,但由于桥接优先,因此该路由不会被使用。
这错误报告似乎是相关的,虽然它很古老,所以它可能是我所看到的较新的错误......