iptables Port-Mirroring

8

Ich muss in der Lage sein, eine Kopie der an Port 8001 bis Port 8002 empfangenen Pakete zu erhalten. Ich habe Folgendes versucht, erhalte jedoch die Fehlermeldung, dass --tee undefiniert ist.

sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee
Parikshit
quelle
Ihr Kernel oder iptablesmöglicherweise zu alt; Siehe Senden doppelter Pakete über zwei Internetverbindungen.
Gilles 'SO - hör auf böse zu sein'
Diese Frage wird hier beantwortet: superuser.com/questions/753294/mirror-port-via-iptables/…
Pat

Antworten:

6

Das --teeFlag ist nicht Teil der DNAT-Kette, sondern Teil der ROUTE. Sie können es nur nach einer Deklaration von verwenden -j ROUTE. Sie können spezifische Hilfe von iptables zu diesem Thema erhalten:

 $ iptables -j ROUTE help

Ich habe mir Ihren Befehl iptables angesehen, und er ergibt für mich keinen Sinn. Warum versuchen Sie, mit der Quelle und dem Quellport eines Pakets abzugleichen, wenn Sie in Ihrer Frage "Packegs auf Port empfangen" sagten ? Versuchen Sie, eingehenden Datenverkehr auf zwei Ports aufzuteilen oder die Ausgabe eines Ports mit der Eingabe eines anderen zu verknüpfen?

Wenn erstere, gibt es wirklich zwei Schritte. Sie können tee nicht verwenden, um eine Kopie des Pakets zu erhalten UND das Paket zu zerfleischen, um gleichzeitig die Portnummern zu ändern. Sie können dies in zwei Schritten versuchen: Senden Sie sich zuerst eine doppelte Kopie des Pakets, stimmen Sie dann nur mit der Kopie überein und beschädigen Sie den Zielport. WARNUNG: ungetestet, betrachten Sie diesen Pseudocode:

$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002
Caleb
quelle
1
Warnung ... ein anderer Site-Besucher hat festgestellt, dass eine ähnliche Version tatsächlich zu einer Endlosschleife führt! Sie müssen wahrscheinlich herausfinden, wie Sie das duplizierte Paket in derselben Aktion markieren und dann auf dem Tag übereinstimmen.
Caleb
ROUTE scheint veraltet zu sein, oder?
Gänseblümchen
Es ist nur ein Tippfehler, 172.0.0.1 -> 127.0.0.1.
Aki
NB für SE-Leser: Das ROUTEin der obigen Antwort verwendete Ziel ist zum jetzigen Zeitpunkt veraltet und in den neuesten Distributionen nicht in iptables verfügbar. Siehe serverfault.com/questions/333155/…
Jonathan Ben-Avraham
6

Im Anschluss an Caleb ‚s Antwort, wenn Sie mit neueren arbeiten iptables(v1.4.14) , dass nicht mehr das hat ROUTEZiel werden Sie so etwas wie die folgenden, getestet auf Debian Wheezy * benötigen:

iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002

Test mit "netcat" ( man nc). Geben Sie in einem Terminalfenster Folgendes ein und drücken Sie die EnterTaste:

nc -l 8002

Der Befehl wartet auf Eingaben, die Sie in ein zweites Terminalfenster eingeben.

Geben Sie im zweiten Terminalfenster Folgendes ein und drücken Sie die EnterTaste:

nc 127.0.0.1 8001

Der Befehl wartet auf weitere Eingaben. Geben Sie etwas ein und drücken Sie die EnterTaste. Nachdem Sie die EnterTaste im zweiten Terminalfenster gedrückt haben, sollte der Text, den Sie im zweiten Terminalfenster eingegeben haben, im ersten Terminalfenster angezeigt werden. Drücken Sie Ctrl-c im zweiten Fenster die Sitzung zu beenden.


* Diese Syntax wird in RHEL / Centos (6.5 oder früher) nicht unterstützt :-( Sie müssen also verwenden socat, um eingehende Pakete am ursprünglichen Port abzutasten und an zwei neue Ports weiterzuleiten Sie müssen neu konfiguriert werden, um einen der Tee-Ports abzuhören, wie dies socatjetzt der Listener des ursprünglichen Ports ist. In diesem SE-Beitrag finden Sie beispielsweise die socatSyntax für das Klonen von Ports.

Jonathan Ben-Avraham
quelle
Aus irgendeinem Grund auf Debian müssen Sie den Port explizit mit netcat angebennc -l -p 8002
Marcelo Lacerda
Ich habe erfolglos versucht, diese Lösung auf meiner Mint 19 Tessa zu replizieren. Ich fand heraus, dass einige Pakete nur nach innen springen und nur einer der beiden Ports das Paket empfängt. Wenn ich den Fehler mache, eine Protokollierung hinzuzufügen, um eine Regel zu beheben, verbrauchen die Protokolle (Kernel, Syslog, Journal) schnell meinen Speicher.
hanzo2001
Ich verstehe auch nicht, warum der DNAT in der OUTPUT-Kette eingestellt ist. Überlässt das Paket meinen Prozess nicht bereits der Außenwelt? oder verhalten sich Loopback-Adressen anders?
hanzo2001