跳转至

内置服务模块 (-e)

gonc-e (exec) 参数不仅支持像传统 netcat 那样执行外部程序(如 /bin/bash),更引入了强大的 内置 Go 模块

这些模块直接在内存中运行,无需磁盘上有对应的二进制文件,无需创建子进程、性能更好。

语法格式

gonc -e ":<command> [args]" ...
注意:

  • 查看子模块参数:内置命令始终以冒号 : 开头。要查看特定模块的帮助,可运行 gonc -e ":<cmd> -h",例如 gonc -e ":s5s -h"
  • 字符\:args中\需要\\转义表示。例如 gonc -e ":httpserver d:\\dir",建议windows下路径也用/字符。

🐚 :sh - 远程 Shell

提供交互式的命令行访问。这是最常用的模块。

原理: 将网络连接的标准输入/输出 (Stdin/Stdout) 绑定到系统的 Shell 进程,不支持Windows,Linux/Mac 为 /bin/sh/bin/bash

参数: * [path]: (可选) 指定 Shell 的路径。

示例

# 默认调用 /bin/sh
gonc -e ":sh" -l 1234 

# 指定 bash
gonc -e ":sh /bin/bash" -l 1234 
# :sh不支持windows,-e可以直接执行cmd,但客户端不支持用-pty的方式
gonc -l 1234 -e "cmd"

获取完美的 Shell 体验

客户端连接时建议加上 -pty 参数,这样可以使用 Ctrl+CVimTab 补全等功能,否则只是简单的管道流。

gonc -pty <target_ip> 1234


🌐 :s5s - SOCKS5 代理服务

将当前连接转换为一个标准的 SOCKS5 代理服务器。

原理gonc 实现了完整的 SOCKS5 协议栈(支持 CONNECT 、BIND 和 UDP ASSOCIATE)。当连接建立后,gonc 不再进行简单的流量转发,而是解析 SOCKS5 协议头,根据请求动态连接目标。

参数

  • -auth <user:pass>: 启用用户名密码认证。

  • -u: 允许 UDP 转发 (UDP Associate),默认不开启。

  • -c: 是CONNECT方法,默认启用,可以-c=0关闭。

  • -b: 是BIND方法,默认不开启。

  • -http: 开启兼容HTTP代理协议,这样同时能支持HTTP代理的客户端了。

  • -local: 如果你的服务器有多个IP,可以限定使用的出口IP

  • -server-ip: 设置针对BIND或UDP请求的绑定地址,服务器默认绑定地址是0.0.0.0。

示例

# 启动一个监听在 1080 的 SOCKS5 代理服务器,带认证
gonc -k -e ":s5s -auth user:simplekey123" -l 1080 

高级组合 (Socks5 over TLS): 利用 gonc 的加密通道保护 SOCKS5 流量。

# 服务端:加密监听,-b开启SOCKS5的BIND命令
gonc -tls -psk simplekey123 -e ":s5s -b" -k -l 8443

本地需要再运行一个gonc将加密的SOCKS5转标准SOCKS5。

# 客户端调用:nc建立加密TCP连接。不支持代理UDP
gonc -e ":nc -tls -psk simplekey123 server-ip 8443" -k -l 127.0.0.1 1080
# 实现类似frp反向代理,请求代理服务器保持开启23306端口,并转发到本机127.0.0.1 3306
gonc -x "-tls -psk simplekey123 server-ip:8443" -e ":nc 127.0.0.1 3306" -k -l 23306

🔀 :tp - 透明代理

:tp 是一种透明端口转发机制,用于在客户端不支持或不便配置代理的场景下,通过本地监听端口自动完成代理转发。

客户端只需按“直连地址”方式连接,实际流量会被 :tp 无感接管并转发至指定的上游代理。

语法

监听本地 3080 端口作为透明代理入口,所有连接将通过 127.0.0.1:1080 的 SOCKS5 代理转发:

