qemuマルチキャストネットワークにアクセスする(Dockerコンテナから)

qemuマルチキャストネットワークにアクセスする(Dockerコンテナから)

QEMU許可するパブリックマルチキャストアドレスに基づく仮想ネットワークを使用すると、起動時に指定してさまざまな仮想マシンを接続できます-netdev socket,mcast=230.0.0.1:1234

これにより、複数のVMを簡単に接続し、すぐに新しいVMに参加できます。

このネットワークに参加できますか?いいえQEMUを使用していますか?特に、Dockerコンテナをこのネットワークに接続できますか?

答え1

複数のホストではなく単一のホストでVMを実行していると仮定すると、QEMU VMと他のVM(または物理ホスト)の間にネットワークを設定する最も簡単な方法は、マルチキャストの代わりにTapデバイスを使用してからTapデバイスをブリッジすることです。 [device] をクリックし、Docker コンテナ インターフェイス (または必要なインターフェイス) をブリッジに追加します。

ただし、提供されたリンクの構文とネットワークの説明は次のとおりです。役に立たないそしてある段階では消えます。特に、QEMU VLANの概念は消えます。現在の構文では、次のようなものを使用します。

-netdev tap,ifname=qemu0

その後(ルートとして)

ip link add br_qemu type bridge
ip link set br_qemu up
ip link set qemu0 master br_qemu
ip link set qemu1 master br_qemu

仮想マシンを起動する前にブリッジを作成している場合は、-netdev bridge,br=br_qemuQEMUを使用してブリッジにタブインターフェイスを追加することもできます。

仮想マシンが異なる物理ホストで実行されるため、特にマルチキャストが必要な場合、状況はより複雑になります。最初のステップは、QEMUが送信するパケットの形式を特定することです(生のパケットではありませんが、これ以上詳しくは見ていません)。 2番目のステップは、マルチキャストグループに参加し、グループとグループ間で転送するプロキシを作成することです。ポイント&クリックインターフェイス。

あるいは、(それほど効率的ではありませんが)、2つのネットワークカード(1つのマルチキャストと1つのタブ)を持つ専用QEMU VMを実行できます。このカードは、カード間を渡す以外に何もしないように構成されています。

より良い選択肢は、異なる方法(トンネル、物理LANのVLAN(QEMU VLANではなく実際の801.q VLAN))で異なる物理ホスト間の通信を実装し、Tapインターフェースに固執することです。

編集する

LAN に VLAN を追加するには、eth0ホストに追加し、次の手順を実行します。

ip link add link eth0 name eth0.5 type vlan id 5

5選択したVLANタグはどこにありますか?次に、このインターフェイスをブリッジに追加します。

ip link set eth0.5 master br_qemu

今行ってもいいです。仮想マシンを起動するスクリプトにこれら2つのコマンドを配置できます。またはそれに対応するものを入力してください/etc/network/interfaces(詳細はGoogleまたはマンページを参照)。はい、ホストシステムにはいくつかの設定が必要です。

編集する

いいですね。 QEMUから送信されたマルチキャストパケットフォーマットを見てみると、イーサネットフレームでした。だからあなたは次のことができます

socat UDP4-DATAGRAM:230.0.0.1:1234,sourceport=1234,ip-add-membership=230.0.0.1:10.0.0.2 TUN:10.2.3.1/24,tun-type=tap,iff-no-pi,iff-up

Dockerコンテナを持つホストでは、10.0.0.2マルチキャストグループに関連付けられているホストの有効なIPアドレス(例:のIPアドレス)eth0。これはtap、イーサネットパケットをマルチキャストグループと送受信できる(レベル2)インターフェイスを提供します。これでDockerコンテナに接続/ルーティングするだけです。

socatあなたが望んでいて、それがより効率的だと思うなら、あなたは代わりにあなた自身の短いCプログラムなどを書くことができます。

関連情報