⚠️ 仓库合并公告本仓库已合并原
tunnel仓库的全部功能(WSS 客户端、Windows 服务、远程执行等),原tunnel仓库已停止维护并归档。 边缘端隧道客户端的源码现位于本仓库cmd/tunnel/目录,与 Gateway 共享同一代码库统一构建。 如需访问历史记录,请前往原tunnel仓库的归档页面。
Gateway 是 2c2a 生态的可选组件,提供三个核心服务:
| 服务 | 端口 | 协议 | 说明 |
|---|---|---|---|
| RDP Proxy | :443 | TLS/TCP | SNI 域名路由 → 隧道转发 |
| WSS Server | :9000 | WebSocket | 隧道接入 + 心跳检测 |
| Control Socket | Unix Socket | msgpack | Django 控制面 |
- Tunnel 连接:边缘端
2c2a-tunnel通过 WSS 连接到 Gateway,注册到 Tunnel Pool - 域名绑定:2c2a Django 通过 Control Socket 发送
domain_bind命令 - RDP 连接:用户通过
rdp-xxx.2c2a.com:443连接,Gateway 提取 SNI 路由到对应隧道 - 数据转发:RDP 数据通过 WSS 帧转发到边缘端,边缘端转发到本地
localhost:3389
通过 Unix Domain Socket 通信,使用 msgpack 编码:
| 命令 | 说明 |
|---|---|
domain_bind |
绑定域名到隧道 Token |
domain_unbind |
解绑域名 |
tunnel_kick |
踢掉指定隧道连接 |
tunnel_stats |
查询隧道状态统计 |
remote_exec |
通过隧道远程执行命令 |
Gateway 主动向 Django 推送事件:
| 事件 | 说明 |
|---|---|
tunnel_online |
隧道上线 |
tunnel_offline |
隧道离线 |
rdp_connect |
RDP 连接建立 |
rdp_disconnect |
RDP 连接断开 |
remote_exec_result |
远程执行结果 |
gateway/
├── cmd/
│ ├── gateway/main.go # Gateway 服务入口
│ └── tunnel/ # 边缘端隧道客户端(原 tunnel 仓库)
│ ├── main.go # CLI 入口 (install/run/uninstall/version)
│ ├── client.go # WSS 客户端 + 自动重连 + 心跳
│ ├── config.go # YAML 配置
│ ├── install.go # 安装逻辑
│ ├── remote_exec.go # 远程 PowerShell 执行
│ ├── service_windows.go # Windows 服务 API
│ └── service_other.go # 非 Windows 桩文件
├── internal/
│ ├── config/ # YAML 配置加载
│ ├── protocol/ # msgpack 控制协议定义
│ ├── control/ # Unix Socket 服务器
│ │ ├── socket.go # Socket 监听 + 读写
│ │ ├── handler.go # 命令处理 (DomainRouter 接口)
│ │ └── notifier.go # 事件广播器
│ ├── tunnelserver/ # WSS 隧道服务端
│ │ ├── server.go # WSS 接入服务
│ │ ├── pool.go # 连接池
│ │ ├── session.go # 会话管理
│ │ ├── auth.go # 隧道认证
│ │ ├── control.go # 隧道控制
│ │ └── notifier.go # 事件通知
│ ├── tunnelclient/ # 隧道客户端核心(供 cmd/tunnel 使用)
│ │ ├── client.go # 客户端连接管理
│ │ ├── connector.go # 连接器
│ │ ├── control.go # 控制通道
│ │ └── remote_exec.go # 远程执行
│ └── rdpgw/ # RDP 网关层
│ ├── gateway.go # RDP 网关核心
│ ├── process.go # 连接处理
│ ├── transport.go # 传输层
│ ├── tunnel.go # 隧道转发
│ ├── websocket.go # WebSocket 传输
│ ├── auth.go # 认证
│ └── ...
├── pkg/
│ ├── logger/ # 日志封装
│ ├── msg/ # 消息协议
│ ├── rdpfile/ # RDP 文件生成
│ ├── transport/ # 传输消息
│ └── util/ # 工具函数
├── configs/gateway.yaml # 默认配置
├── go.mod
└── go.sum
# 构建 Gateway 服务端
go build -o 2c2a-gateway ./cmd/gateway/
# 构建边缘端隧道客户端
go build -o 2c2a-tunnel.exe ./cmd/tunnel/编辑 configs/gateway.yaml:
tunnel:
port: 9000
heartbeat_sec: 30
timeout_sec: 90
rdp:
port: 443
tls_cert: "/etc/2c2a/tls/cert.pem"
tls_key: "/etc/2c2a/tls/key.pem"
rdp_domain: "2c2a.com"
control:
socket_path: "/run/2c2a/control.sock"./2c2a-gateway -config configs/gateway.yaml# Gateway — Linux AMD64
GOOS=linux GOARCH=amd64 go build -o 2c2a-gateway-linux ./cmd/gateway/
# Gateway — Linux ARM64
GOOS=linux GOARCH=arm64 go build -o 2c2a-gateway-arm64 ./cmd/gateway/
# Tunnel 客户端 — Windows AMD64
GOOS=windows GOARCH=amd64 go build -o 2c2a-tunnel-windows-amd64.exe ./cmd/tunnel/
# Tunnel 客户端 — Windows ARM64
GOOS=windows GOARCH=arm64 go build -o 2c2a-tunnel-windows-arm64.exe ./cmd/tunnel/- 循环依赖解耦:
control↔rdp通过DomainRouter/EventBroadcaster接口解耦 - 帧协议:3 字节头 (2B length + 1B channel) + payload,支持 RDP/WinRM/RemoteExec/Control 四通道
- 心跳机制:30s 间隔发送,90s 超时断开
- 自动重连:边缘端指数退避重连(1s → 60s)
AGPL-3.0 License - 查看 LICENSE 文件了解详情。