仮想マシンを起動する前に追加された IPv6 ルートが機能しないのはなぜですか

仮想マシンを起動する前に追加された IPv6 ルートが機能しないのはなぜですか

私は 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 インターフェース上にルートを作成しますが、ブリッジが優先されるため使用されません。

これバグレポート関連しているようですが、非常に古いものなので、私が見ているのは新しいバグである可能性があります...

関連情報