
Netcat mit automatisierter NAT-Traversierung, sicherem P2P und erweiterten Funktionen für Shell-Zugriff, Dateiübertragung und Netzwerk-Proxying.
gonc ist ein auf Golang basierendes netcat-Tool, das die Peer-to-Peer-Kommunikation erleichtern soll. Seine Hauptmerkmale sind:
🔁 Automatisiertes NAT-Traversal: Keine Konfiguration erforderlich. Beide Seiten müssen sich nur auf eine Passphrase einigen. Durch die Verwendung des Parameters -p2p können Peers automatisch die Netzwerkadressen des jeweils anderen entdecken und eine Punkt-zu-Punkt-Verbindung durch NAT-Traversal aufbauen, wobei öffentliche STUN- und MQTT-Dienste für den Adressaustausch genutzt werden.
🔒 Ende-zu-Ende-Verschlüsselung mit gegenseitiger Authentifizierung: Unterstützt TLS für TCP und DTLS für UDP-verschlüsselte Übertragung, mit passphrasenbasierter gegenseitiger Identitätsauthentifizierung.
🧩 Flexible Dienstkonfiguration: Mit dem Parameter -e können Sie die Anwendung flexibel so konfigurieren, dass sie jede Verbindung bedient. Zum Beispiel kann -e /bin/sh eine entfernte cmd-Shell bereitstellen. Sie können auch integrierte virtuelle Befehle für einen praktischen SOCKS5-Dienst, HTTP-Dateidienst und Traffic-Weiterleitung verwenden.
gonc aufbaut: bequeme geräteübergreifende, netzwerkübergreifende P2P-Direktverbindung und sichere Dateiübertragung. Teilen Sie einfach eine Passphrase (oder scannen Sie einen QR-Code); keine Kommandozeile erforderlich.Verwenden Sie es wie nc:
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
kann nur Punkt-zu-Punkt-Verbindungen basierend auf IP und Port herstellen.
Jetzt können Sie auch Punkt-zu-Punkt-Verbindungen basierend auf einer gemeinsamen Passphrase mit automatisiertem NAT-Traversal herstellen.
Das folgende Diagramm zeigt den Prozess, wie gonc eine P2P-Verbindung zwischen einem Heimbreitbandnetzwerk (Hard NAT) und einem Peer in einem Mobilfunknetzwerk (Symmetric NAT) herstellt. Da beide Seiten IPv6 haben, wird auf beiden Seiten die Option -4 verwendet, um IPv4 zu erzwingen und so das NAT-Traversal zu demonstrieren.

