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


10

ebtablesでIP-MACペアリングルールを作成しようとしています。いくつかのチュートリアルと関連する質問[1]がありますが、私は特定の設定をしています。

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

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

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

CRAFTED SOLUTION: 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ペアをドロップする方法は?

回答有難うございます。


2
しかし、誰かが自分のMacを偽造したらどうなるでしょうか。
Zoredache

1
まあ、それも問題です。しかし、正しいIP-MACペアを推測することは非常に難しく、タイムリーに私のサービスのセキュリティレベルを超えています。
マーティン、

回答:


12

ようやく実用的なソリューションを作成することができました。

  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つのコマンドのみで、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スプーフィングが防止されます。

この解決策は完全ではない可能性があり、コメントや改善点があれば、喜んでお聞きします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.