私は Hetzner に Debian 7 を搭載した外部サーバーを持っており、IPv6 ルーティングで KVM を設定しようとしています (同じ設定が IPv4 でも問題なく動作します)。
2 つの異なるサブネットにある 2 つのインターフェースを持つ Ubuntu Server VM が 1 つあります。最初のインターフェースはブリッジ経由でホストに接続されています。
Host-eth0 <-- external bridge --> vnet0-VM-vnet1 <-- internal bridge
最初の VM インターフェイス経由で 2 番目のサブネットに静的ルートを追加するようにブリッジを構成しました。
ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external
これにより、VM が起動する前にルート エントリが追加されます。ホストから vnet1 インターフェイス (2::2) に ping6 を使用すると、次のエラー メッセージが表示されます。
ping: sendmsg: Network is down
インターフェイス構成にルートを追加せず、VM の起動後に手動で呼び出すと、すべてが機能します。
私の質問は、なぜ 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
VM インターフェース
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
他のルートよりもメトリックを低く設定するロジックがない限り、VM の起動順序やルートの追加順序と関係があるかどうかはわかりません... 複数のインターフェイスで IPv6 トラフィックをルーティングする必要がある場合、カーネルはメトリックが最も低いルートを選択します。
私のシステムでは、ブリッジのデフォルト メトリックは 425 でした。そのため、VM が起動してメトリック 256 のデフォルト ルートを設定すると、デフォルトの bridge0 ルートよりも優先され、トラフィックがデフォルトで VM に送信されます。ルートは次のように出力できます。
ip -6 route show
Libvirt は、おそらくそのインターフェースがブリッジの一部であるため、IPv6 アドレスとルートを持つことを許可しないはずですが、実際には許可しています。そのため、私の回避策は、ブリッジのデフォルト ルートを vmnet インターフェースよりも低い値に設定することです。network-manager を使用する場合:
nmcli connection modify bridge0 ipv6.route-metric 128
現在、libvirt は vnet0 インターフェース上にルートを作成しますが、ブリッジが優先されるため使用されません。
これバグレポート関連しているようですが、非常に古いものなので、私が見ているのは新しいバグである可能性があります...