web-dev-qa-db-ja.com

マルチキャストパケットを正しく渡すようにmacvtapを構成するにはどうすればよいですか?

お互いとホストを見ることができる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)をインストールしようとしましたが、違いはありません。

そう:

  1. libvirtによって開始されるたびに、すべてのmacvtapインターフェースを無差別モードに設定するにはどうすればよいですか?
  2. 私はネットドライバーに精通していません。しかし http://www.makelinux.net/ldd3/chp-17-sect-14 によると、macvlanのドライバーにいくつかのバグがあり、カーネルが設定できないのではないかと疑っています。インターフェイスのマルチキャストリストが正しく表示されます。ただし、linux/driver/net/{macvlan.c、macvtap.c}にはset_multicast_listはありません。ヘルプを検索する正しい場所はどこですか?

参照: https://bugzilla.redhat.com/show_bug.cgi?id=103525

5
Given92

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送信元アドレス!)を許可しているように見えるためです。

5
sourcejedi

Sourcejediによる回答には解決策が含まれていますが、明示的には十分ではない可能性があります。 「virshedit」を使用して、ネットワークデバイスにtrustGuestRxFilters属性を設定します。

<interface type='direct' trustGuestRxFilters='yes'>

libvirt docs を参照してください。 libvirtネットワーク上のすべてのインターフェース についても同じことができます。

2
uncleremus

macvtapで同じ問題に直面しました。私はそれを修正する方法を見つけましたが、virsh内でそれを自動化する方法がわかりません。 Sudo ip link set dev macvtap0 allmulticast on

1
user1907661

完全に正しいかどうかはわかりませんが、解決策を見つけました。

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で機能しています。

0
gargii

これは適切に悪ですが、すべてのマルチキャストを有効にしたくない場合は、ホストで機能するようです。

bridge fdb add 33:33:ff:<lower 24 bits of v6 address> dev <macvtap if>

(特定のv6アドレスの要請ノードマルチキャストグループのみの受信を有効にします)

0
anarchetic