nftablesを使用してTapインターフェースを保護する方法

nftablesを使用してTapインターフェースを保護する方法

Qemu VMがLANに接続する2つの主な方法はtype=user次のとおりですtype=tap。このuserモードはプライベートネットワークの仮想マシンを完全に分離し、NATを介してプライマリネットワークスタックにホストします。使いやすく複雑で、物理インターフェイス()と仮想インターフェイス()のマスターにtapなるには仮想が必要です。bridgeこれは、外部世界とホストシステムから仮想マシンにデータが流れるパイプのようなものです。私はホスト側のインターフェイスでネットワークトラフィックを調整し、すべてのhttp要求をいくつかの内部IPアドレスにリダイレクトするのに多くの時間を費やしましたが、成功しませんでした。すべてのアドバイス、フォーラム、ウィキは、多くのソリューションをお勧めしますが、主な理由のために動作しません。 VMゲストのパケットがホストカーネルネットワークスタックに到達しません。 IP ホストアドレスが宛先でない場合は、ブリッジレベルで独自の方法を選択し、パケットフィルタチェーンによって調停されるファイアウォールルールを満たしていません。単にホストグローバルポリシーを(ホストXYtablesを使用)に設定することでこれを試すことができ、ホストネットワークは完全には機能しませんが、ゲストはネットワークを介してパケットを送受信できることを確認できます。eth0tap0tap0tap0iptablesnftablesDROP

問題は、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つあります。

  • nftablesbridgeファミリを使用し、レイヤ3の下にフィルタを適用します。
  • ホストをルーターとして使用します。

最初のソリューションはより効率的なオプションですが、イーサネットフレームの属性をフィルタリングするように制限されています。ブリッジはそのようなデータを処理しないため、レイヤ3以上のIPアドレス、ポート、またはその他のエントリをフィルタリングできません。

2番目のソリューションでは、ここで必要なことを行うことができます。これは実際に非常に2つの具体的な理由のために簡単です。

  • 他のネットワークデバイスタイプと同様に、ブリッジインターフェイスから直接IPアドレスを割り当てることができます。
  • ブリッジインターフェイスに物理ネットワークデバイスを接続する必要はありません。

これを考慮して実行したい「一般的な」設定は次のとおりです。

  1. ホストシステムにブリッジインターフェイスを設定します。静的IPを割り当てますが、物理インターフェイスに接続しないでください。
  2. システムが手順1のブリッジインターフェイスと外部インターフェイス間のルーティングを処理するようにnftablesを設定します。
  3. VMを起動したら、手順1のブリッジインターフェイスに接続します。

次に、境界ファイアウォールとして機能するシステムと変わらないnftablesの内容をフィルタリングします。仮想マシンに静的ネットワーク構成を提供する必要がないように、ホストシステムにDHCPサーバーを設定してDNSリゾルバをキャッシュすることで、このプロセスを簡単に作成できます。

関連情報