web-dev-qa-db-ja.com

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

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

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

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

FOUND SOLUTION: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 [から来るすべての不明なIP-MACペアをドロップする方法0-9] +?

ご回答ありがとうございます。

10
Martin

私はついに実用的なソリューションを作成することができました。

  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スプーフィングが防止されます。

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

12
Martin