
Netcat con NAT traversal automatizzato, P2P sicuro e funzionalità avanzate per accesso alla shell, trasferimento file e proxy di rete.
gonc è uno strumento netcat basato su Golang progettato per facilitare la comunicazione peer-to-peer. Le sue caratteristiche principali includono:
🔁 NAT Traversal automatizzato: Configurazione zero. Entrambe le parti devono solo concordare una passphrase. Utilizzando il parametro -p2p, i peer possono scoprire automaticamente gli indirizzi di rete reciproci e stabilire una connessione punto-punto attraverso il NAT traversal, sfruttando servizi pubblici STUN e MQTT per lo scambio degli indirizzi.
🔒 Crittografia end-to-end con autenticazione reciproca: Supporta TLS per TCP e DTLS per UDP per la trasmissione cifrata, con autenticazione reciproca dell'identità basata su passphrase.
🧩 Configurazione flessibile del servizio: Con il parametro -e, puoi configurare in modo flessibile l'applicazione per servire ogni connessione. Ad esempio, -e /bin/sh può fornire una shell cmd remota. Puoi anche utilizzare comandi virtuali integrati per un comodo servizio SOCKS5, servizio file HTTP e inoltro del traffico.
goncUsalo come nc:
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
può stabilire solo connessioni punto-punto basate su IP e porta.
Ora puoi anche stabilire connessioni punto-punto basate su una passphrase condivisa, con NAT traversal automatizzato.
Il diagramma seguente mostra il processo con cui gonc stabilisce una connessione P2P tra una rete a banda larga domestica (hard NAT) e un peer su una rete mobile (symmetric NAT). Poiché entrambe le parti hanno IPv6, l'opzione -4 viene utilizzata su entrambe le estremità per forzare IPv4 al fine di dimostrare il NAT traversal.

