web-dev-qa-db-ja.com

IPv6はブリッジ経由では機能しません

1週間前にUbuntu 14.04サーバーをインストールしました。仮想マシンホスト(taskselがインストールされている)として使用します。つまり、kvm + libvirtで実行しています。

13.10で使用したのと同じブリッジを設定しました。

auto p4p1
iface p4p1 inet manual
    up ifconfig $IFACE up
    down ifconfig $IFACE down

auto br0
iface br0 inet static
    address 46.182.xxx.xxx
    netmask 255.255.255.240
    gateway 46.182.xxx.xxx
    dns-nameservers 46.182.xxx.xxx 46.182.xxx.xxx
    bridge_ports p4p1
    bridge_stp off
    bridge_maxwait 0

iface br0 inet6 auto

Br0に対して、libvirtで定義された<source bridge='br0'/>で仮想マシンを接続します。

私の仮想マシンは、ルーターアドバタイズメントメッセージを問題なく受け取ります。すべての仮想マシンはIPv6アドレスを取得します。

私の問題は、IPv6がブリッジで機能しないことです。しかし、トラブルシューティングのためにbr0に対してtcpdumpをオンにすると機能します。インターフェイスを手動で無差別モードに設定しようとしましたが、機能しませんifconfig br0 promisc

ブリッジにIPv4アドレスがあるのはなぜですか?私は知らない、古い習慣、決してそれを疑わない。 IPv6は仮想マシンホストでは機能しませんが、ホストは仮想マシンと同様にRAによってIPv6アドレスを取得します。

6
Niklas Hagman

すべてのIPv6アドレスは、リンクローカルのものも含め、最後の24ビットに基づいてマルチキャストグループに自動的にサブスクライブします。マルチキャストスヌーピングが有効になっている場合、ブリッジはデフォルトで(ほぼ)すべてのマルチキャストトラフィックを除外します。 IPv6アドレスがインターフェイスに割り当てられると、システムは、このインターフェイスがその特定のマルチキャストグループに関心があり、フィルタによって除外される必要があることをネットワークに通知する必要があります。以下は入門ビデオです: https://www.youtube.com/watch?v=O1JMdjnn0ao

マルチキャストスヌーピングは、ほとんどのシステムが関心のないマルチキャストパケットでネットワークをフラッディングするのを防ぐためにあります。大きな違いに気付くことなく、小規模な展開でマルチキャストスヌーピングを無効にできます。しかし、これは大規模な展開でパフォーマンスに大きな影響を与える可能性があります。

スヌーピングは次の方法で無効にできます。

echo -n 0 > /sys/class/net/<brif>/bridge/multicast_snooping

不要なトラフィックや不要なパケット処理からVMを保護する場合は、スヌーピングを有効にしたまま、ネットワークでマルチキャストクエリアを有効にすることもできます。クエリアはクエリパケットを定期的にブロードキャストし、スイッチとブリッジのスヌーピングフィルターを更新します。以下を使用して、システムでクエリアを有効にすることができます。

echo -n 1 > /sys/class/net/<brif>/bridge/multicast_querier

スヌーピングを有効にしている場合は、ネットワーク上にクエリアも必要です。

STPを有効にする必要はありません。循環パスにつながるセグメントをブリッジしていることがわかっている場合を除き、おそらくオフにする方が安全です。 SLAACが有効になっている場合も関係ありません(つまり、autoconf=1accept_ra=1)。ブリッジでPROMISCモードを有効にすると、スヌーピングが暗黙的に無効になります。

ここに、最新の IPv6近隣探索(ND)およびマルチキャストリスナー探索(MLD)の課題 の素敵な要約があります。

6
forcefsck

インターフェイスでIPv6を有効にしましたか?ブリッジデバイスがbr0の場合、これを実行します。

sysctl net.ipv6.conf.br0.disable_ipv6=0
sysctl net.ipv6.conf.br0.autoconf=1
sysctl net.ipv6.conf.br0.accept_ra=1
sysctl net.ipv6.conf.br0.accept_ra_defrtr=1
3
Paul M

あなたの構成で私が見る唯一の明白な問題は:

    bridge_stp off

さまざまな理由で STPを有効にする必要があります libvirtブリッジで。

構成を次のように変更します。

    bridge_stp on

ネットワークを再起動せずにすぐにアクティブ化することもできます。

$ Sudo brctl stp br0 on
0
Michael Hampton