我在 Hetzner 有一台使用 Debian 7 的外部伺服器,並嘗試使用 IPv6 路由設定 KVM(相同的設定適用於 IPv4,沒有問題)。
我有一個 Ubuntu Server VM,有兩個接口,位於兩個不同的子網路中。第一個介面透過橋接到主機:
Host-eth0 <-- external bridge --> vnet0-VM-vnet1 <-- internal bridge
我將網橋配置為透過第一個虛擬機器介面新增到第二個子網路的靜態路由:
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 位址的路由新增僅在 VM 啟動後才起作用?
其他配置詳細資訊:
主機介面
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 介面上建立了一條路由,但它並未被使用,因為網橋優先。
這錯誤報告似乎是相關的,雖然它很舊,所以它可能是我看到的一個新的錯誤...