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 eth0
und eth1
in einer Bridge br0
und 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 filter
Tabelle 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, eth0
unabhä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 eth0
und eth1
anders zu behandeln, den Verkehr zuzulassen eth1
, aber nicht eth0
.