
Netcat avec traversée NAT automatisée, P2P sécurisé et fonctionnalités avancées pour l'accès au shell, le transfert de fichiers et le proxy réseau.
gonc est un outil netcat basé sur Golang, conçu pour faciliter la communication pair-à-pair. Ses principales fonctionnalités incluent :
🔁 Traversée de NAT automatisée : Zéro configuration. Les deux côtés doivent simplement s'accorder sur une phrase secrète. En utilisant le paramètre -p2p, les pairs peuvent découvrir automatiquement les adresses réseau de l'autre et établir une connexion point-à-point via la traversée de NAT, en s'appuyant sur des services publics STUN et MQTT pour l'échange d'adresses.
🔒 Chiffrement de bout en bout avec authentification mutuelle : Prend en charge TLS pour TCP et DTLS pour UDP en transmission chiffrée, avec authentification mutuelle d'identité basée sur une phrase secrète.
🧩 Configuration de service flexible : Avec le paramètre -e, vous pouvez configurer flexiblement l'application pour servir chaque connexion. Par exemple, -e /bin/sh peut fournir un shell cmd distant. Vous pouvez également utiliser des commandes virtuelles intégrées pour un service SOCKS5 pratique, un service de fichiers HTTP et la redirection de trafic.
Téléchargement de la dernière version
gonc : connexion directe P2P pratique entre appareils et réseaux, et transfert de fichiers sécurisé. Partagez simplement une phrase secrète (ou scannez un QR code) ; aucune ligne de commande requise.Utilisez-le comme nc :
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
ne peut établir que des connexions point-à-point basées sur IP et port.
Désormais, vous pouvez également établir des connexions point-à-point basées sur une phrase secrète partagée, avec traversée de NAT automatisée.
Le diagramme suivant montre le processus par lequel gonc établit une connexion P2P entre un réseau haut débit domestique (NAT difficile) et un pair sur un réseau mobile (NAT symétrique). Comme les deux côtés disposent d'IPv6, l'option -4 est utilisée aux deux extrémités pour forcer IPv4 afin de démontrer la traversée de NAT.

