•  untoreh-light

TCSplitter

Ein Tunnel zum Aufteilen einer TCP- oder UDP-Verbindung auf mehrere TCP-Verbindungen

Ziel

Wann möchten Sie eine TCP-Verbindung in mehrere aufteilen? Normalerweise verwendet man a Tunnel erreichen das genaue gegenteil . Mein Anwendungsfall war die Umgehung von Bandbreitenbeschränkungen in einem Mobilfunknetz, daher wurden Tests mit einer SIM-Karte durchgeführt, deren Plan keine Daten mehr enthielt[1].

Wie funktioniert es

Die Tunnel wurde geschrieben golang da es schnell genug ist und häufig für Netzwerktools verwendet wird. Die cli ist kaum nutzbar, da die meisten Optionen überarbeitet wurden, da ich verschiedene Methoden getestet habe.

Anfangs gab es "Flings" und "Lassos", um die Anzahl der Verbindungen für ausgehende (geschleuderte) und eingehende (lassoed) aufzuteilen, aber dies war eine unnötige Abstraktion, da es besser ist, Pakete mit ihrem Ziel zu versehen, obwohl die Hauptabsicht es war unterschiedliche Ratenbegrenzungen für ausgehende und eingehende Verbindungen anzubieten, so dass eine höhere Trennung zwischen Up/Down sinnvoll erschien.

Der Client muss alle Verbindungen instanziieren, da wir davon ausgehen, dass der Server ausgehende Verbindungen nicht öffnen kann. Wenn die Clients eine Verbindung von einer Benutzeranwendung erhalten, richtet sie den erforderlichen Pool von Verbindungen mit dem Server ein und teilt alle empfangenen Daten gemäß einem benutzerdefinierten Limit auf die dedizierten Verbindungen auf.

Die Pakete werden dann an den Server gesendet, der sie in die richtige Reihenfolge rekonstruieren muss, da verschiedene TCP-Verbindungen den Datenstrom jederzeit beenden können (Sendereihenfolge wird nicht eingehalten, weil routen ) und dann an die empfangende App weitergeleitet.

Verbindungen werden geschlossen und neue geöffnet, wenn das konfigurierte Datenlimit pro Verbindung erreicht ist, ähnlich wie Schattensocken Proxys tunneln Daten über verschiedene Streams mit dem Ziel, das Verhalten von Datenströmen zu maskieren, außer dass unser Tunnel dies so häufig wie möglich tut.

Warum funktioniert es

Die Absicht hier ist, zu steuern, wie viele Daten jede Verbindung verarbeiten soll. Für unsere Zwecke war es nie darüber hinaus, was normalerweise so ist MTU Fenstergröße. Sie können sich die MTU als die obere Grenze eines Datenelements vorstellen, das das gesamte Netzwerk durchquert, und das war unser Ziel, weil wir die Bandbreitenbeschränkungen eines Gated-Netzwerks umgehen wollten. Um zu begrenzen, wie viele Daten ein Client durchlassen kann, müssen Sie zählen es richtig? Wenn deine Logik mit so etwas funktioniert wie ado-while

Dann musst du wenigstens bekomme einpacket. Ich bin mir nicht sicher, ob dies tatsächlich der Fall ist oder der Grund, warum mein Tunnel funktioniert, ein anderer ist. Vielleicht ist es durchaus möglich, sogar das erste Paket zu überprüfen, aber aus gestalterischer Sicht würde das bedeuten, dass Sie überprüfen müssen jeden einzelne Verbindung, was das System gegenüber DOS-Angriffen schwächer machen würde, und ja, mein Tunnel könnte leicht als effizientes DOS/Stress-Tool verwendet werden, da Sie die Daten in sehr kleine Pakete aufteilen können (was bedeutet, dass TCP-Verbindungen einen hohen Recyclingdruck haben ) und verfügen über einen beliebig großen Pool an Verbindungen.

Tests über verschiedene Ports zeigten auch, dass es nur über etwas Ports, und dass die Grenze zwischen den Ports ständig unterschiedlich war, mit443 Geben eines der höheren Fenster, herum20kb , raten, weilTLS Handshakes erfordern mehr Daten und diese Ratenbegrenzungen würden sich je nach Tageszeit ändern[2].

Ergebnisse

Ich habe es mit Erasure Coding versucht, in der Hoffnung, den Datendurchsatz zu erhöhen. Durch Verwendung einer Erasure Coding Library und Enc/Decoding der Daten selbst sowie durch Überlagern der KCP Protokoll über mein Aufteilungsprotokoll. Das Ausprobieren von KCP mag ein rückwärtsgewandter Ansatz erscheinen, da es eine bessere Latenz für einen geringeren Durchsatz eintauscht, aber meine anfängliche Annahme war, dass mein Engpass in Verbindungen lag, die während der Übertragung unterbrochen wurden, was zu vielen beschädigten Paketen führen würde, sodass ich einen höheren hätte erreichen können Durchsatz mit Fehlerkorrektur.

Es stellte sich heraus, dass es nur eine Geschwindigkeitsbegrenzung war, wie viele TCP-Verbindungen ein Client über das Netzwerk senden kann, also nur ein DOS-Schutz, gegen den ich nichts tun kann. Nach X Verbindungen beliebigSYN Versuche hören auf, ihr Geld zu erhaltenACK, den Rückstand auffüllen und schließlich den Tunnel zum Stillstand bringen. Versuch und Irrtum haben gezeigt, dass es möglich war zwischen4-8[3] Verbindungen jederzeit offen und mit einer MTU von500-1000 Bytes könntest du zumindest einen stetigen Strom halten128kbps , wäre kein konstanter Strom erforderlich, könnten Sie in kürzerer Zeit höhere Geschwindigkeiten erreichen, indem Sie Sprengung viele Anschlüsse auf Anfrage.

Im Gegensatz dazu ist ein (wahr)DNS Tunnel kann kaum schieben56kbps und kann schnell gedrosselt werden, weil ich denke, dass eine hohe Anzahl von DNS-Anfragen verdächtiger aussieht als TCP-Anfragen. Wir müssen angeben, dass atrue DNS-Tunnel kodiert (ausgehende) Daten über gefälschte Subdomains und dekodiert (eingehende) Daten, die durch Abfragen von DNS-Einträgen empfangen werden, während ein DNS-Tunnel manchmal als rohe UDP-Verbindung über den DNS-Port betrachtet werden kann, der wahrscheinlich irgendwann in der Vergangenheit DNS-Server war erlaubt und korrekt weitergeleitet.

Schlussfolgerungen

Ich bin mir nicht sicher, ob ich mein Ziel erreicht habe Dienstprogramm weise, da das Ausführen eines solchen Tunnels Ihr Telefon ziemlich heiß machen und viel Akku verschwenden kann, aber es als Backup-Verbindung zu haben, kann beruhigend sein ... wenn ich mich tatsächlich die Mühe mache, es stabil genug zu machen :)

[1]normalerweise, wenn eine SIM-Karte keine Daten mehr zum Surfen im Internet hat, werden Webanfragen an das Capture-Gateway umgeleitet (um Sie aufzufordern, mehr Daten zu kaufen).
[2]mobile Datentarife können eine bessere Verbindung während der Nachtstunden bieten
[3]Diese Zahl, die in gewisser Weise an die üblichen Kernzahlen angepasst ist, könnte Sie vermuten lassen, dass der Kernel die Verbindungen irgendwie einschränkt, das Szenario geöffneter Verbindungen unseres Tunnels ist definitiv ungewöhnlich, aber das Tunen von Linux-Knöpfen hat mir nie bessere Ergebnisse gebracht.

Post-Tags: