Qemu VMがLANに接続する2つの主な方法はtype=user
次のとおりですtype=tap
。このuser
モードはプライベートネットワークの仮想マシンを完全に分離し、NATを介してプライマリネットワークスタックにホストします。使いやすく複雑で、物理インターフェイス()と仮想インターフェイス()のマスターにtap
なるには仮想が必要です。bridge
これは、外部世界とホストシステムから仮想マシンにデータが流れるパイプのようなものです。私はホスト側のインターフェイスでネットワークトラフィックを調整し、すべてのhttp要求をいくつかの内部IPアドレスにリダイレクトするのに多くの時間を費やしましたが、成功しませんでした。すべてのアドバイス、フォーラム、ウィキは、多くのソリューションをお勧めしますが、主な理由のために動作しません。 VMゲストのパケットがホストカーネルネットワークスタックに到達しません。 IP ホストアドレスが宛先でない場合は、ブリッジレベルで独自の方法を選択し、パケットフィルタチェーンによって調停されるファイアウォールルールを満たしていません。単にホストグローバルポリシーを(ホストXYtablesを使用)に設定することでこれを試すことができ、ホストネットワークは完全には機能しませんが、ゲストはネットワークを介してパケットを送受信できることを確認できます。eth0
tap0
tap0
tap0
iptables
nftables
DROP
問題は、VMゲストをホスト仮想ネットワークインターフェイスに仮想的に接続する他の方法はありますか?より良い理解のために、図は次のとおりです。
General virtual connections for host/VM guest
+---------------------------------------------+
| +-----------------------------+ |
| | iptables host kernel | |
| | nftables network stack | |
| +-------+---------------------+ |
| | |
| +-------+---------+ +-----------+ |
---eth0--+ virtual | | VM | |
| | bridge +-tap-eth0 guest | |
---eth1--+ br0 | | | |
| +-----------------+ +-----------+ |
+---------------------------------------------+
Host became a router for VM guest
+-------------------------------------+
| +----------------+ +---------+ |
---eth0--> host kernel | | VM | |
| | <-vppp guest | |
---eth1--> network stack | | | |
| +----------------+ +---------+ |
+-------------------------------------+
私の問題を解決するには、仮想ブリッジ自体のトラフィックを制御する方法(nftablesを使用するなど)を見つけるか、仮想ワイヤを介してVMゲストネットワークインターフェイスをホストの仮想ネットワークインターフェイスに接続する方法を見つける必要があります。 PPPoEネットワークに似ています。
ただし、最後の最も明確な方法は、ホストループバックを含む特定のポート(サービス)を選択した宛先アドレスに強制的にリダイレクトできるように、Qemuユーザーモードネットワーキングにさらにパラメータを追加することです。はい、Qemuチームにそのような希望を送り、答えを受けました。これは最も重要な機能ではありません。
答え1
考えられる解決策は2つあります。
- nftables
bridge
ファミリを使用し、レイヤ3の下にフィルタを適用します。 - ホストをルーターとして使用します。
最初のソリューションはより効率的なオプションですが、イーサネットフレームの属性をフィルタリングするように制限されています。ブリッジはそのようなデータを処理しないため、レイヤ3以上のIPアドレス、ポート、またはその他のエントリをフィルタリングできません。
2番目のソリューションでは、ここで必要なことを行うことができます。これは実際に非常に2つの具体的な理由のために簡単です。
- 他のネットワークデバイスタイプと同様に、ブリッジインターフェイスから直接IPアドレスを割り当てることができます。
- ブリッジインターフェイスに物理ネットワークデバイスを接続する必要はありません。
これを考慮して実行したい「一般的な」設定は次のとおりです。
- ホストシステムにブリッジインターフェイスを設定します。静的IPを割り当てますが、物理インターフェイスに接続しないでください。
- システムが手順1のブリッジインターフェイスと外部インターフェイス間のルーティングを処理するようにnftablesを設定します。
- VMを起動したら、手順1のブリッジインターフェイスに接続します。
次に、境界ファイアウォールとして機能するシステムと変わらないnftablesの内容をフィルタリングします。仮想マシンに静的ネットワーク構成を提供する必要がないように、ホストシステムにDHCPサーバーを設定してDNSリゾルバをキャッシュすることで、このプロセスを簡単に作成できます。