お互いとホストを見ることができるVMを作成しようとしています。それらはqemu/kvmでホストされ、libvirtを介して管理されます。 VMのネットワークアダプタは、パフォーマンスのためにmacvtap(VEPAモード)で作成されます。
hairpin
over switchを有効にすると、VM間、またはVMとHostの間)に関係なく、ユニキャストストリームはすべてOKになります。
しかし、マルチキャストに関しては、私は問題に直面しています。ホストが各VMにping6できないことがわかりました。 tcpdumpを使用すると、ホストからマルチキャストアドレスff02::1:ff00:212
への近隣要請パケットが、ipv6アドレスが2001:da8:a0:600::212/64
であるVMによって受信されないことがわかります。明らかに、このマルチキャストパケットはmacvtapによってVMに渡されているはずです。
マルチキャストの問題の結果として、近隣探索が正しく機能できないため、すべてのipv6パケットが失われます。
物理ネットワークアダプターを介してtcpdumpを実行すると、1秒に2回、1回ずつ、1回ずつ、近隣探索が表示されるため、スイッチには何もないと確信しています。
ホスト上のmacvtapインターフェイスをプロミスキャスモードに設定した後、VMは、macvtapでフィルタリングする必要があるが、他のVMへのユニキャストパケットではない他のマルチキャストパケットとともに、近隣要請パケットを取得します、ホスト上の他のVMに同時にpingを実行した場合でも。
したがって、すべてのmacvtapインターフェイスでプロミスキャスモードを有効にすることは、許容できる回避策ですが、適切ではないと思います。
すべてのホストとVMはCentOS7.0です。ホストのelrepoからkernel-ml(linux 4.1.3)をインストールしようとしましたが、違いはありません。
そう:
libvirtのmacvlanはマルチキャストのサポートを獲得しました。残念ながら、デフォルト設定trustGuestRxFilters="no"
では無効になっており、ドキュメントには、これがマルチキャストを中断することが明示されていません。ご覧のとおり、マルチキャストを中断するとIPv6も中断します。
https://bugzilla.redhat.com/show_bug.cgi?id=1035253#c15
trustGuestRxFilters="yes"
を手動で設定することで、これを回避できる場合があります。制限があります:「サポートは、ゲストネットワークデバイスモデル、およびホスト上の接続のタイプによって異なります」。 「現在、これはvirtio
デバイスモデル、およびホスト上のmacvtap
接続でのみサポートされています。」.
https://libvirt.org/formatdomain.html#elementsNICS
IMOの自然なモデルは、デフォルトでマルチキャストを許可することです。直接接続していると思われるネットワークでマルチキャスト受信をブロックすることは、不快な驚きです。特にmacvtap
はまだ送信マルチキャストパケット(およびスプーフィングされたMAC送信元アドレス!)を許可しているように見えるためです。
Sourcejediによる回答には解決策が含まれていますが、明示的には十分ではない可能性があります。 「virshedit」を使用して、ネットワークデバイスにtrustGuestRxFilters
属性を設定します。
<interface type='direct' trustGuestRxFilters='yes'>
libvirt docs を参照してください。 libvirtネットワーク上のすべてのインターフェース についても同じことができます。
macvtapで同じ問題に直面しました。私はそれを修正する方法を見つけましたが、virsh内でそれを自動化する方法がわかりません。 Sudo ip link set dev macvtap0 allmulticast on
完全に正しいかどうかはわかりませんが、解決策を見つけました。
Qemuドメインの開始後にALLMULTIを有効にする libvirtフック をセットアップします。
/ etc/libvirt/hook/qemu
#!/bin/bash
if [ "$2" == "started" ]; then
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
exists=$(ifconfig | grep macvtap0 | wc -l)
if [ "$exists" -gt "0" ]; then
ifconfig macvtap0 allmulti
echo "$timestamp ALLMULTI set on macvtap0" >> /var/log/libvirt_hook_qemu.log
fi
fi
このスクリプトは、Ubuntu 14.04.3 + KVM/libvirtで機能しています。
これは適切に悪ですが、すべてのマルチキャストを有効にしたくない場合は、ホストで機能するようです。
bridge fdb add 33:33:ff:<lower 24 bits of v6 address> dev <macvtap if>
(特定のv6アドレスの要請ノードマルチキャストグループのみの受信を有効にします)