gonc -e ":tp -x 127.0.0.1:1080" -k -l 3080

监听本地 3080 端口作为透明代理入口,并通过 HTTP CONNECT 方式转发至 127.0.0.1:1080:

gonc -e ":tp -X connect -x 127.0.0.1:1080 -auth user:pass" -k -l 3080

使用说明(仅适用Windows/Linux)

以 远程桌面客户端(RDP) 为例,用户在客户端中填入地址:

10.0.0.1-3389.gonc.cc:3080

连接过程如下:

  • 客户端解析 10.0.0.1-3389.gonc.cc,得到形如 127.b.c.d 的回环地址

  • 客户端认为自己在直连目标服务,并实际连接到本机的 3080 端口

  • :tp 用127.b.c.d反查域名,解析出真实目标 10.0.0.1:3389

  • :tp 自动通过配置好的上游代理(如 127.0.0.1:1080)发起代理连接

  • 客户端与远端服务之间的通信在整个过程中无需任何代理配置

隐私和安全问题

这个特性依赖ns.gonc.cc公网DNS解析,出于对用户隐私和安全保护,gonc的透明代理默认只接受内网私有IP段,不接受公网IP或域名方式,例如tonypc.corp.lan-3389.gonc.cc。除非用户明确的使用参数":tp -x 127.0.0.1:1080 -allow domain"

需要说明的是,ns.gonc.cc 服务器只能看到 *.gonc.cc 的 DNS 解析请求记录,通常无法获知具体客户端的真实 IP 地址。这是因为(DNS递归查询机制)客户端的请求一般会先经过ISP的DNS或公共 DNS 运营商(如 8.8.8.8),再由其转发至 ns.gonc.cc。

关于安全问题,例如在处理mstsc连接时,如果 DNS 被恶意篡改,理论上可能得到1.2.3.4-3389这样的地址,而不是预期的10.0.0.1-3389。 由于gonc默认只允许内网 IP 段,这类异常连接会被拒绝,保证透明代理不会将客户端流量发送到你对端内网之外的目的地。

因此,在默认配置下,该机制通常不会带来额外的隐私或安全风险。


🔗 :nc - 端口转发 (Netcat)

:nc安全等效于gonc本身,即gonc可以在内存中执行自己,不用开启子进程,因此可以实现高效的将流量转发到另一个地址。

原理: 类似于 SSH 的 -L 本地转发。当连接建立后,:nc 模块会主动向指定的目标发起连接,并双向通过管道交换数据。

语法

-e ":nc [options] <target_host> <target_port>"

示例1 (跳板机场景): 假设你想通过 A 访问内网数据库 B (192.168.1.50:3306)。

# 在机器 A 上运行
gonc -e ":nc 192.168.1.50 3306" -k -l 3306
现在,访问机器 A 的 3306 端口,就等于访问 B 的数据库。

示例2 (UDP端口转发)

# 监听在[::]:53,转发到8.8.8.8 53。-framed是防止-e的管道机制导致UDP粘包
gonc -e ":nc -framed -u 8.8.8.8 53" -framed -udp-timeout 2 -u -k -l 53

📂 :httpserver - 文件服务器

快速共享文件或目录。

原理: 启动一个轻量级的 HTTP 服务器,它支持递归遍历目录,下载文件时支持zstd压缩传输。

参数

  • -webmode: 默认启用,如果目录存在index.html或index.htm文件,会展示index页面内容,而不是浏览目录。
  • <root_dir>: 要共享的根目录路径。支持指定多个路径。

示例

# 共享当前目录 (.)
gonc -e ":httpserver ." -k -l 8080

# 共享多个指定路径
gonc -e ":httpserver /var/www/html /tmp/test" -k -l 8080

🧬 :mux - 多路复用的代理服务和文件服务

:mux 目前集成了两个应用功能:HTTP文件服务和SOCKS5/HTTP代理服务。是gonc为了在P2P场景提供用户更容易上手的文件传输和内网穿透功能,比起你用:s5s或:httpserver要更容易上手。

