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] +?
ご回答ありがとうございます。
私はついに実用的なソリューションを作成することができました。
したがって、最初はルールはまったくなく、すべてのポリシーが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スプーフィングが防止されます。
この解決策は不完全である可能性があり、コメントや改善があれば、喜んで聞きます。