Iptables: Übereinstimmende Pakete für die überbrückte Schnittstelle

7

Ich erstelle ein Firewall-Konfigurationstool, das auf iptables basiert, und versuche, ein "Bump in the Wire" -Szenario zum Laufen zu bringen.

Bei einem Setup mit eth0und eth1in einer Bridge br0und einer dritten Schnittstelle eth2:

    |          |         |
   eth0       eth1      eth2
    | == br0== |         |
          |              |
          |              |
         --- linux node ---

Nehmen wir in diesem Szenario an, ich möchte, dass der TCP-Port 80-Datenverkehr unterbrochen wird, wenn er an das angeschlossene Netzwerk geleitet wird eth0, dies jedoch zulässt eth1.

Ich versuche daher, Pakete, die über die spezifische Schnittstelle ausgehen, zuverlässig abzugleichen eth0.

Wenn ich der filterTabelle die folgende iptables-Regel hinzufüge :

-A FORWARD -o br0 --physdev-out eth0 -j LOG

Bei einem Paket, das von eth1(der anderen Hälfte der Brücke) stammt, stimmt die Regel gut überein und protokolliert:

... IN=br0 OUT=br0 PHYSIN=eth2 PHYSOUT=eth1 ...

Wenn das Paket jedoch von stammt eth2, stimmt die Regel nicht mehr überein.

Es scheint, dass der Routing-Algorithmus nicht bestimmen kann, welche der überbrückten Schnittstellen ausgewählt werden soll, sodass das Paket über beide Schnittstellen in der Bridge gesendet wird.

Wenn ich eine weitere promiskuitivere Protokollregel hinzufüge, erhalte ich die folgende Protokollausgabe für dieses Paket:

... IN=eth2 OUT=br0 ...

Ich vermute, dass der Routing-Algorithmus im ersten Fall einfach die andere Schnittstelle auf der Bridge auswählen kann, da dieses Paket nicht so ausgehen sollte, wie es gekommen ist. Im zweiten Fall hat es keine bestimmte Schnittstelle ausgewählt und Sie erhalten dann überhaupt keine physischen Informationen!

Wenn die Bridge jedoch die Ziel-MAC-Adresse gelernt hat (wie von gezeigt brctl showmacs br0), kann sie die richtige Schnittstelle ermitteln, und Sie erhalten erneut physdev informatino.

(Es gibt auch einen dritten Fall: Wenn die Bridge drei Schnittstellen umfasst, für die dies zu gelten scheint, kann sie immer noch keine einzige Schnittstelle zum Senden des Pakets einrichten, sondern nur die Quellschnittstelle ausschließen.)

Die Frage ist also, wie ich Pakete, die ausgehen, eth0unabhängig davon zuverlässig abgleichen kann.

In Anbetracht des Beispiels, das ich zu Beginn gegeben habe, reicht es nicht aus, nur Pakete abzugleichen, die über mehrere Schnittstellen weitergeleitet werden, von denen eine eth0(obwohl dies in anderen Szenarien nützlich wäre). Ich möchte in der Lage sein, den Verkehr für eth0und eth1anders zu behandeln, den Verkehr zuzulassen eth1, aber nicht eth0.

Jamie Cockburn
quelle

Antworten:

8

Gründe für das beobachtete Verhalten

Der Grund dafür, dass iptables die physischen Bridge-Informationen nicht erhält, wenn das Paket von einer nicht überbrückten Schnittstelle ankommt, ist, dass sich das Paket nie in der Nähe des Überbrückungsmechanismus befunden hat, obwohl wir zu diesem Zeitpunkt wissen, dass wir es auf der Bridge senden.

In dem Fall, in dem das Paket über einen Bridge-Port angekommen ist, es sich jedoch um eine N> 2-Bridge handelt, besteht das Problem darin, dass die PHYSDEV-Erweiterung von iptables nur einen Wert für "out" vorsieht, sodass es nicht stört uns, wenn es zwei gibt.

Lösung

Verwenden Sie ebtables anstelle von iptables. Die ebtables- OUTPUTKette weiß, auf welcher physischen überbrückten Schnittstelle sie Pakete sendet.

Fügen Sie im obigen Szenario, in dem Sie Pakete filtern möchten, die über eine bestimmte überbrückte Schnittstelle ( eth0) gesendet werden, unabhängig davon, wie sie in das System gelangt sind, eine ebtables-Regel wie folgt hinzu:

-A OUTPUT -o eth0 -j <target>

In einem komplexeren Szenario, in dem Sie Pakete filtern möchten, die von einer bestimmten Schnittstelle ankommen und über eine überbrückte Schnittstelle abfließen, wird es schwieriger. Angenommen, wir möchten den gesamten Datenverkehr von eth2(nicht überbrückt) zu eth0(überbrückt als Teil von br0) löschen. Wir müssen diese Regel zu iptables hinzufügen :

-A FORWARD -i eth2 -o br0 -j MARK --set-mark 1234

Dies markiert jedes Paket, das von eth2der Brücke kommt und für diese gebunden ist. Dann fügen wir diese Regel zu ebtables hinzu :

-A OUTPUT -physdev-out eth0 --m mark --mark 1234 -j DROP

Welches DROPPaket wird durch iptables (als von eth2) gekennzeichnet, das über den spezifischen Bridge-Port austritt eth0.

Danksagung

Vielen Dank an Pascal Hambourg von der Mailingliste von netfilter iptables für seine Hilfe bei der Entwicklung dieser Lösung.

Jamie Cockburn
quelle