
Netcat com travessia NAT automatizada, P2P seguro e recursos avançados para acesso a shell, transferência de arquivos e proxy de rede.
gonc é uma ferramenta netcat baseada em Golang, projetada para facilitar a comunicação ponto a ponto. Suas principais características incluem:
🔁 NAT Traversal Automatizado: Configuração zero. Ambos os lados só precisam concordar com uma passphrase. Ao usar o parâmetro -p2p, os pares podem descobrir automaticamente os endereços de rede uns dos outros e estabelecer uma conexão ponto a ponto através de NAT traversal, aproveitando serviços públicos de STUN e MQTT para troca de endereços.
🔒 Criptografia Ponta a Ponta com Autenticação Mútua: Suporta TLS para TCP e DTLS para transmissão criptografada UDP, com autenticação mútua de identidade baseada em passphrase.
🧩 Configuração Flexível de Serviços: Com o parâmetro -e, você pode configurar flexivelmente a aplicação para servir cada conexão. Por exemplo, -e /bin/sh pode fornecer um shell cmd remoto. Você também pode usar comandos virtuais integrados para serviço SOCKS5 conveniente, serviço de arquivos HTTP e encaminhamento de tráfego.
Download da versão mais recente
goncUse como o nc:
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
só pode estabelecer conexões ponto a ponto baseadas em IP e porta.
Agora, você também pode estabelecer conexões ponto a ponto baseadas em uma passphrase compartilhada, com NAT traversal automatizado.
O diagrama a seguir mostra o processo do gonc estabelecendo uma conexão P2P entre uma rede de banda larga residencial (hard NAT) e um par em uma rede móvel (symmetric NAT). Como ambos os lados possuem IPv6, a opção -4 é usada em ambas as extremidades para forçar IPv4, a fim de demonstrar o NAT traversal.