Entrambe le parti concordano la stessa passphrase. Sul lato mittente, avvia un server file HTTP per esporre i file o le directory da condividere. L'opzione -httpserver accetta più percorsi, ognuno dei quali può essere un singolo file o una directory:
gonc -p2p <passphrase> -httpserver c:/RootDir1 c:/RootDir2
Sul lato ricevente, ci sono due opzioni:
Scaricare automaticamente l'intera directory
Dopo aver eseguito il seguente comando, tutti i file verranno scaricati ricorsivamente sulla macchina locale. Se il processo viene interrotto, rieseguire il comando riprenderà automaticamente da dove era stato interrotto:
gonc -p2p <passphrase> -download c:/SavePath
Sfogliare e scaricare selettivamente tramite browser
Questa opzione non avvia automaticamente il download. Devi invece aprire manualmente un browser e visitare http://127.0.0.1:9999 per visualizzare l'elenco dei file del peer e scaricare i file secondo necessità:
gonc -p2p <passphrase> -httplocal-port 9999
Se devi scaricare una sottodirectory specifica, il browser diventa scomodo, ma puoi fare così:
gonc -http-download c:/SavePath http://127.0.0.1:9999/subdir
Stabilisci una comunicazione P2P cifrata sicura tra due reti diverse concordando una passphrase (usa gonc -psk . per generare una passphrase ad alta entropia da sostituire a passphrase). Questa passphrase viene utilizzata per la scoperta reciproca e la derivazione dei certificati, garantendo la sicurezza delle comunicazioni con TLS 1.3.
gonc -p2p passphrase
Sull'altro lato, usa gli stessi parametri (il programma tenterà automaticamente la comunicazione TCP o UDP (preferendo TCP), negozierà i ruoli (client/server TLS) e completerà il protocollo TLS):
gonc -p2p passphrase
Nota che se l'altra estremità ritarda l'esecuzione, uscirà se non riesce a trovare l'altra estremità con cui interagire entro circa mezzo minuto. Pertanto, supporta anche un meccanismo di attesa basato sulla sottoscrizione di messaggi MQTT, utilizzando -mqtt-wait e -mqtt-hello per sincronizzare il momento in cui le due parti avviano il P2P. Ad esempio, il seguente utilizza -mqtt-wait per attendere continuamente,
gonc -p2p passphrase -mqtt-wait
Sull'altro lato,
gonc -p2p passphrase -mqtt-hello
Controlla il tuo tipo di NAT
gonc -nat-checker
Questo controllerà i tuoi indirizzi NAT IPv6 e IPv4 TCP e UDP e analizzerà i cambiamenti di porta dopo il NAT. Se non vengono elencati indirizzi TCP6 o UDP6, significa che non hai IPv6. Ogni indirizzo di protocollo termina con "(easy)", che indica la massima percentuale di successo per l'hole punching; "(hard)" indica una percentuale di successo più alta; e "(symm)" è il più difficile. Symm richiede che l'altra estremità sia "easy" o "hard" affinché il P2P funzioni.
-keep-open, accetta solo una connessione; nessuna autenticazione con -psk):
gonc -tls -exec ":sh /bin/bash" -l 1234
gonc -tls -pty x.x.x.x 1234
passphrase viene utilizzata per l'autenticazione, garantendo comunicazioni sicure con TLS 1.3):
gonc -exec ":sh /bin/bash" -p2p passphrase
gonc -pty -p2p passphrase
/dev/zero e /dev/urandom integrati):
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
Attendi che il tunnel venga stabilito:
gonc -p2p passphrase -linkagent
Sull'altro lato, avvia un servizio proxy locale SOCKS5 / HTTP sulla porta 3080 per accedere alla rete remota:
# 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"
Successivamente, ad esempio, se vuoi connetterti a 10.0.0.1:3389 nella rete remota, puoi semplicemente inserire il seguente indirizzo nel tuo client Desktop Remoto locale:
10.0.0.1-3389.gonc.cc:3080
Questo dominio verrà risolto in un IP nella forma 127.b.c.d. Di conseguenza, il client Desktop Remoto si connetterà al proxy SOCKS5 locale sulla porta 3080, e poi gonc ri-analizzerà l'indirizzo 127.b.c.d per estrarre l'informazione 10.0.0.1-3389 dal nome di dominio.
Formato di configurazione di 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 per configurare in modo flessibile l'applicazione per fornire servizi per ogni connessione. Ad esempio, invece di specificare /bin/bash per i comandi shell, può anche essere utilizzato per il port forwarding. Tuttavia, il seguente esempio avvia un nuovo processo gonc per ogni connessione:
gonc -keep-open -exec "gonc -tls www.baidu.com 443" -l 8000
gonc -keep-open -exec ":nc -tls www.baidu.com 443" -l 8000
Configura la modalità client:
gonc -x s.s.s.s:port x.x.x.x 1234
Server Socks5 integrato: Usa -e :s5s per fornire il servizio Socks5 standard. Supporta -auth per impostare un nome utente e una password per Socks5. Usa -keep-open per accettare continuamente le connessioni client al server Socks5. Grazie alle goroutine di Golang, raggiunge buone prestazioni di concorrenza multi-client:
gonc -e ":s5s -auth user:passwd" -keep-open -l 1080
Socks5 sicuro su TLS: Poiché Socks5 standard non è cifrato, usa -e :s5s con -tls e -psk per personalizzare la comunicazione Socks5 sicura su TLS. Usa -P per monitorare le informazioni di trasmissione della connessione, e -acl per implementare il controllo degli accessi per le connessioni in entrata e le destinazioni proxy. Per il formato del file acl.txt, vedi acl-example.txt.
gonc.exe -tls -psk passphrase -e :s5s -keep-open -acl acl.txt -P -l 1080
Sull'altro lato, usa :s5c (comando s5c integrato) per convertire Socks5 su TLS in Socks5 standard, fornendo l'accesso client locale su 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
Assistere WireGuard nel NAT Traversal per formare una VPN
Sul lato passivo (in ascolto), PC-S, esegui il seguente comando (usando la chiave pubblica del peer WireGuard come passphrase, e assumendo che WireGuard sia in ascolto sulla porta 51820):
gonc -p2p <PublicKey-of-PS-S> -mqtt-wait -u -k -e ":nc -u 127.0.0.1 51820"
Sul lato attivo (che inizia), PC-C, imposta l'Endpoint del peer WireGuard (PS-S) su 127.0.0.1:51821, con la propria interfaccia WireGuard in ascolto su 51820. Poi esegui il seguente comando. Il flag -k permette a gonc di riconnettersi automaticamente se la rete cade:
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 server SOCKS5 con supporto UDP ASSOCIATE in esecuzione su un IP pubblico è sufficiente come relay. Puoi anche eseguire il proxy SOCKS5 integrato di gonc sul tuo VPS per agire come server relay.
Il seguente comando avvia un proxy SOCKS5 che supporta solo l'inoltro UDP. Le opzioni -psk e -tls abilitano la crittografia e l'autenticazione basata su PSK. Nota: non aprire semplicemente la porta 1080 nel firewall — l'inoltro UDP utilizza porte casuali per ogni sessione.
gonc -e ":s5s -u -c=0" -psk <password> -tls -k -l 1080
Quando il P2P fallisce, è sufficiente che un solo lato di gonc ritenti il processo P2P usando l'opzione -x per instradare attraverso il relay SOCKS5:
gonc -p2p <passphrase> -x "-psk <password> -tls <socks5server-ip>:1080"
In alternativa, puoi usare un server proxy SOCKS5 standard che supporta l'inoltro UDP:
gonc -p2p <passphrase> -x "<socks5server-ip>:1080" -auth "user:password"
Ad esempio, se entrambi i peer sono dietro NAT simmetrici e il P2P fallisce, far usare a un solo lato un relay UDP SOCKS5 cambia efficacemente il suo comportamento NAT in "easy", rendendo molto più facile stabilire una connessione. I dati rimangono cifrati end-to-end.
"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 classifica i tipi di NAT in tre categorie:
Easy: Una singola porta interna viene mappata sulla stessa porta esterna attraverso più server STUN
Hard: Una singola porta interna viene mappata su una porta esterna coerente ma diversa attraverso i server STUN — più difficile del tipo 1
Symmetric: Una singola porta interna viene mappata su porte esterne diverse a seconda della destinazione — il tipo più difficile
Per gestire questi tipi di NAT, gonc impiega diverse strategie di traversal:
Usa più server STUN per rilevare il comportamento NAT e identificare scenari con IP multi-uscita
Preferisce le connessioni IPv6 quando entrambe le parti lo supportano (ad esempio, dial diretto TCP6-to-TCP6)
Entrambi i peer ascoltano su TCP mentre si contattano simultaneamente a vicenda per aumentare il successo dell'hole punching TCP
Il peer con il NAT più facile ritarda il suo pacchetto UDP iniziale per evitare di innescare cambiamenti di porta sul lato più difficile
Il peer con il NAT più difficile invia pacchetti UDP con un TTL basso per ridurre le interferenze dal firewall remoto
Come ultima risorsa, usa una strategia del "paradosso del compleanno": il lato più difficile usa 600 porte sorgente casuali, e l'altro lato prova 600 porte di destinazione casuali, aumentando la probabilità di una collisione di porta UDP riuscita