Frage Wie wird ein persistenter TCP-Proxy für geschlechterändernden Code eingerichtet?


Ich habe einen Provider (A), der uns Daten über eine eingehende TCP-Verbindung senden möchte. Leider kann der konsumierende Dienst (B) eingehende TCP-Verbindungen nicht empfangen. Es hat auch keine statische IP, eine andere Voraussetzung.

Eine Möglichkeit, dies zu lösen, wäre ein Dienst, der den eingehenden TCP-A-Port mit einem anderen TCP-Port B verbindet, so dass der Verbraucher eine ausgehende Verbindung zu B herstellen kann.

Dies ist kein einzigartiges Problem [1]  [2]und mit socat kann ich etwas sehr nah an dem machen, was ich will:

socat -d -d -d -u TCP4-LISTEN:PORT-A,reuseaddr TCP4-LISTEN:PORT-B,reuseaddr

Dies hat jedoch folgende Probleme:

  • Wenn B die Verbindung trennt, kann es keine Verbindung herstellen. Mit TCP4-LISTEN:PORT-B,reuseaddr,forkEs kann eine Verbindung herstellen, empfängt jedoch keine Daten.
  • B kann keine Verbindung herstellen, bevor A eine Verbindung hergestellt hat (überwindbar)
  • Es kann nur eine Verbindung hergestellt werden PORT-B (überwindbar)

Gibt es eine Möglichkeit, den Befehl so anzupassen, dass er "dauerhaft" wird und Fehler aufweist?


9
2017-08-17 11:54


Ursprung




Antworten:


Die wichtige Frage ist, wie wird A auf den Verbindungsverlust reagieren oder die Verbindung ablehnen? Alles, was nur davon ausgeht, dass eine einzelne TCP-Verbindung für immer bestehen bleibt, wird fragil sein; Das ist nur die Natur des Internets.

Wie wäre es mit der Einrichtung des socat Als ein [x]inetd Bedienung?

Du würdest einstellen xinetd in PORT-B zu hören, und starten Sie die socat -u TCP4-LISTEN:PORT-A,reuseaddr STDIO sobald die B-Seite verbindet.

xinetd Übergibt den eingehenden Datenverkehr von der B-Seite an die Standardeingabe von socatund fangen die Standardausgabe von socat und übergebe es an die B-Seite.

Wenn B die Verbindung trennt, dann die socat Prozess kann beendet werden; xinetd wird ein neues beginnen, sobald B sich wieder verbindet. Während B nicht verbunden ist, erhält A die Fehlermeldung "Verbindung verweigert".

Ich musste mal etwas Ähnliches auf einem alten HP-UX System machen.


10
2017-08-17 12:42



A wird versuchen, sich bei einem Verbindungsverlust erneut zu verbinden, so dass dies abgedeckt ist. xinetd scheint zu funktionieren. Ich werde es versuchen und melden, danke! - dtech
Es löst das wichtigste Problem: dass die Dienste bei einem Fehler die Verbindung wiederherstellen können. Vielen Dank! - dtech


Die reale Welt ist chaotisch.

In der realen Welt sterben manchmal TCP-Verbindungen ab, dies kann zum Beispiel passieren, wenn eine Stateful Firewall oder NAT neu gestartet wird, wenn die Verbindung zu lange ohne Verkehr verläuft, wenn die zugrunde liegende Verbindung zu lange ausfällt.

Außerdem sterben manchmal, wenn Verbindungen sterben, sie nicht symmetrisch. Wenn eine Verbindung, die viele Daten enthält, abstirbt, ist es wahrscheinlich, dass der Absender bemerkt, dass sie tot ist, lange bevor der Empfänger dies tut. Dies hat ein paar Nebenwirkungen.

  • Wenn die Verbindung vom Absender zum Empfänger initiiert wird, kann eine neue Verbindung eingehen, während die alte Verbindung offensichtlich noch am Leben ist.
  • Wenn die Verbindung vom Empfänger zum Sender initiiert wird, kann es zu einer erheblichen Verzögerung zwischen dem Sender kommen, der die Verbindung entdeckt, und dem Empfänger, der diese Tatsache erkennt und eine Wiederverbindung auslöst.

Außerdem sind TCP-Verbindungen ein Stream von Bytes, NICHT ein Nachrichtenstrom. Wenn Ihre Verbindung abbricht, erhalten Sie möglicherweise eine Teilnachricht.

Das Endergebnis davon führt mich zu der Schlussfolgerung, dass eine robuste Lösung ein Verständnis des Anwendungsprotokolls erfordert, damit Ihre Lösung es verstehen kann.

  1. Wie man die Ströme spleißt, wenn eine neue Verbindung hereinkommt.
  2. Ob Nachrichten gespeichert werden sollen, wenn die Datenquelle vom Datenempfänger verbunden ist, ist dies nicht.
  3. Ob ein Ende-zu-Ende-Bestätigungsmechanismus geeignet ist, um einen Nachrichtenverlust zu verhindern.
  4. Ob ein "ping" -Mechanismus auf Anwendungsebene benötigt wird, um die Erkennung von toten Verbindungen zu beschleunigen.

3
2017-08-17 17:31



Alle guten Punkte, aber in diesem Fall ist das Anwendungsprotokoll sehr einfach. Teilnachrichten werden leicht erkannt und verworfen. Das Verlieren von Nachrichten ist kein großes Problem, wenn die Verbindung schnell genug wiederhergestellt werden kann. - dtech