MAC と ebtables を使用して IP スプーフィングを防ぐ方法は?

MAC と ebtables を使用して IP スプーフィングを防ぐ方法は?

私は作ろうとしているIP-MACペアリングルールebtablesチュートリアルや関連する質問[1]はほとんどありませんが、私はある種の具体的な設定を持っています。

環境: 私は持っている多くの物理ホスト各ホストにはいくつかのイーサネット カードがあり、ボンドで結合され、ブリッジのスレーブとして使用されます。各ホストには多数の仮想マシン (kvm、qemu、libvirt) があります。各仮想マシンは、vnet[0-9]+ という新しいポートを介して物理ホストのブリッジに接続されます。NAT はありません。ネットワークは正常に動作し、すべての物理ホストに ping を実行でき、すべての仮想マシンにも ping を実行できます。各仮想マシンには独自の IP アドレスと MAC アドレスがあります。

問題:仮想マシン内では、IP アドレスを別のアドレスに変更できます。

解決策が見つかりました:ebtables サイト [2] には既知のソリューションがありますが、このソリューションは 1 つのホストのみが使用されている場合にのみ適用できます。このソリューションはすべてのトラフィックを許可し、許可されている MAC 以外の IP からのパケットがある場合は、パケットをドロップします。ホストが複数ある場合は、すべての既存の IP-MAC ペアをすべてのホストに登録する必要があります。逆ポリシー ソリューションが必要です。

巧みに作られたソリューション:ebtables を逆の方法で使用してみました。以下は私が試した例です。

例1

Bridge table: filter
Bridge chain: INPUT, entries: 2, policy: DROP
-i bond0 -j ACCEPT 
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

例2

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: DROP
-p IPv4 -s 54:52:0:98:d7:b6 --ip-src 192.168.11.122 -j ACCEPT 
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

私が望んでいることの核心は、デフォルトのポリシーを DROP にして、特定のホストに展開された正しい IP-MAC ペアを持つ仮想マシンからのトラフィックのみを許可することです。ただし、これらのソリューションは機能しません。

質問:実行中の仮想マシンの指定された IP-MAC ペアに対してのみブリッジ上のトラフィックを許可し、ポート vnet[0-9]+ から送信されるすべての不明な IP-MAC ペアをドロップするにはどうすればよいですか?

どのようなご回答でもよろしくお願いいたします。

答え1

ようやく実用的な解決策を作り上げることができた。

  1. ソリューションでは、ebtables と IP-MAC ペアを使用します。
  2. 必要なテーブルはデフォルトの「フィルター」テーブルのみです。
  3. INPUT チェーンは仮想マシンの実行とは関係がないため、INPUT チェーンにルールやポリシーを追加する必要はありません。フィルター テーブル内の INPUT、OUTPUT、FORWARD チェーンの意味については、ebtables のマニュアル ページを参照してください。
  4. ebtables はイーサネット レベルで動作し、IP-MAC ペアリングは IP パケットにのみ適用可能であるため、ARP フレームやその他の重要なトラフィックをブロックしないように、ルールでそのことを強調する必要があります。

したがって、最初はルールはまったくなく、すべてのポリシーは ACCEPT に設定されています。ユーザー定義のチェーンはありません。フィルター テーブルは次のようになります。

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 0, policy: ACCEPT
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

新しいチェーンが追加されました。このチェーンには、許可されたすべての IP-MAC ペアが含まれます。これは VMS と呼ばれます。

# ebtables -N VMS

さて、重要な部分です。ポート vnet[0-9]+ からブリッジを通過する IP パケット (またはその一部) を含むすべてのフレームに対して、チェーン ポリシーとチェーン VMS のルールを適用します。つまり、任意の仮想マシンから送信されるすべての IP パケットに対して、VMS チェーンを適用します。

# ebtables -A FORWARD -p ip -i vnet+ -j VMS

チェーン VMS のデフォルト ポリシーは DROP である必要があります。この方法では、すべての仮想マシンから送信されるすべての IP パケットがデフォルトでドロップされます。後で、許可された IP-MAC ペアの例外が追加されます。デフォルト ポリシー DROP により、不明な IP-MAC ペアを持つすべての仮想マシンからのすべてのトラフィックが一度にドロップされ、IP スプーフィングが不可能になります。

# ebtables -P VMS DROP

テーブル フィルターは次のようになります。また、実行中の仮想マシンがない場合 (許可されている場合) もこのようになります。

Bridge table: filter
Bridge chain: INPUT, entries: 0, policy: ACCEPT
Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-p IPv4 -i vnet+ -j VMS
Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
Bridge chain: VMS, entries: 0, policy: DROP

実行中のマシンが 2 台あるとします。それらのマシン間で ping を実行しようとすると、トラフィックがドロップされ、宛先に到達できなくなります。これは望ましい結果ですが、この時点ではトラフィックはまだ許可されていません。1 つのコマンドだけで、各仮想マシンのトラフィックを許可できます。

# ebtables -A VMS -p ip --ip-src 192.168.11.125 -s 54:52:00:cc:35:fa -j ACCEPT
# ebtables -A VMS -p ip --ip-src 192.168.11.122 -s 54:52:00:98:d7:b6 -j ACCEPT

これで、許可された仮想マシンからのトラフィックは正常に流れ、IP スプーフィングが防止されます。

この解決策は完璧ではないかもしれませんので、ご意見や改善点がありましたら、喜んでお聞かせください。

関連情報