go-netcat
是一个基于 Golang 的 netcat
工具,旨在更方便地建立点对点通信。其主要特点包括:
-p2p
自动实现 TCP/UDP 的 NAT 打洞与点对点连接,无需手动配置,依赖公共 STUN 和 MQTT 服务交换地址信息。-exec
将工具作为子服务启动,结合多路复用能力,支持流量转发、Socks5 代理和 HTTP 文件服务等场景。-exec
和 -pty
,为类似 /bin/sh
的交互式程序提供伪终端环境,增强 shell 控制体验(支持 TAB、Ctrl+C 等)。-pty
启用控制台 raw
模式,在获取 shell 时提供更贴近原生终端的操作体验。nc
一样使用:
gonc www.baidu.com 80
gonc -tls www.baidu.com 443
gonc -l 4444 #监听模式
gonc -p2p <口令>
双方就能基于口令发现彼此的网络地址,内网穿透 NAT ,双向认证和加密通讯。双方都用口令派生证书,基于 TLS 1.3 保证安全通信。(口令相当于证书私钥,建议使用 gonc -psk .
随机生成高强度的口令)
注意如果另一端耽误了运行时机,先运行的大概半分钟内无法发现对端来交互信息则会退出。因此还支持基于MQTT消息订阅的等待机制,使用-mqtt-wait和-mqtt-hello来同步双方开始P2P的时机。例如,下面用了-mqtt-wait可以持续等待,
gonc -p2p <口令> -mqtt-wait
另一端使用:
gonc -p2p <口令> -mqtt-hello
-keep-open
,仅接受一次连接;未使用 -psk
,无身份认证):
gonc -tls -exec ":sh /bin/bash" -l 1234
gonc -tls -pty x.x.x.x 1234
<口令>
用于身份认证,基于 TLS 1.3 实现安全通信):
gonc -exec ":sh /bin/bash" -p2p <口令>
另一端:
gonc -pty -p2p <口令>
/dev/zero
和 /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
gonc -p2p <口令> -socks5server
gonc -p2p <口令> -socks5local-port 3080
这时如果你的客户端不支持设置socks5代理,例如远程桌面(mstsc),你想连接远程网络的10.0.0.1:3389,你可以直接在远程桌面客户端填要连接的地址为:
10.0.0.1-3389.gonc.cc:3080
该域名会被解析为类似127.b.c.d的IP,因此远程桌面客户端会连入本地的socks5代理端口3080,然后gonc根据连接一端的127.b.c.d地址去反解析出域名中的10.0.0.1-3389这个信息。
gonc -p2p <口令> -httpserver c:/RootDir
gonc -p2p <口令> -httplocal-port 9999
支持递归下载所有文件到本地并断点续传:
gonc -p2p <口令> -download c:/SavePath
gonc -keep-open -exec "gonc -tls www.baidu.com 443" -l 8000
gonc -keep-open -exec ":nc -tls www.baidu.com 443" -l 8000
gonc -x s.s.s.s:port x.x.x.x 1234
gonc -e ":s5s -auth user:passwd" -keep-open -l 1080
使用高安全性 Socks5 over TLS,由于标准socks5是不加密的,我们可使用-e :s5s
,结合-tls
和-psk
定制高安全性的socks5 over tls通讯,使用-P
统计连接传输信息,还可以使用-acl
对接入和代理目的地实现访问控制。acl.txt文件格式详见acl-example.txt。
gonc.exe -tls -psk randomString -e :s5s -keep-open -acl acl.txt -P -l 1080
另一端使用:nc把socks5 over tls转为标准socks5,在本地127.0.0.1:3080提供本地客户端接入
gonc.exe -e ":nc -tls -psk randomString x.x.x.x 1080" -keep-open -l -local 127.0.0.1:3080
参考SSH的22端口,既可提供shell也提供sftp和端口转发功能,gonc使用 -e “:service” 也可监听在一个服务端口,基于tls+psk安全认证提供shell、socks5(支持CONNECNT+BIND)和文件服务。(请务必使用gonc -psk .生成高熵PSK替换randomString)
gonc -k -l -local :2222 -tls -psk randomString -e ":service" -:sh "/bin/bash" -:s5s "-c -b" -:mux "httpserver /"
另一端使用获得shell
gonc -tls -psk randomString -remote <server-ip>:2222 -call :sh -pty
另一端把socks5 over tls转为本地标准socks5端口1080
gonc -e ":nc -tls -psk randomString -call :s5s <server-ip> 2222" -k -P -l -local 127.0.0.1:1080
另一端把文件服务为本地标准HTTP端口8000
gonc -tls -psk randomString -remote <server-ip>:2222 -call :mux -httplocal-port 8000
帮WireGuard打洞组VPN
在被动等待连接的PC-S运行下面的参数(直接拿节点公钥来当口令,接口的监听端口51820):
gonc -p2p PS-S的公钥 -mqtt-wait -u -k -e ":nc -u 127.0.0.1 51820"
其他发起主动连接的PC-C,设置WireGuard节点PS-S公钥的Endpoint = 127.0.0.1:51821,接口的监听端口51820,gonc运行下面的参数,-k可以让gonc在网络异常后自动重新建立连接。
gonc -p2p PS-S的公钥 -mqtt-hello -u -k -e ":nc -u -local 127.0.0.1:51821 127.0.0.1 51820"
一个公网IP上支持UDP ASSOCIATE的Socks5服务器就可以,也可以用自己的VPS,运行gonc本身的socks5代理服务器便可让其成为中转服务器。
下面命令启动了仅支持UDP转发功能的socks5代理,-psk和-tls开启了加密和PSK口令认证。注意防火墙不能只开放1080,因为每次提供转发的UDP端口是随机。
gonc -e ":s5s -u -c=0" -psk 口令 -tls -k -l 1080
P2P遇到困难的时候,只需要有一端的gonc使用-x参数再进行P2P就可以。你也可以把-x换为-x2,这样就是先P2P,失败了再尝试用中转
gonc -p2p randomString -x "-psk 口令 -tls <socks5server-ip>:1080"
下面例子是使用标准的socks5代理服务器(需服务器支持UDP)。
gonc -p2p randomString -x "<socks5server-ip>:1080" -auth "user:password"
例如原本两端都是对称型NAT,无法P2P,现在一端使用了socks5代理(UDP模式),就相当于转为容易型的NAT了,于是就能很容易和其他建立连接,数据加密仍然是端到端的。
"tcp://turn.cloudflare.com:80",
"udp://turn.cloudflare.com:53",
"udp://stun.l.google.com:19302",
"udp://stun.miwifi.com:3478",
"global.turn.twilio.com:3478",
"stun.nextcloud.com:443",
"tcp://broker.emqx.io:1883",
"tcp://test.mosquitto.org:1883",
gonc将NAT类型分为3种:
当固定一个内网端口去访问多个STUN服务器,根据多个STUN服务器反馈的地址研判:
针对这些类型,gonc采用了如下一些NAT穿透策略: