Sicherer, gemultiplexter TCP/UDP-Port-Forwarder mit Piping-Server von @nwtgck als Relay. Hauptsächlich für P2P-Verbindungen zwischen Peers hinter (mehreren) NAT/Firewalls konzipiert.
Für den Sonderfall von IPFS siehe unten #Beispiele.
ID: Jeder Knoten erhält eine eindeutige (base64) ID -
tunnel -i
Die ID ist an die Hardware (MAC-Adresse) und die Umgebungsvariablen USER, HOME und HOSTNAME gebunden. Teilen Sie es ein für alle Mal mit Ihren Kollegen. Hinweis: Zwei Benutzer auf demselben Computer erhalten unterschiedliche Knoten-IDs, da sich ihre USER- und HOME-Variablen unterscheiden.
Servermodus: Stellen Sie Ihren lokalen Port den Peers zur Verfügung, mit denen Sie eine geheime Zeichenfolge teilen –
tunnel [options] [-u] [-k < shared-secret > ] < local-port >
Client-Modus: Leiten Sie Ihren lokalen Port an den exponierten lokalen Port des Peers weiter –
tunnel [options] [-u] [-k < shared-secret > ] [-b < local-port > ] [-I < IP > ] < peer-ID:peer-port >
Wenn mit der Option -b
kein lokaler Port angegeben wird, verwendet tunnel
einen zufälligen, nicht verwendeten Port. Der verwendete Port wird immer bei stdout gemeldet.
Die Option -I
ist praktisch, wenn der Client auf einem Laptop läuft, der gelegentlich eine Verbindung zum LAN herstellt, in dem sich der Server befindet. Wenn der Server im LAN mit privater IP = <IP>
gefunden werden kann, stellt tunnel
eine Verbindung über das LAN her.
Client und Server müssen dasselbe Geheimnis verwenden, um sich miteinander verbinden zu können. Die geheime Zeichenfolge kann auch mithilfe der Umgebungsvariablen TUNNEL_KEY
übergeben werden. Das mit -k
übergebene Geheimnis hat Vorrang.
Das Flag -u
bezeichnet die Verwendung von UDP anstelle des Standard-TCP. Wenn es verwendet wird, muss es von beiden Peers verwendet werden.
Alle Protokolle befinden sich standardmäßig in stderr. Mit der Option -l <logfile>
kann man tunnel
jedoch im Hintergrund ( Daemon-Modus ) starten, wobei die Protokolle in <logfile>
gespeichert werden. Die Daemon-Prozess-ID wird dem Benutzer beim Start angezeigt, sodass er den Daemon jederzeit beenden kann
tunnel -K < procID >
Optionen:
Eine vollständige Liste der Optionen finden Sie unter: tunnel -h
Herunterladen mit:
curl -LO https://raw.githubusercontent.com/SomajitDey/tunnel/main/tunnel
Machen Sie es ausführbar:
chmod +rx ./tunnel
Dann systemweit installieren mit:
./tunnel -c install
Wenn Sie keine sudo
Berechtigung haben, können Sie stattdessen lokal installieren:
./tunnel -c install -l
So können Sie jederzeit nach der Installation aktualisieren:
tunnel -c update
Dieses Programm ist einfach ein ausführbares bash
-Skript, das auf Standard-GNU-Tools wie socat
, openssl
, curl
, mktemp
, cut
, awk
, sed
, flock
, pkill
, dd
, xxd
, base64
usw. basiert, die in Standard-Linux-Distributionen leicht verfügbar sind.
Wenn auf Ihrem System eines dieser Tools fehlt und Sie nicht über die erforderlichen sudo
Berechtigungen verfügen, um es aus dem nativen Paket-Repository zu installieren (z. B. sudo apt-get install <package>
), laden Sie eine portable Binärdatei herunter und installieren Sie sie lokal unter ${HOME}/.bin
.
SSH :
Peer A macht lokalen SSH-Port verfügbar –
tunnel -k " ${secret} " 22
Peer B verbindet sich -
tunnel -b 67868 -k " ${secret} " -l /dev/null " ${peerA_ID} :22 " # Daemon due to -l
ssh -l " ${login_name} " -p 67868 localhost
IPFS :
Angenommen, Peer A hat die IPFS-Peer-ID: 12orQmAlphanumeric
. Ihr IPFS-Daemon lauscht am Standard-TCP-Port 4001. Sie macht ihn verfügbar mit –
tunnel -k " ${swarm_key} " ipfs
swarm_key
ist einfach eine beliebige geheime Zeichenfolge, die Peer A verwenden kann, um zu steuern, wer über tunnel
eine Swarm-Verbindung zu ihr herstellen kann.
Peer B verbindet sich jetzt mit Peer A für Dateifreigabe, Pubsub oder P2P –
tunnel -k " ${swarm_key} " 12orQmAlphanumeric
Dieser letzte Befehlsschwarm stellt über das Piping-Server-Relay eine Verbindung zu Peer A her und stellt im Hintergrund alle paar Sekunden eine Schwarmverbindung her, um die Verbindung aufrechtzuerhalten.
tunnel
startet den IPFS-Daemon im Hintergrund, sofern er nicht bereits aktiv ist.
Der Pfad zum IPFS-Repository kann mit der Option -r
übergeben werden. Ansonsten wird wie gewohnt die Umgebungsvariable IPFS_PATH
oder der Standardpfad ~/.ipfs
verwendet. Beispiel: tunnel -r ~/.ipfs -i
gibt die IPFS-Peer-ID an.
Remote-Shell :
Angenommen, Sie müssten regelmäßig Befehle auf der Linux-Box Ihres Arbeitsplatzes von Ihrem Heimcomputer aus ausführen. Und aus irgendeinem Grund möchten/können Sie SSH nicht über tunnel
verwenden.
Stellen Sie am Arbeitsplatzcomputer einen beliebigen lokalen TCP-Port bereit, z. B. 49090, und verbinden Sie eine Shell mit diesem Port:
tunnel -l " /tmp/tunnel.log " -k " your secret " 49090 # Note the base64 node id emitted
socat TCP-LISTEN:49090,reuseaddr,fork SYSTEM: ' bash 2>&1 '
Zurück bei Ihnen zu Hause:
tunnel -l " /dev/null " -b 5000 -k " your secret " " node_id_of_workplace:49090 "
rlwrap nc localhost 5000
Die Verwendung von rlwrap ist keine Notwendigkeit. Aber es macht das Erlebnis auf jeden Fall angenehmer, da es GNU Readline verwendet und sich den Eingabeverlauf merkt (aufrufbar mit den Auf-/Ab-Pfeiltasten, ähnlich wie bei Ihren lokalen Bash-Sitzungen).
Redis :
Müssen Sie eine Verbindung zu einer Remote-Redis-Instanz herstellen, die von einem Peer oder Ihnen selbst gehostet wird? Stellen Sie auf dem Remote-Host den TCP-Port bereit, auf dem redis-server
ausgeführt wird (Standard: 6379), mit tunnel
.
Verwenden Sie auf Ihrem lokalen Computer tunnel
um einen TCP-Port an den Remote-Port weiterzuleiten. Richten Sie Ihr redis-cli
auf den weitergeleiteten lokalen Port.
Nachfolgend sind einige zufällige Anwendungsfälle aufgeführt, die mir für tunnel
einfallen könnten. Im Großen und Ganzen sollte alles, was NAT/Firewall-Durchquerung (z. B. WebRTC ohne TURN) oder den Beitritt zu einem Remote-LAN beinhaltet, als tunnel
nützlich sein. Einige der folgenden Ideen sind eher skizzenhaft, wurden überhaupt nicht getestet und funktionieren möglicherweise nicht, werden aber dennoch hier dokumentiert, zumindest vorerst, nur der Inspiration halber. Wenn Sie eines davon nützlich oder nutzlos fanden oder völlig neue Anwendungen für tunnel
entdeckt haben, posten Sie es bitte unter „Diskussionen“. Die Fälle, die ich getestet habe, sind als „funktionierend“ gekennzeichnet.
tunnel
weitergeleitet wurde.tunnel
bei Heroku aus (kostenlos) und leiten Sie den in der Umgebungsvariablen PORT
gespeicherten Port an Ihren lokalen Port weiter, den Sie freigeben möchten. Und Sie haben Ihre öffentliche URL als: https://Ihr-App-Name.herokuapp.com.tunnel
. tunnel
verschlüsselt den gesamten Datenverkehr zwischen einem Peer und dem Relay mit TLS, wenn das Relay https verwendet. Zwischen den Peers untereinander gibt es per se keine Ende-zu-Ende-Verschlüsselung. Es wird jedoch behauptet, dass das Piping-Server-Relay speicherlos ist.
Ein Client-Peer kann nur dann eine Verbindung zu einem Serving-Peer herstellen, wenn dieser denselben geheimen Schlüssel (TUNNEL_KEY) verwendet. Der Schlüssel wird hauptsächlich für die Peer-Erkennung in der Relay-Phase verwendet. Bei jeder neuen Verbindung zum weitergeleiteten lokalen Port sendet der Client einen zufälligen Sitzungsschlüssel an den bedienenden Peer. Anschließend stellen die Peers auf Grundlage dieses Zufallsschlüssels eine neue Verbindung an einem anderen Relay-Punkt her, damit die eigentliche Datenübertragung stattfinden kann. Außenseiter, nämlich. Bösewichte, die den TUNNEL_KEY nicht kennen, sollten diesen Fluss nicht stören können.
Ein böswilliger Peer kann jedoch Folgendes tun. Da er den TUNNEL_KEY und die Knoten-ID des bedienenden Peers kennt, kann er sich als letzterer ausgeben. Daten von einem ahnungslosen Verbindungspartner würden daher an den Imitator weitergeleitet, wodurch der echte Server ausgehungert würde. Zukünftige Updates/Implementierungen von tunnel
sollten diese Bedrohung mithilfe von Krypto mit öffentlichem Schlüssel bewältigen. [In diesem Fall wäre der zufällige Sitzungsschlüssel, der für jede neue weiterzuleitende Verbindung generiert wird, allein vom echten Server entschlüsselbar.]
Da tunnel
im Wesentlichen die Transportschicht darstellen, sollten die oben genannten Punkte nicht entmutigend sein, da die meisten Anwendungen wie SSH und IPFS Daten auf der Anwendungsschicht verschlüsseln. Eine Ende-zu-Ende-Verschlüsselung tunnel
für alle Datenübertragungen würde die Latenz nur erhöhen. Sie können jedoch jederzeit einen SSH-Tunnel erstellen, nachdem Sie das Low-Level-Peering mit tunnel
eingerichtet haben, wenn Sie dies wünschen.
Das vom tunnel
verwendete Standard-Relay ist https://ppng.io. Sie können auch ein anderes öffentliches Relay aus dieser Liste verwenden oder Ihre eigene Instanz bei kostenlosen Diensten hosten, wie sie beispielsweise von Heroku angeboten werden. Um eine Verbindung herzustellen, müssen zwei Peers natürlich dasselbe Relais verwenden.
Wenn Sie möchten, können Sie mit einfachen Tools wie Sertain auch Ihr eigenes Relais schreiben, das vom tunnel
verwendet wird. Stellen Sie einfach sicher, dass Ihr Relay-Dienst über dieselbe API wie der Piping-Server verfügt. Wenn Ihr Relay-Code Open Source ist, können Sie ihn gerne bei Diskussionen vorstellen.
gsocket ; ipfs p2p mit aktiviertem Circuit-Relay; go-piping-duplex ; pipeto.me ; Uplink; localhost.run ; ngrok ; lokaler Tunnel; sshreach.me ( kostenlose Testversion nur für begrenzten Zeitraum ); mehr
Hinweise:
tunnel
und Piping-Server können Sie jedoch einfach Ihre eigene Relay-Instanz bereitstellen, deren öffentliche URL ein für alle Mal mit Ihren Kollegen teilen, dasselbe wie TUNNEL_RELAY
in .bashrc
export
und schon kann es losgehen. Zur Redundanz stehen außerdem mehrere öffentliche Piping-Server zur Verfügung.IPFS (Fertig):
Die Verbindung zu IPFS wäre viel einfacher:
tunnel -k <secret> ipfs
zum Offenlegen und tunnel -k <secret> <IPFS_peerID>
zum Herstellen einer Verbindung.
Diese starten den IPFS-Daemon selbstständig, wenn sie offline sind. Der letztere Befehl stellt in Abständen von 30 Sekunden wiederholt eine Schwarmverbindung zum angegebenen Peer her. Die IPFS-Peer-ID wird als Knoten-ID verwendet, sodass Peers ihre Knoten-IDs nicht mehr separat teilen müssen. Nicht standardmäßige IPFS-Repo-Pfade können mit der Option -r
übergeben werden. oder IPFS_PATH
.
SSH:
Das Erstellen eines SSH-Tunnels zwischen dem lokalen und dem Peer-Port wäre so einfach wie:
tunnel -k <secret> ssh
zum Offenlegen von &
tunnel -sk <secret> -b <local-port> <peerID>:<peer-port>
zum Erstellen.
Beachten Sie, dass beim Herstellen einer Verbindung kein Anmeldename mehr angegeben werden muss. Standardmäßig wird der ${USER}
des bedienenden Knotens als Anmeldename verwendet. Bei Bedarf kann jedoch jederzeit ein nicht standardmäßiger Anmeldename mithilfe einer Umgebungsvariablen oder -option übergeben werden.
GPG:
Virtuelle Maschinen, wie sie beispielsweise von Cloud-Shells und Dynos verwendet werden, verfügen nicht über dauerhafte, eindeutige Hardwareadressen. Die Node-ID ändert sich daher für eine solche VM von Sitzung zu Sitzung ständig. Zukünftige tunnel
hätten eine -g
Option, die einen privaten GPG-Schlüssel an tunnel
übergeben würde. Die Knoten-ID würde aus dem Fingerabdruck dieses Schlüssels generiert, ähnlich wie IPFS. Dies würde auch tunnel
sicherer machen.
Argon2:
Option [ -a
], um argon2 für das Hashing von TUNNEL_KEY vor der Verwendung zu verwenden, damit ein schwächeres Geheimnis nicht zu anfällig ist.
Bitte melden Sie Fehler bei Problemen. Veröffentlichen Sie Ihre Gedanken, Kommentare, Ideen, Anwendungsfälle und Funktionswünsche in der Diskussion. Lassen Sie mich wissen, wie Ihnen das geholfen hat, wenn es überhaupt geholfen hat.
Sie können mir auch gerne direkt über alles, was dieses Projekt betrifft, schreiben.
Wenn Ihnen dieses kleine Drehbuch von Nutzen ist, wäre ein Stern für mich eine große Ermutigung.
Danke ! ?