web-dev-qa-db-ja.com

iptables:ブリッジされたインターフェースの一致するパケット

私はiptablesに基づいてファイアウォール構成ツールを構築していて、「バンプ・イン・ザ・ワイヤー」シナリオを機能させようとしています。

ブリッジeth0および3番目のインターフェースeth1br0eth2を設定すると、次のようになります。

    |          |         |
   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です(他のシナリオでも役立ちます)。 eth0eth1のトラフィックを別々に扱い、eth1へのトラフィックを許可し、eth0へのトラフィックは許可しないようにしたい。

7
Jamie Cockburn

観察された動作の理由

パケットが非ブリッジインターフェイスから到着したときにiptablesが物理的なブリッジ情報を取得しないのは、この時点でパケットがブリッジで送信されていることがわかっていても、パケットがブリッジメカニズムの近くになかったからです。

パケットがブリッジポートを介して到着したが、N> 2ブリッジである場合、問題は、iptables PHYSDEV拡張が「out」の1つの値であることのみを提供するため、わざわざ通知しないことです。 2つあれば私達。

ソリューション

Iptablesの代わりにebtablesを使用してください。 ebtables OUTPUTチェーンは、パケットを送信する物理的なブリッジインターフェイスを認識します。

上記のシナリオでは、特定のブリッジインターフェイス(eth0)を経由して送信されるパケットをフィルタリングする場合、システムへの到着方法に関係なく、次の行に沿ってebtablesルールを追加します。

-A OUTPUT -o eth0 -j <target>

より複雑なシナリオでは、特定のインターフェースから到着し、ブリッジされたインターフェースを経由して出て行くパケットをフィルタリングしたい場合、それは難しくなります。 eth2eth0の一部としてブリッジ)へのすべてのトラフィックを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メーリングリストに感謝し、このソリューションを思いついてくれたことに感謝します。

8
Jamie Cockburn