Les deux côtés s'accordent sur la même phrase secrète. Du côté de l'expéditeur, démarrez un serveur de fichiers HTTP pour exposer les fichiers ou répertoires à partager. L'option -httpserver accepte plusieurs chemins, chacun pouvant être un fichier unique ou un répertoire :
gonc -p2p <passphrase> -httpserver c:/RootDir1 c:/RootDir2
Du côté du récepteur, deux options s'offrent à vous :
Télécharger automatiquement l'intégralité du répertoire
Après avoir exécuté la commande suivante, tous les fichiers seront téléchargés récursivement sur la machine locale. Si le processus est interrompu, relancer la commande reprendra automatiquement là où il s'était arrêté :
gonc -p2p <passphrase> -download c:/SavePath
Parcourir et télécharger sélectivement via le navigateur
Cette option ne démarre pas automatiquement le téléchargement. Vous devez ouvrir manuellement un navigateur et visiter http://127.0.0.1:9999 pour consulter la liste des fichiers du pair et télécharger les fichiers selon vos besoins :
gonc -p2p <passphrase> -httplocal-port 9999
Si vous devez télécharger un sous-répertoire spécifique, le navigateur devient peu pratique, mais vous pouvez procéder ainsi :
gonc -http-download c:/SavePath http://127.0.0.1:9999/subdir
Établissez une communication P2P chiffrée sécurisée entre deux réseaux différents en convenant d'une phrase secrète (utilisez gonc -psk . pour générer une phrase secrète à haute entropie afin de remplacer passphrase). Cette phrase secrète est utilisée pour la découverte mutuelle et la dérivation de certificats, garantissant la sécurité des communications avec TLS 1.3.
gonc -p2p passphrase
De l'autre côté, utilisez les mêmes paramètres (le programme tentera automatiquement une communication TCP ou UDP (TCP en priorité), négociera les rôles (client/serveur TLS) et complétera le protocole TLS) :
gonc -p2p passphrase
Notez que si l'autre extrémité retarde son exécution, elle quittera si elle ne trouve pas l'autre extrémité avec qui interagir dans environ une demi-minute. Par conséquent, il prend également en charge un mécanisme d'attente basé sur l'abonnement aux messages MQTT, en utilisant -mqtt-wait et -mqtt-hello pour synchroniser le moment où les deux parties démarrent le P2P. Par exemple, ce qui suit utilise -mqtt-wait pour attendre en continu,
gonc -p2p passphrase -mqtt-wait
De l'autre côté,
gonc -p2p passphrase -mqtt-hello
Vérifiez votre type de NAT
gonc -nat-checker
Cela vérifiera vos adresses NAT IPv6 et IPv4 TCP et UDP et analysera les changements de port après le NAT. Si aucune adresse TCP6 ou UDP6 n'est listée, cela signifie que vous n'avez pas d'IPv6. Chaque adresse de protocole se termine par "(easy)", indiquant le taux de réussite le plus élevé pour le hole punching ; "(hard)" indique un taux de réussite plus élevé ; et "(symm)" est le plus difficile. Symm nécessite que l'autre extrémité soit soit "easy" soit "hard" pour que le P2P fonctionne.
-keep-open, accepte une seule connexion ; pas d'authentification avec -psk) :
gonc -tls -exec ":sh /bin/bash" -l 1234
gonc -tls -pty x.x.x.x 1234
passphrase est utilisé pour l'authentification, garantissant une communication sécurisée avec TLS 1.3) :
gonc -exec ":sh /bin/bash" -p2p passphrase
gonc -pty -p2p passphrase
/dev/zero et /dev/urandom intégrés) :
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
Attendez que le tunnel soit établi :
gonc -p2p passphrase -linkagent
De l'autre côté, démarrez un service proxy SOCKS5 / HTTP local sur le port 3080 pour accéder au réseau distant :
# 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"
Ensuite, par exemple, si vous souhaitez vous connecter à 10.0.0.1:3389 dans le réseau distant, vous pouvez simplement saisir l'adresse suivante dans votre client Bureau à distance local :
10.0.0.1-3389.gonc.cc:3080
Ce domaine sera résolu en une IP sous la forme 127.b.c.d. Par conséquent, le client Bureau à distance se connectera au proxy SOCKS5 local sur le port 3080, puis gonc analysera en sens inverse l'adresse 127.b.c.d pour extraire l'information 10.0.0.1-3389 du nom de domaine.
Format de configuration de link
# 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 pour configurer flexiblement l'application afin de fournir des services pour chaque connexion. Par exemple, au lieu de spécifier /bin/bash pour les commandes shell, il peut également être utilisé pour la redirection de port. Cependant, l'exemple suivant démarre un nouveau processus gonc pour chaque connexion :
gonc -keep-open -exec "gonc -tls www.baidu.com 443" -l 8000
gonc -keep-open -exec ":nc -tls www.baidu.com 443" -l 8000
Configurez le mode client :
gonc -x s.s.s.s:port x.x.x.x 1234
Serveur Socks5 intégré : Utilisez -e :s5s pour fournir un service Socks5 standard. Prend en charge -auth pour définir un nom d'utilisateur et un mot de passe pour Socks5. Utilisez -keep-open pour accepter en continu les connexions clientes au serveur Socks5. Grâce aux goroutines de Golang, il atteint de bonnes performances de concurrence multi-clients :
gonc -e ":s5s -auth user:passwd" -keep-open -l 1080
Socks5 sécurisé sur TLS : Étant donné que Socks5 standard n'est pas chiffré, utilisez -e :s5s avec -tls et -psk pour personnaliser une communication Socks5 sécurisée sur TLS. Utilisez -P pour surveiller les informations de transmission de connexion, et -acl pour mettre en œuvre le contrôle d'accès pour les connexions entrantes et les destinations proxy. Pour le format du fichier acl.txt, voir acl-example.txt.
gonc.exe -tls -psk passphrase -e :s5s -keep-open -acl acl.txt -P -l 1080
De l'autre côté, utilisez :s5c (commande s5c intégrée) pour convertir Socks5 sur TLS en Socks5 standard, fournissant un accès client local sur 127.0.0.1:3080 :
gonc.exe -e ":s5c -tls -psk passphrase x.x.x.x 1080" -keep-open -l -local 127.0.0.1:3080
Aider WireGuard à traverser le NAT pour former un VPN
Du côté passif (écoute), PC-S, exécutez la commande suivante (en utilisant la clé publique du pair WireGuard comme phrase secrète, et en supposant que WireGuard écoute sur le port 51820) :
gonc -p2p <PublicKey-of-PS-S> -mqtt-wait -u -k -e ":nc -u 127.0.0.1 51820"
Du côté actif (initiateur), PC-C, définissez l'Endpoint du pair WireGuard (PS-S) sur 127.0.0.1:51821, avec sa propre interface WireGuard écoutant sur 51820. Exécutez ensuite la commande suivante. Le flag -k permet à gonc de se reconnecter automatiquement si le réseau tombe :
gonc -p2p <PublicKey-of-PS-S> -mqtt-hello -u -k -e ":nc -u -local 127.0.0.1:51821 127.0.0.1 51820"
Un serveur SOCKS5 avec prise en charge d'UDP ASSOCIATE fonctionnant sur une IP publique suffit comme relais. Vous pouvez également exécuter le proxy SOCKS5 intégré de gonc sur votre propre VPS pour servir de serveur relais.
La commande suivante démarre un proxy SOCKS5 qui ne prend en charge que la redirection UDP. Les options -psk et -tls activent le chiffrement et l'authentification basée sur PSK. Remarque : N'ouvrez pas simplement le port 1080 dans votre pare-feu — la redirection UDP utilise des ports aléatoires pour chaque session.
gonc -e ":s5s -u -c=0" -psk <password> -tls -k -l 1080
Lorsque le P2P échoue, vous n'avez besoin que d'un côté de gonc pour réessayer le processus P2P en utilisant l'option -x afin de passer par le relais SOCKS5 :
gonc -p2p <passphrase> -x "-psk <password> -tls <socks5server-ip>:1080"
Alternativement, vous pouvez utiliser un serveur proxy SOCKS5 standard qui prend en charge la redirection UDP :
gonc -p2p <passphrase> -x "<socks5server-ip>:1080" -auth "user:password"
Par exemple, si les deux pairs sont derrière des NAT symétriques et que le P2P échoue, le fait qu'un seul côté utilise un relais UDP SOCKS5 modifie effectivement son comportement NAT en "easy", ce qui facilite grandement l'établissement d'une connexion. Les données restent chiffrées de bout en bout.
"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 classe les types de NAT en trois catégories :
Easy : Un seul port interne est mappé sur le même port externe à travers plusieurs serveurs STUN
Hard : Un seul port interne est mappé sur un port externe cohérent mais différent à travers les serveurs STUN — plus difficile que le type 1
Symmetric : Un seul port interne est mappé sur différents ports externes selon la destination — le type le plus difficile
Pour gérer ces types de NAT, gonc emploie plusieurs stratégies de traversée :
Utilise plusieurs serveurs STUN pour détecter le comportement NAT et identifier les scénarios multi-sortie IP
Préfère les connexions IPv6 lorsque les deux côtés le prennent en charge (par exemple, TCP6-vers-TCP6 en appel direct)
Les deux pairs écoutent sur TCP tout en s'appelant mutuellement pour augmenter le succès du hole punching TCP
Le pair avec le NAT le plus facile retarde son paquet UDP initial pour éviter de déclencher des changements de port du côté le plus difficile
Le pair avec le NAT le plus difficile envoie des paquets UDP avec un TTL faible pour réduire les interférences du pare-feu distant
En dernier recours, utilise une stratégie de "paradoxe des anniversaires" : le côté le plus difficile utilise 600 ports source aléatoires, et l'autre côté essaie 600 ports de destination aléatoires, augmentant la chance d'une collision de port UDP réussie