Beide Seiten einigen sich auf dieselbe Passphrase. Auf der Senderseite starten Sie einen HTTP-Dateiserver, um die freizugebenden Dateien oder Verzeichnisse bereitzustellen. Die Option -httpserver akzeptiert mehrere Pfade, wobei jeder entweder eine einzelne Datei oder ein Verzeichnis sein kann:
gonc -p2p <passphrase> -httpserver c:/RootDir1 c:/RootDir2
Auf der Empfängerseite gibt es zwei Optionen:
Das gesamte Verzeichnis automatisch herunterladen
Nach Ausführung des folgenden Befehls werden alle Dateien rekursiv auf den lokalen Rechner heruntergeladen. Wenn der Vorgang unterbrochen wird, wird er beim erneuten Ausführen des Befehls automatisch an der Stelle fortgesetzt, an der er aufgehört hat:
gonc -p2p <passphrase> -download c:/SavePath
Über den Browser durchsuchen und selektiv herunterladen
Diese Option startet den Download nicht automatisch. Stattdessen müssen Sie manuell einen Browser öffnen und http://127.0.0.1:9999 aufrufen, um die Dateiliste des Peers anzuzeigen und Dateien nach Bedarf herunterzuladen:
gonc -p2p <passphrase> -httplocal-port 9999
Wenn Sie ein bestimmtes Unterverzeichnis herunterladen müssen, wird der Browser unpraktisch, aber Sie können es so machen:
gonc -http-download c:/SavePath http://127.0.0.1:9999/subdir
Stellen Sie eine sichere verschlüsselte P2P-Kommunikation zwischen zwei verschiedenen Netzwerken her, indem Sie sich auf eine Passphrase einigen (verwenden Sie gonc -psk ., um eine Passphrase mit hoher Entropie zu generieren, die passphrase ersetzt). Diese Passphrase wird für die gegenseitige Entdeckung und Zertifikatsableitung verwendet und gewährleistet die Kommunikationssicherheit mit TLS 1.3.
gonc -p2p passphrase
Verwenden Sie auf der anderen Seite dieselben Parameter (das Programm versucht automatisch eine TCP- oder UDP-Kommunikation (TCP bevorzugt), handelt Rollen aus (TLS-Client/Server) und schließt das TLS-Protokoll ab):
gonc -p2p passphrase
Beachten Sie, dass das andere Ende, wenn es mit dem Ausführen zögert, beendet wird, wenn es innerhalb von etwa einer halben Minute kein anderes Ende zum Informationsaustausch finden kann. Daher wird auch ein Wartemechanismus basierend auf MQTT-Nachrichtenabonnement unterstützt, wobei -mqtt-wait und -mqtt-hello verwendet werden, um den Zeitpunkt des P2P-Starts beider Parteien zu synchronisieren. Zum Beispiel wartet das Folgende kontinuierlich mit -mqtt-wait,
gonc -p2p passphrase -mqtt-wait
Auf der anderen Seite,
gonc -p2p passphrase -mqtt-hello
Überprüfen Sie Ihren NAT-Typ
gonc -nat-checker
Dies überprüft Ihre IPv6- und IPv4-TCP- und UDP-NAT-Adressen und analysiert Portänderungen nach NAT. Wenn keine TCP6- oder UDP6-Adressen aufgeführt sind, bedeutet dies, dass Sie kein IPv6 haben. Jede Protokolladresse endet mit "(easy)", was die höchste Erfolgsrate für Hole Punching anzeigt; "(hard)" zeigt eine höhere Erfolgsrate an; und "(symm)" ist am schwierigsten. Symm erfordert, dass das andere Ende entweder "easy" oder "hard" ist, damit P2P funktioniert.
-keep-open, akzeptiert nur eine Verbindung; keine Authentifizierung mit -psk):
gonc -tls -exec ":sh /bin/bash" -l 1234
gonc -tls -pty x.x.x.x 1234
passphrase wird zur Authentifizierung verwendet und gewährleistet sichere Kommunikation mit TLS 1.3):
gonc -exec ":sh /bin/bash" -p2p passphrase
gonc -pty -p2p passphrase
/dev/zero und /dev/urandom):
gonc.exe -send /dev/zero -P x.x.x.x 1234
IN: 76.8 MiB (80543744 bytes), 3.3 MiB/s | OUT: 0.0 B (0 bytes), 0.0 B/s | 00:00:23
gonc -P -l 1234 > NUL
Warten Sie, bis der Tunnel aufgebaut ist:
gonc -p2p passphrase -linkagent
Starten Sie auf der anderen Seite einen lokalen SOCKS5-/HTTP-Proxy-Dienst auf Port 3080, um auf das entfernte Netzwerk zuzugreifen:
# The link option controls how the local and remote proxy endpoints are created.
# Use none to indicate that no listening port is opened on that side:
gonc -p2p passphrase -link "3080;none"
Wenn Sie als Nächstes beispielsweise eine Verbindung zu 10.0.0.1:3389 im entfernten Netzwerk herstellen möchten, geben Sie einfach die folgende Adresse in Ihren lokalen Remote-Desktop-Client ein:
10.0.0.1-3389.gonc.cc:3080
Diese Domain wird in eine IP in der Form 127.b.c.d aufgelöst. Infolgedessen verbindet sich der Remote-Desktop-Client mit dem lokalen SOCKS5-Proxy auf Port 3080, und dann parst gonc die 127.b.c.d-Adresse umgekehrt, um die Information 10.0.0.1-3389 aus dem Domainnamen zu extrahieren.
link-Konfigurationsformat
# Based on the established tunnel, both local and remote sides listen on port 1080.
# The proxy supports both HTTP and SOCKS5 protocols, with transparent proxy capability enabled.
gonc -p2p <passphrase> -link "1080;1080"
# Below is the configuration method for the URL format. The parameter value of -link must be enclosed in quotes; otherwise, parsing problems may occur.
# The left side x://0.0.0.0:1080?tproxy=1 is equivalent to simply writing 1080.
# The right side enables port 1080 on the remote host, without transparent proxy support.
gonc -p2p <passphrase> -link "x://0.0.0.0:1080?tproxy=1;x://127.0.0.1:1080"
# The left side f://127.0.0.1:1080?to=1.2.3.4:80
# means listening locally on port 1080 and forwarding traffic to 1.2.3.4:80 on the remote side.
# The right side 'none' indicates that no port is opened remotely.
gonc -p2p <passphrase> -link "f://127.0.0.1:1080?to=1.2.3.4:80;none"
# The right side f://0.0.0.0:80?to=127.0.0.1:80
# means listening on port 80 on the remote side and forwarding traffic back to 127.0.0.1:80 locally.
gonc -p2p <passphrase> -link "none;f://0.0.0.0:80?to=127.0.0.1:80"
# The left side x+tls means the proxy protocol with TLS encryption and allows for certificate configuration. The right side specifies the outbound IP address via `outbound_bind` (suitable for multi-IP environments).
gonc -p2p <口令> -link "x+tls://user:[email protected]:1080?cert=ca.pem&key=key.pem;none?outbound_bind=10.0.0.5"
-exec, um die Anwendung flexibel so zu konfigurieren, dass sie Dienste für jede Verbindung bereitstellt. Anstatt beispielsweise /bin/bash für Shell-Befehle anzugeben, kann es auch für Port-Weiterleitung verwendet werden. Das folgende Beispiel startet jedoch für jede Verbindung einen neuen gonc-Prozess:
gonc -keep-open -exec "gonc -tls www.baidu.com 443" -l 8000
gonc -keep-open -exec ":nc -tls www.baidu.com 443" -l 8000
Client-Modus konfigurieren:
gonc -x s.s.s.s:port x.x.x.x 1234
Integrierter Socks5-Server: Verwenden Sie -e :s5s, um einen standardmäßigen Socks5-Dienst bereitzustellen. Unterstützt -auth, um einen Benutzernamen und ein Passwort für Socks5 festzulegen. Verwenden Sie -keep-open, um kontinuierlich Client-Verbindungen zum Socks5-Server anzunehmen. Dank der Goroutines von Golang wird eine gute Multi-Client-Parallelleistung erzielt:
gonc -e ":s5s -auth user:passwd" -keep-open -l 1080
Sicheres Socks5 über TLS: Da standardmäßiges Socks5 unverschlüsselt ist, verwenden Sie -e :s5s mit -tls und -psk, um eine sichere Socks5-over-TLS-Kommunikation anzupassen. Verwenden Sie -P, um Verbindungsübertragungsinformationen zu überwachen, und -acl, um Zugriffskontrolle für eingehende Verbindungen und Proxy-Ziele zu implementieren. Das Format der acl.txt-Datei finden Sie in acl-example.txt.
gonc.exe -tls -psk passphrase -e :s5s -keep-open -acl acl.txt -P -l 1080
Verwenden Sie auf der anderen Seite :s5c (integrierter s5c-Befehl), um Socks5 über TLS in standardmäßiges Socks5 umzuwandeln und so lokalen Client-Zugriff auf 127.0.0.1:3080 bereitzustellen:
gonc.exe -e ":s5c -tls -psk passphrase x.x.x.x 1080" -keep-open -l -local 127.0.0.1:3080
WireGuard beim NAT-Traversal unterstützen, um ein VPN zu bilden
Führen Sie auf der passiven (lauschenden) Seite, PC-S, den folgenden Befehl aus (verwenden Sie den öffentlichen Schlüssel des WireGuard-Peers als Passphrase und nehmen Sie an, dass WireGuard auf Port 51820 lauscht):
gonc -p2p <PublicKey-of-PS-S> -mqtt-wait -u -k -e ":nc -u 127.0.0.1 51820"
Setzen Sie auf der aktiven (initiierenden) Seite, PC-C, den Endpoint des WireGuard-Peers (PS-S) auf 127.0.0.1:51821, wobei die eigene WireGuard-Schnittstelle auf 51820 lauscht. Führen Sie dann den folgenden Befehl aus. Das -k-Flag ermöglicht es gonc, bei einem Netzwerkausfall automatisch erneut zu verbinden:
gonc -p2p <PublicKey-of-PS-S> -mqtt-hello -u -k -e ":nc -u -local 127.0.0.1:51821 127.0.0.1 51820"
Ein SOCKS5-Server mit UDP-ASSOCIATE-Unterstützung, der auf einer öffentlichen IP läuft, reicht als Relay aus. Sie können auch den integrierten SOCKS5-Proxy von gonc auf Ihrem eigenen VPS ausführen, um als Relay-Server zu fungieren.
Der folgende Befehl startet einen SOCKS5-Proxy, der nur UDP-Weiterleitung unterstützt. Die Optionen -psk und -tls aktivieren Verschlüsselung und PSK-basierte Authentifizierung. Hinweis: Öffnen Sie nicht einfach Port 1080 in Ihrer Firewall — die UDP-Weiterleitung verwendet für jede Sitzung zufällige Ports.
gonc -e ":s5s -u -c=0" -psk <password> -tls -k -l 1080
Wenn P2P fehlschlägt, muss nur eine Seite von gonc den P2P-Prozess mit der Option -x erneut versuchen, um über das SOCKS5-Relay zu routen:
gonc -p2p <passphrase> -x "-psk <password> -tls <socks5server-ip>:1080"
Alternativ können Sie einen standardmäßigen SOCKS5-Proxy-Server verwenden, der UDP-Weiterleitung unterstützt:
gonc -p2p <passphrase> -x "<socks5server-ip>:1080" -auth "user:password"
Wenn beispielsweise beide Peers hinter symmetrischen NATs liegen und P2P fehlschlägt, ändert die Verwendung eines SOCKS5-UDP-Relays durch nur eine Seite effektiv ihr NAT-Verhalten auf "easy", was den Verbindungsaufbau erheblich erleichtert. Die Daten bleiben Ende-zu-Ende-verschlüsselt.
"tcp://turn.cloudflare.com:80",
"udp://turn.cloudflare.com:53",
"udp://stun.l.google.com:19302",
"stun.gonc.cc:3478",
"global.turn.twilio.com:3478",
"stun.nextcloud.com:443",
"tcp://broker.hivemq.com:1883",
"tcp://broker.emqx.io:1883",
"tcp://test.mosquitto.org:1883",
"tcp://mqtt.gonc.cc:1883"
gonc klassifiziert NAT-Typen in drei Kategorien:
Easy: Ein einzelner interner Port wird über mehrere STUN-Server hinweg auf denselben externen Port abgebildet
Hard: Ein einzelner interner Port wird über STUN-Server hinweg auf einen konsistenten, aber unterschiedlichen externen Port abgebildet — schwieriger als Typ 1
Symmetric: Ein einzelner interner Port wird je nach Ziel auf unterschiedliche externe Ports abgebildet — der schwierigste Typ
Um diese NAT-Typen zu handhaben, verwendet gonc mehrere Traversal-Strategien:
Verwendet mehrere STUN-Server, um das NAT-Verhalten zu erkennen und Multi-Exit-IP-Szenarien zu identifizieren
Bevorzugt IPv6-Verbindungen, wenn beide Seiten dies unterstützen (z. B. TCP6-zu-TCP6-Direktwahl)
Beide Peers lauschen auf TCP und wählen gleichzeitig sich gegenseitig an, um die Erfolgsrate beim TCP-Hole-Punching zu erhöhen
Der Peer mit dem einfacheren NAT verzögert sein erstes UDP-Paket, um Portänderungen auf der schwierigeren Seite zu vermeiden
Der Peer mit dem schwierigeren NAT sendet UDP-Pakete mit einer niedrigen TTL, um Störungen durch die entfernte Firewall zu reduzieren
Als letztes Mittel wird eine "Geburtstagsparadoxon"-Strategie verwendet: Die schwierigere Seite verwendet 600 zufällige Quellports, und die andere Seite versucht 600 zufällige Zielports, wodurch die Chance einer erfolgreichen UDP-Port-Kollision erhöht wird