
Netcat con NAT traversal automatizado, P2P seguro y funciones avanzadas para acceso a shell, transferencia de archivos y proxy de red.
gonc es una herramienta netcat basada en Golang diseñada para facilitar la comunicación peer-to-peer. Sus características principales incluyen:
🔁 NAT Traversal automatizado: Configuración cero. Ambas partes solo necesitan acordar una frase de contraseña. Al usar el parámetro -p2p, los peers pueden descubrir automáticamente las direcciones de red del otro y establecer una conexión punto a punto mediante NAT traversal, aprovechando servicios públicos de STUN y MQTT para el intercambio de direcciones.
🔒 Cifrado de extremo a extremo con autenticación mutua: Admite TLS para TCP y DTLS para transmisión cifrada UDP, con autenticación mutua de identidad basada en frase de contraseña.
🧩 Configuración flexible de servicios: Con el parámetro -e, puedes configurar flexiblemente la aplicación para servir cada conexión. Por ejemplo, -e /bin/sh puede proporcionar un shell cmd remoto. También puedes usar comandos virtuales integrados para un servicio SOCKS5 conveniente, servicio de archivos HTTP y reenvío de tráfico.
goncÚsalo como nc:
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
solo puede establecer conexiones punto a punto basadas en IP y puerto.
Ahora, también puedes establecer conexiones punto a punto basadas en una frase de contraseña compartida, con NAT traversal automatizado.
El siguiente diagrama muestra el proceso de gonc estableciendo una conexión P2P entre una red de banda ancha doméstica (hard NAT) y un peer en una red móvil (symmetric NAT). Como ambas partes tienen IPv6, se usa la opción -4 en ambos extremos para forzar IPv4 con el fin de demostrar NAT traversal.