核心引擎: 可以通过 -mux-engine 参数切换底层引擎: smux (默认)。yamux另一个流行mux引擎。

语法

-e ":mux <sub-command> [args]"

这是构建复杂端口映射和内网穿透的核心功能。link还特意处理了SOCKS5的UDP代理,实现UDP走MUX隧道从对端出去。这解决了使用:s5s-mux无法代理UDP的问题。

  • :mux linkagent: 启动双向代理 Agent,通常在服务端(等待连接的一方)使用。
  • :mux link "<L-Config>;<R-Config>": 定义隧道规则,通常在客户端(发起连接的一方)使用。

Link 字符串定义了隧道两端的行为,格式为分号分隔的 双端配置

"本地监听配置;远程监听配置"

配置逻辑

  • 左侧 (本地):使用link的一端。
  • 右侧 (远程):使用linkagent的一端。
  • none:表示该端不进行任何监听操作。

(1) 代理协议 (x://)

启动一个同时支持 HTTP 和 SOCKS5 的标准代理服务。代理请求访问的地址将转发到另一端去访问。

语法格式x://[user:pass@]ip:port?[params]

  • 认证 (可选):在 IP 前加上 user:password@ 即可启用代理认证。
  • 支持参数
参数 示例 说明
tproxy tproxy=1 启用透明代理支持 (Linux TProxy)。
allow allow=domain 使透明代理允许代理访问域名。
outbound_bind outbound_bind=10.0.0.5 指定出口 IP。当对端机器有多个 IP 时,强制代理流量从指定网卡发出。

(2) 转发协议 (f://)

端口转发模式 (Port Forwarding)。监听一端的端口,将流量转发到另一端可达的目标地址。

语法格式f://ip:port?to=target:port&[params]

  • 核心参数
  • to (必填):流量转发的目标地址。

  • 支持参数

参数 示例 说明
outbound_bind outbound_bind=10.0.0.5 指定连接目标地址时使用的源 IP。

(3) TLS 加密扩展 (+tls)

上述 xf 协议均支持启用 TLS,用于在本地/远程监听加密端口(而非明文端口)。

语法格式x+tls://...f+tls://...

  • 支持参数
参数 示例 说明
cert cert=server.pem 指定 TLS 证书文件路径。
key key=server.key 指定 TLS 私钥文件路径。

📝 配置示例

以下示例的link配置假设左侧是家里,右侧是公司。使用P2P建立连接的方式。

首先假设公司已经启动了linkagent服务。它会一直订阅MQTT消息等待客户端唤起连接,支持多个客户端同时建立隧道。

gonc -p2p mysecret123 -k -mqtt-wait -e ":mux linkagent"
gonc -p2p mysecret123 -linkagent

接下来示例是从家里客户端发起link请求,默认使用TCP+TLS+PSK的通讯加密方案,如果TCP无法穿透会自动尝试UDP,你可以仅从客户端追加参数来设定两端的传输协议,例如添加-u将限定使用UDP+KCP+DTLS+PSK的通讯加密方案,如果再添加-ss将限定使用UDP+KCP+SS的通讯加密方案

gonc -p2p mysecret123 -k -mqtt-hello -e ":mux link x://:1080;x://:3080"
gonc -p2p mysecret123 -link "x://:1080;x://:3080"

家里和公司分别监听1080和3080的SOCKS5+HTTP代理,彼此可通过一个隧道互访对方网络。

用-link参数会自动添加-k -mqtt-hello -e 调用":mux"

家里开启透明代理,公司不监听端口,公司转发流量时使用指定IP:192.168.1.5。透明代理只支持绑定在0.0.0.0,但只允许来自loopback地址访问。

gonc -p2p mysecret123 -link "x://0.0.0.0:1080?tproxy=1;none?outbound_bind=192.168.1.5"

家里不监听端口,公司监听端口在0.0.0.0:8080,转发到家里的192.168.0.1:80。

gonc -p2p mysecret123 -link "none;f://0.0.0.0:8080?to=192.168.0.1:80"

本地监听加密的 SOCKS5 端口(需要客户端用 TLS 连入)。

gonc -p2p mysecret123 -link "x+tls://0.0.0.0:8443?cert=ca.pem&key=key.pem;none"

2. 文件传输 (httpserver / httpclient)

在复用通道中直接传输文件,无需建立额外的连接,支持断点续传。

  • :mux httpserver <dir1> [dir2]...: 在通道一端启动文件服务。
  • :mux httpclient <saveDir> <remotePath>: 在通道另一端请求下载。

示例:目录同步

gonc -p2p mysecret123 -k -mqtt-wait -e ":mux httpserver D:/Data1 D:/Data2"
gonc -p2p mysecret123 -httpserver D:/Data1 D:/Data2

以上命令开启共享 D 盘的 Data1 和 Data2 目录。

将远程的 Data 目录都下载到本地的 /tmp/download。

# 注意:<remotePath>为/表示下载全部,也可以指定具体某个文件或目录
gonc -p2p mysecret123 -k -mqtt-hello -e ":mux httpclient /tmp/download /"
若这样则不下载,只监听8080端口,可使用浏览器访问 http://127.0.0.1:8080
gonc -p2p mysecret123 -k -mqtt-hello -e ":mux -l 8080"

将远程的 Data 目录下载到本地的 /tmp/download。

# 注意:还可以-download-subpath指定具体要下载的某目录
gonc -p2p mysecret123 -download /tmp/download
若这样则不下载,只监听8080端口,可使用浏览器访问 http://127.0.0.1:8080
gonc -p2p mysecret123 -httplocal-port 8080

3. 监听模式 (-l)

语法

gonc -p2p mysecret123 -k -mqtt-wait -e ":mux -l <port>"

指定 :mux 模块在特定的本地端口上监听,对端httpserver时,指定本地监听 作为mux的入口,共浏览器或gonc访问对端的HTTP服务。

4. socks5

类似linkagent,不展开介绍,新版的linkagent功能已经取代它。

gonc -p2p mysecret123 -k -mqtt-wait -e ":mux socks5"

🤖 :service - 动态服务 (Super Server)

它允许在一个监听端口上,根据客户端的请求(Call)动态提供不同的服务。类似于 Linux 的 inetd 或 SSH 的多功能端口。

工作流程

  1. 服务端配置:使用 -:xxx 参数预定义好各种服务(如 -:sh, -:s5s)。
  2. 服务端运行:使用 -e ":service" 启动主控循环。
  3. 客户端调用:连接时使用 -call :xxx 告诉服务端“我想要什么服务”。

服务端配置示例

启动一个端口 2222,开启mux模式,同时提供 Shell、SOCKS5 和 HTTP 服务,并使用 TLS+PSK 加密:

gonc -l 2222 -tls -psk mysecret123 -keep-open -mux \
    -e ":service" \
    -:sh "/bin/bash"  \
    -:s5s "-http" \
    -:httpserver "/tmp"

客户端调用示例

shell模式,-mux-l-表示不用本地再监听端口,直接用stdio接入

gonc server-ip 2222 -tls -psk mysecret123 -call :sh -pty -mux-l -

在本地启动 1080 端口,通过 server 的 :s5s 模块代理上网。

gonc server-ip 2222 -tls -psk mysecret123 -call :s5s -mux-l 1080 

将服务端的 /tmp 映射到本地 8080 端口

gonc server-ip 2222 -tls -psk mysecret123 -call :httpserver -mux-l 8080 

为什么使用 :service

  • 隐蔽性:只开放一个端口(如 443),却能干所有的事情。
  • 灵活性:不需要为传文件单独开一个进程,也不需要为 Shell 单独开一个端口。