私はiptablesに基づいてファイアウォール構成ツールを構築していて、「バンプ・イン・ザ・ワイヤー」シナリオを機能させようとしています。
ブリッジeth0
および3番目のインターフェースeth1
にbr0
とeth2
を設定すると、次のようになります。
| | |
eth0 eth1 eth2
| == br0== | |
| |
| |
--- linux node ---
このシナリオでは、eth0
に接続されているネットワークに送信する場合、TCPポート80のトラフィックをドロップする必要がありますが、eth1
には許可します。
したがって、特定のインターフェイスeth0
を介して送信されるパケットを確実に照合するようにしています。
filter
テーブルに次のiptablesルールを追加すると、
-A FORWARD -o br0 --physdev-out eth0 -j LOG
eth1
(ブリッジの残りの半分)から発信されたパケットが与えられた場合、ルールはうまくログに記録されます。
... IN=br0 OUT=br0 PHYSIN=eth2 PHYSOUT=eth1 ...
ただし、パケットがeth2
から発信されている場合、ルールは一致しなくなります。
ルーティングアルゴリズムではどのブリッジインターフェイスを選択するか決定できないようです。そのため、パケットはブリッジの両方のインターフェイスを介して送信されます。
さらに無差別なログルールを追加すると、そのパケットについて次のログ出力が得られます。
... IN=eth2 OUT=br0 ...
私の推測では、最初のケースでは、ルーティングアルゴリズムは、ブリッジ上の他のインターフェイスを選択するだけで、そのパケットが本来の方法で送信されないはずです。 2番目のケースでは、特定のインターフェースを選択していないため、physdev情報がまったく得られません。
ただし、ブリッジが(brctl showmacs br0
で示されているように)宛先MACアドレスを学習している場合は、正しいインターフェースを判別でき、再びphysdev informatinoを取得します。
(3番目のケースもあります:ブリッジが3つのインターフェースで構成され、これはに当てはまるようですが、送信元インターフェースを除いて、パケットを送信する単一のインターフェースを確立することはできません。)
したがって、問題は、どのようにしてeth0
を介して送信パケットを確実に照合できるかということです。
最初に示した例を考えると、複数のインターフェイスを介してルーティングされるパケットを照合するだけでは十分ではありません。そのうちの1つはeth0
です(他のシナリオでも役立ちます)。 eth0
とeth1
のトラフィックを別々に扱い、eth1
へのトラフィックを許可し、eth0
へのトラフィックは許可しないようにしたい。
観察された動作の理由
パケットが非ブリッジインターフェイスから到着したときにiptablesが物理的なブリッジ情報を取得しないのは、この時点でパケットがブリッジで送信されていることがわかっていても、パケットがブリッジメカニズムの近くになかったからです。
パケットがブリッジポートを介して到着したが、N> 2ブリッジである場合、問題は、iptables PHYSDEV拡張が「out」の1つの値であることのみを提供するため、わざわざ通知しないことです。 2つあれば私達。
ソリューション
Iptablesの代わりにebtablesを使用してください。 ebtables OUTPUT
チェーンは、パケットを送信する物理的なブリッジインターフェイスを認識します。
上記のシナリオでは、特定のブリッジインターフェイス(eth0
)を経由して送信されるパケットをフィルタリングする場合、システムへの到着方法に関係なく、次の行に沿ってebtablesルールを追加します。
-A OUTPUT -o eth0 -j <target>
より複雑なシナリオでは、特定のインターフェースから到着し、ブリッジされたインターフェースを経由して出て行くパケットをフィルタリングしたい場合、それは難しくなります。 eth2
(eth0
の一部としてブリッジ)へのすべてのトラフィックをbr0
(非ブリッジ)からドロップしたいとしますiptablesにこのルールを追加する必要があります=:
-A FORWARD -i eth2 -o br0 -j MARK --set-mark 1234
これにより、eth2
から送信され、ブリッジに向かうパケットにマークが付けられます。次に、このルールをebtablesに追加します。
-A OUTPUT -physdev-out eth0 --m mark --mark 1234 -j DROP
これは、特定のブリッジポートeth2
を介して送信されているiptablesによってマークされたパケット(eth0
からのもの)をDROP
します。
謝辞
Pascal Hambourgのnetfilter iptablesメーリングリストに感謝し、このソリューションを思いついてくれたことに感謝します。