Ambas partes acuerdan la misma frase de contraseña. En el lado emisor, inicia un servidor de archivos HTTP para exponer los archivos o directorios a compartir. La opción -httpserver acepta múltiples rutas, cada una de las cuales puede ser un archivo individual o un directorio:
gonc -p2p <passphrase> -httpserver c:/RootDir1 c:/RootDir2
En el lado receptor, hay dos opciones:
Descargar automáticamente todo el directorio
Después de ejecutar el siguiente comando, todos los archivos se descargarán recursivamente a la máquina local. Si el proceso se interrumpe, volver a ejecutar el comando reanudará automáticamente desde donde se quedó:
gonc -p2p <passphrase> -download c:/SavePath
Navegar y descargar selectivamente a través del navegador
Esta opción no inicia la descarga automáticamente. En su lugar, debes abrir manualmente un navegador y visitar http://127.0.0.1:9999 para ver la lista de archivos del peer y descargar archivos según sea necesario:
gonc -p2p <passphrase> -httplocal-port 9999
Si necesitas descargar un subdirectorio específico, el navegador resulta inconveniente, pero puedes hacerlo así:
gonc -http-download c:/SavePath http://127.0.0.1:9999/subdir
Establece comunicación P2P cifrada segura entre dos redes diferentes acordando una frase de contraseña (usa gonc -psk . para generar una frase de contraseña de alta entropía que reemplace passphrase). Esta frase de contraseña se usa para el descubrimiento mutuo y la derivación de certificados, garantizando la seguridad de la comunicación con TLS 1.3.
gonc -p2p passphrase
En el otro lado, usa los mismos parámetros (el programa intentará automáticamente comunicación TCP o UDP (preferiblemente TCP), negociará roles (cliente/servidor TLS) y completará el protocolo TLS):
gonc -p2p passphrase
Ten en cuenta que si el otro extremo retrasa el tiempo de ejecución, saldrá si no puede encontrar al otro extremo con quien intercambiar información en aproximadamente medio minuto. Por lo tanto, también admite un mecanismo de espera basado en suscripción a mensajes MQTT, usando -mqtt-wait y -mqtt-hello para sincronizar el momento en que ambas partes inician P2P. Por ejemplo, a continuación se usa -mqtt-wait para esperar continuamente,
gonc -p2p passphrase -mqtt-wait
En el otro lado,
gonc -p2p passphrase -mqtt-hello
Verifica tu tipo de NAT
gonc -nat-checker
Esto verificará tus direcciones NAT IPv6 e IPv4 TCP y UDP y analizará los cambios de puerto después del NAT. Si no se listan direcciones TCP6 o UDP6, significa que no tienes IPv6. Cada dirección de protocolo termina con "(easy)", lo que indica la mayor tasa de éxito para hole punching; "(hard)" indica una tasa de éxito mayor; y "(symm)" es la más difícil. Symm requiere que el otro extremo sea "easy" o "hard" para que P2P funcione.
-keep-open, acepta solo una conexión; sin autenticación con -psk):
gonc -tls -exec ":sh /bin/bash" -l 1234
gonc -tls -pty x.x.x.x 1234
passphrase se usa para autenticación, garantizando comunicación segura con TLS 1.3):
gonc -exec ":sh /bin/bash" -p2p passphrase
gonc -pty -p2p passphrase
/dev/zero y /dev/urandom integrados):
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
Espera a que se establezca el túnel:
gonc -p2p passphrase -linkagent
En el otro lado, inicia un servicio proxy SOCKS5 / HTTP local en el puerto 3080 para acceder a la red 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"
A continuación, por ejemplo, si quieres conectarte a 10.0.0.1:3389 en la red remota, simplemente puedes introducir la siguiente dirección en tu cliente de Escritorio Remoto local:
10.0.0.1-3389.gonc.cc:3080
Este dominio se resolverá a una IP con la forma 127.b.c.d. Como resultado, el cliente de Escritorio Remoto se conectará al proxy SOCKS5 local en el puerto 3080, y luego gonc analizará inversamente la dirección 127.b.c.d para extraer la información 10.0.0.1-3389 del nombre de dominio.
Formato de configuración 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 para configurar flexiblemente la aplicación que proporcionará servicios para cada conexión. Por ejemplo, en lugar de especificar /bin/bash para comandos de shell, también se puede usar para reenvío de puertos. Sin embargo, el siguiente ejemplo inicia un nuevo proceso gonc para cada conexión:
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 el modo cliente:
gonc -x s.s.s.s:port x.x.x.x 1234
Servidor Socks5 integrado: Usa -e :s5s para proporcionar servicio Socks5 estándar. Admite -auth para establecer un nombre de usuario y contraseña para Socks5. Usa -keep-open para aceptar continuamente conexiones de clientes al servidor Socks5. Gracias a las goroutines de Golang, logra un buen rendimiento de concurrencia multi-cliente:
gonc -e ":s5s -auth user:passwd" -keep-open -l 1080
Socks5 seguro sobre TLS: Dado que el Socks5 estándar no está cifrado, usa -e :s5s con -tls y -psk para personalizar la comunicación Socks5 segura sobre TLS. Usa -P para monitorear la información de transmisión de conexiones, y -acl para implementar control de acceso para conexiones entrantes y destinos de proxy. Para el formato del archivo acl.txt, consulta acl-example.txt.
gonc.exe -tls -psk passphrase -e :s5s -keep-open -acl acl.txt -P -l 1080
En el otro lado, usa :s5c (comando s5c integrado) para convertir Socks5 sobre TLS a Socks5 estándar, proporcionando acceso de cliente local en 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
Asistir a WireGuard en NAT Traversal para formar una VPN
En el lado pasivo (listening), PC-S, ejecuta el siguiente comando (usando la clave pública del peer de WireGuard como frase de contraseña, y asumiendo que WireGuard está escuchando en el puerto 51820):
gonc -p2p <PublicKey-of-PS-S> -mqtt-wait -u -k -e ":nc -u 127.0.0.1 51820"
En el lado activo (iniciador), PC-C, configura el Endpoint del peer de WireGuard (PS-S) a 127.0.0.1:51821, con su propia interfaz WireGuard escuchando en 51820. Luego ejecuta el siguiente comando. El flag -k permite que gonc se reconecte automáticamente si la red se cae:
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 servidor SOCKS5 con soporte UDP ASSOCIATE ejecutándose en una IP pública es suficiente como retransmisor. También puedes ejecutar el proxy SOCKS5 integrado de gonc en tu propio VPS para actuar como servidor de retransmisión.
El siguiente comando inicia un proxy SOCKS5 que solo admite reenvío UDP. Las opciones -psk y -tls habilitan el cifrado y la autenticación basada en PSK. Nota: No abras solo el puerto 1080 en tu firewall — el reenvío UDP usa puertos aleatorios para cada sesión.
gonc -e ":s5s -u -c=0" -psk <password> -tls -k -l 1080
Cuando P2P falla, solo necesitas que un lado de gonc reintente el proceso P2P usando la opción -x para enrutar a través del retransmisor SOCKS5:
gonc -p2p <passphrase> -x "-psk <password> -tls <socks5server-ip>:1080"
Alternativamente, puedes usar un servidor proxy SOCKS5 estándar que admita reenvío UDP:
gonc -p2p <passphrase> -x "<socks5server-ip>:1080" -auth "user:password"
Por ejemplo, si ambos peers están detrás de NATs simétricos y P2P falla, hacer que solo un lado use un retransmisor SOCKS5 UDP cambia efectivamente su comportamiento NAT a "easy", haciendo mucho más fácil establecer una conexión. Los datos permanecen cifrados de extremo a extremo.
"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 clasifica los tipos de NAT en tres categorías:
Easy: Un único puerto interno se mapea al mismo puerto externo a través de múltiples servidores STUN
Hard: Un único puerto interno se mapea a un puerto externo consistente pero diferente a través de los servidores STUN — más difícil que el tipo 1
Symmetric: Un único puerto interno se mapea a diferentes puertos externos dependiendo del destino — el tipo más difícil
Para manejar estos tipos de NAT, gonc emplea varias estrategias de traversal:
Usa múltiples servidores STUN para detectar el comportamiento NAT e identificar escenarios de múltiples IPs de salida
Prefiere conexiones IPv6 cuando ambos lados lo admiten (por ejemplo, marcado directo TCP6-a-TCP6)
Ambos peers escuchan en TCP mientras se marcan mutuamente simultáneamente para aumentar el éxito del TCP hole punching
El peer con el NAT más fácil retrasa su paquete UDP inicial para evitar desencadenar cambios de puerto en el lado más difícil
El peer con el NAT más difícil envía paquetes UDP con un TTL bajo para reducir la interferencia del firewall remoto
Como último recurso, usa una estrategia de "paradoja del cumpleaños": el lado más difícil usa 600 puertos de origen aleatorios, y el otro lado prueba 600 puertos de destino aleatorios, aumentando la probabilidad de una colisión exitosa de puertos UDP