Einfache Möglichkeit, den Datenverkehr von einem TCP-Host (Linux) zu „bearbeiten“.

9

Ich muss einige kleine Änderungen am eingehenden Datenverkehr von einem bekannten TCP-Host vornehmen: port, bevor der Prozess, der die Verbindung verarbeitet, den Stream erhält.

Beispielsweise sei 192.168.1.88 ein Remote-Host, auf dem ein Webserver ausgeführt wird.
Ich brauche das, wenn ein Prozess auf meinem lokalen Host Daten von 192.168.1.88:80 (z. B. dem Browser) empfängt, werden die Daten zuerst geändert und text-Adurch folgende ersetzt text-B:

  • 127.0.0.1: ... stellt eine Verbindung zu 192.168.1.88:80 her
  • 127.0.0.1: ... sendet an 192.168.1.88:80:

    GET /
    
  • 192.168.1.88:80 sendet an 127.0.0.1: ...:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-A, some other text
    
  • Diese Daten werden vom System etwas abgefangen und an ein Programm übergeben, dessen Ausgabe lautet:

    HTTP/1.0 200 OK
    Content-Type: text/plain
    
    Some text-B, some other text
    
  • Das System gibt die so geänderten Daten an die Prozessverarbeitung 127.0.0.1: ... weiter, als ob sie von 192.168.1.88:80 stammt.

Angenommen, ich habe eine Stream-basierte Methode, um diese Änderungen vorzunehmen ( sedz. B. mithilfe von). Was ist der einfachste Weg, um den eingehenden TCP-Stream vorzuverarbeiten?

Ich denke, das würde beinhalten iptables, aber ich bin nicht sehr gut darin.

Beachten Sie, dass die Anwendung das Gefühl haben sollte, mit dem ursprünglichen Host umzugehen, sodass das Einrichten eines Proxys wahrscheinlich keine Lösung ist.

etuardu
quelle
Sind das HTTP-Anfragen?
Polynom
Ihre Frage ist nicht klar genug. Sie müssen weitere Details angeben.
Khaled
1
Sie können dies nicht auf Paketebene tun. Ein Paket kann "Text-" und das nächste "A" enthalten. Sie müssen einen unsichtbaren Proxy entwickeln, der dem Protokoll folgt. (Sie müssen das Protokoll befolgen, denn wenn Sie "text-" erhalten und es Teil von "text-A" ​​ist, müssen Sie auf den nächsten Block warten, bevor Sie ihn weitergeben, sonst funktioniert Ihr Filter nicht. Aber wenn es das Ende ist Von einer logischen Nachricht kann man nicht warten, weil man für immer warten würde.) Ich glaube, es gibt keinen einfachen Weg, dies zu tun.
David Schwartz
Es gibt bereits Stateful Packet Inspection-Systeme, die beispielsweise den FTP-Verkehr neu schreiben können, damit er über NAT funktioniert. Das ist der Ort, an dem man anfangen soll.
pjc50
Ich brauche es hauptsächlich, um mit http-Antworten zu arbeiten, aber es wäre gut, wenn es auf einer beliebigen Anwendungsebene funktioniert.
Etuardu

Antworten:

21

Verwenden Sie Netsed- und Iptables-Proxy.

iptables -t nat -D PREROUTING -s yourhost -d desthost -p tcp --dport 80 -j REDIRECT --to 10101

Dann renne:

netsed tcp 10101 desthost 80 s/text-A/text-B

NetSED ist ein kleines und praktisches Dienstprogramm, mit dem Sie den Inhalt von Paketen, die über Ihr Netzwerk weitergeleitet werden, in Echtzeit ändern können. Es ist sehr nützlich für das Ändern, Fälschen oder Manipulieren von Netzwerkpaketen. NetSED unterstützt:

  • Black-Box-Protokollprüfung - immer dann, wenn zwei oder mehr proprietäre Boxen über ein undokumentiertes Protokoll kommunizieren. Durch Erzwingen von Änderungen bei laufenden Übertragungen können Sie testen, ob die geprüfte Anwendung als sicher beansprucht werden kann.

  • Fuzz-Generierungsexperimente, Integritätstests - wann immer Sie Stabilitätstests einer Anwendung durchführen, um festzustellen, wie sie sich um die Datenintegrität kümmert;

  • andere häufige Anwendungsfälle: irreführende Übertragungen, Inhaltsfilterung, Protokollkonvertierung - was auch immer am besten zu Ihrer Aufgabe passt.

dfc
quelle
Das ist wirklich einfach und cool.
mbrownnyc
Ich wusste es nicht netsed, es passt fast perfekt zu meinem Zweck. Das einzige, was ich nicht verstehe, ist, wie man den "lokalen transparenten Proxy" einrichtet (siehe Frage). Vielleicht sollte ich eine andere (virtuelle) Netzwerkschnittstelle einrichten, um dies zu erreichen. Übrigens ist dies vorerst die befriedigendste Antwort.
Etuardu
Führen Sie einen generischen Distributionskernel aus? Wenn Sie iptables sind, ist die Unterstützung wahrscheinlich bereits kompiliert. Um den transparenten Proxy einzurichten, müssen Sie nur die entsprechenden Details für Ihren Host / Ihre Ports eingeben. Schauen Sie sich die Readme-Datei an und prüfen Sie, ob sie einige Details enthält. silicone.homelinux.org/git/netsed.git/blob_plain/HEAD:/README
dfc
Ich dachte, Netsed würde immer nur für ein Paket gleichzeitig funktionieren? Wenn also die http-Anforderung auf zwei Pakete aufgeteilt wurde, stimmt der reguläre Ausdruck für die Ersetzung nicht überein und die Anforderung wird unverändert an den Server weitergeleitet.
Paulos
1
ok jetzt, nur für den Fall, dass jemand dies eines Tages braucht: nicht, dass ich es vollständig verstehe, aber um OUTGOING-Pakete tatsächlich zu modifizieren (was op NICHT wollte), müssen Sie modifizieren OUTPUT, nicht PREROUTING. Auch die -DOption musste -A für mich sein. auch für die -jOption musste ich DNAT --to-destination (ip) oder verwenden REDIRECT --to-port. Schließlich konnte ich den Segmentierungsfehler von netsed NICHT beheben. siehe auch: ubuntuforums.org/showthread.php?t=2337389
phil294
3

iptables+ Die Verwendung von libnetfilter_qu ist eine weitere Option, die das tut, was Sie wünschen:

"... geänderte Pakete [erneut einwerfen] in das Kernel-Subsystem nfnetlink_queue."

Es wird Ihnen wahrscheinlich die größte Erweiterbarkeit bieten, da es an Ihnen liegt, Software zu codieren.

Es gibt auch einen Python-Wrapper .

mbrownnyc
quelle
2
Beispielanwendung, die netfilter_queue verwendet: github.com/rgerganov/nfqsed
rgerganov