Ambos os lados concordam com a mesma passphrase. No lado do remetente, inicie um servidor de arquivos HTTP para expor os arquivos ou diretórios a serem compartilhados. A opção -httpserver aceita múltiplos caminhos, cada um podendo ser um único arquivo ou um diretório:
gonc -p2p <passphrase> -httpserver c:/RootDir1 c:/RootDir2
No lado receptor, há duas opções:
Baixar automaticamente o diretório inteiro
Após executar o comando a seguir, todos os arquivos serão baixados recursivamente para a máquina local. Se o processo for interrompido, executar o comando novamente retomará automaticamente de onde parou:
gonc -p2p <passphrase> -download c:/SavePath
Navegar e baixar seletivamente via navegador
Esta opção não inicia o download automaticamente. Em vez disso, você precisa abrir manualmente um navegador e visitar http://127.0.0.1:9999 para visualizar a lista de arquivos do par e baixar arquivos conforme necessário:
gonc -p2p <passphrase> -httplocal-port 9999
Se você precisar baixar um subdiretório específico, o navegador se torna inconveniente, mas você pode fazer assim:
gonc -http-download c:/SavePath http://127.0.0.1:9999/subdir
Estabeleça comunicação P2P criptografada segura entre duas redes diferentes concordando com uma passphrase (use gonc -psk . para gerar uma passphrase de alta entropia para substituir passphrase). Esta passphrase é usada para descoberta mútua e derivação de certificado, garantindo a segurança da comunicação com TLS 1.3.
gonc -p2p passphrase
No outro lado, use os mesmos parâmetros (o programa tentará automaticamente comunicação TCP ou UDP (TCP preferido), negociará papéis (cliente/servidor TLS) e completará o protocolo TLS):
gonc -p2p passphrase
Observe que, se o outro lado atrasar o tempo de execução, ele sairá se não conseguir encontrar o outro lado para interagir informações dentro de cerca de meio minuto. Portanto, também suporta um mecanismo de espera baseado em assinatura de mensagens MQTT, usando -mqtt-wait e -mqtt-hello para sincronizar o momento de ambas as partes iniciarem o P2P. Por exemplo, o seguinte usa -mqtt-wait para esperar continuamente,
gonc -p2p passphrase -mqtt-wait
No outro lado,
gonc -p2p passphrase -mqtt-hello
Verifique seu tipo de NAT
gonc -nat-checker
Isso verificará seus endereços NAT IPv6 e IPv4 TCP e UDP e analisará as mudanças de porta após o NAT. Se nenhum endereço TCP6 ou UDP6 estiver listado, significa que você não tem IPv6. Cada endereço de protocolo termina com "(easy)", indicando a maior taxa de sucesso para hole punching; "(hard)" indica uma taxa de sucesso maior; e "(symm)" é o mais difícil. Symm requer que o outro lado seja "easy" ou "hard" para que o P2P funcione.
-keep-open, aceita apenas uma conexão; sem autenticação com -psk):
gonc -tls -exec ":sh /bin/bash" -l 1234
gonc -tls -pty x.x.x.x 1234
passphrase é usada para autenticação, garantindo comunicação segura com TLS 1.3):
gonc -exec ":sh /bin/bash" -p2p passphrase
gonc -pty -p2p passphrase
/dev/zero e /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
Aguarde o túnel ser estabelecido:
gonc -p2p passphrase -linkagent
No outro lado, inicie um serviço de proxy SOCKS5 / HTTP local na porta 3080 para acessar a rede 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"
Em seguida, por exemplo, se você quiser se conectar a 10.0.0.1:3389 na rede remota, basta inserir o seguinte endereço no seu cliente de Área de Trabalho Remota local:
10.0.0.1-3389.gonc.cc:3080
Este domínio será resolvido para um IP na forma 127.b.c.d. Como resultado, o cliente de Área de Trabalho Remota se conectará ao proxy SOCKS5 local na porta 3080, e então o gonc fará a análise reversa do endereço 127.b.c.d para extrair a informação 10.0.0.1-3389 do nome de domínio.
Formato de Configuração do 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 flexivelmente a aplicação para fornecer serviços para cada conexão. Por exemplo, em vez de especificar /bin/bash para comandos de shell, também pode ser usado para encaminhamento de portas. No entanto, o exemplo a seguir inicia um novo processo gonc para cada conexão:
gonc -keep-open -exec "gonc -tls www.baidu.com 443" -l 8000
gonc -keep-open -exec ":nc -tls www.baidu.com 443" -l 8000
Configure o modo cliente:
gonc -x s.s.s.s:port x.x.x.x 1234
Servidor Socks5 integrado: Use -e :s5s para fornecer serviço Socks5 padrão. Suporta -auth para definir um nome de usuário e senha para Socks5. Use -keep-open para aceitar continuamente conexões de clientes ao servidor Socks5. Graças às goroutines do Golang, alcança bom desempenho de concorrência multi-cliente:
gonc -e ":s5s -auth user:passwd" -keep-open -l 1080
Socks5 Seguro sobre TLS: Como o Socks5 padrão não é criptografado, use -e :s5s com -tls e -psk para personalizar comunicação Socks5 segura sobre TLS. Use -P para monitorar informações de transmissão de conexão, e -acl para implementar controle de acesso para conexões de entrada e destinos de proxy. Para o formato do arquivo acl.txt, veja acl-example.txt.
gonc.exe -tls -psk passphrase -e :s5s -keep-open -acl acl.txt -P -l 1080
No outro lado, use :s5c (comando s5c integrado) para converter Socks5 sobre TLS em Socks5 padrão, fornecendo acesso de cliente local em 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
Auxiliar o WireGuard no NAT Traversal para Formar uma VPN
No lado passivo (listening), PC-S, execute o seguinte comando (usando a chave pública do par WireGuard como passphrase, e assumindo que o WireGuard está escutando na porta 51820):
gonc -p2p <PublicKey-of-PS-S> -mqtt-wait -u -k -e ":nc -u 127.0.0.1 51820"
No lado ativo (iniciador), PC-C, defina o Endpoint do par WireGuard (PS-S) para 127.0.0.1:51821, com sua própria interface WireGuard escutando em 51820. Em seguida, execute o seguinte comando. A flag -k permite que o gonc se reconecte automaticamente se a rede cair:
gonc -p2p <PublicKey-of-PS-S> -mqtt-hello -u -k -e ":nc -u -local 127.0.0.1:51821 127.0.0.1 51820"
Um servidor SOCKS5 com suporte a UDP ASSOCIATE rodando em um IP público é suficiente como relay. Você também pode executar o proxy SOCKS5 integrado do gonc em seu próprio VPS para atuar como servidor de relay.
O comando a seguir inicia um proxy SOCKS5 que suporta apenas encaminhamento UDP. As opções -psk e -tls habilitam criptografia e autenticação baseada em PSK. Nota: Não apenas abra a porta 1080 no seu firewall — o encaminhamento UDP usa portas aleatórias para cada sessão.
gonc -e ":s5s -u -c=0" -psk <password> -tls -k -l 1080
Quando o P2P falha, você só precisa que um lado do gonc tente novamente o processo P2P usando a opção -x para rotear através do relay SOCKS5:
gonc -p2p <passphrase> -x "-psk <password> -tls <socks5server-ip>:1080"
Alternativamente, você pode usar um servidor proxy SOCKS5 padrão que suporta encaminhamento UDP:
gonc -p2p <passphrase> -x "<socks5server-ip>:1080" -auth "user:password"
Por exemplo, se ambos os pares estiverem atrás de NATs simétricos e o P2P falhar, ter apenas um lado usando um relay SOCKS5 UDP efetivamente muda seu comportamento NAT para "easy", tornando muito mais fácil estabelecer uma conexão. Os dados permanecem criptografados ponta a ponta.
"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"
O gonc classifica os tipos de NAT em três categorias:
Easy: Uma única porta interna mapeia para a mesma porta externa em múltiplos servidores STUN
Hard: Uma única porta interna mapeia para uma porta externa consistente mas diferente em servidores STUN — mais difícil que o tipo 1
Symmetric: Uma única porta interna mapeia para portas externas diferentes dependendo do destino — o tipo mais difícil
Para lidar com esses tipos de NAT, o gonc emprega várias estratégias de traversal:
Usa múltiplos servidores STUN para detectar o comportamento do NAT e identificar cenários de múltiplas saídas de IP
Prefere conexões IPv6 quando ambos os lados suportam (por exemplo, discagem direta TCP6-to-TCP6)
Ambos os pares escutam em TCP enquanto simultaneamente discam um para o outro para aumentar o sucesso do TCP hole punching
O par com o NAT mais fácil atrasa seu pacote UDP inicial para evitar acionar mudanças de porta no lado mais difícil
O par com o NAT mais difícil envia pacotes UDP com um TTL baixo para reduzir a interferência do firewall remoto
Como último recurso, usa uma estratégia de "paradoxo do aniversário": o lado mais difícil usa 600 portas de origem aleatórias, e o outro lado tenta 600 portas de destino aleatórias, aumentando a chance de uma colisão bem-sucedida de porta UDP