Skip to content

2c2a/gateway

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

2c2a Gateway

隧道网关 — RDP 代理 + WSS 隧道服务 + 控制面
为零公网 IP 的 Windows 主机提供安全 RDP 访问通道

Go 1.22+ License: AGPL-3.0


⚠️ 仓库合并公告

本仓库已合并原 tunnel 仓库的全部功能(WSS 客户端、Windows 服务、远程执行等),原 tunnel 仓库已停止维护并归档。 边缘端隧道客户端的源码现位于本仓库 cmd/tunnel/ 目录,与 Gateway 共享同一代码库统一构建。 如需访问历史记录,请前往原 tunnel 仓库的归档页面。


架构概览

Gateway Architecture

Gateway 是 2c2a 生态的可选组件,提供三个核心服务:

服务 端口 协议 说明
RDP Proxy :443 TLS/TCP SNI 域名路由 → 隧道转发
WSS Server :9000 WebSocket 隧道接入 + 心跳检测
Control Socket Unix Socket msgpack Django 控制面

数据流

Data Flow

RDP 访问流程

  1. Tunnel 连接:边缘端 2c2a-tunnel 通过 WSS 连接到 Gateway,注册到 Tunnel Pool
  2. 域名绑定:2c2a Django 通过 Control Socket 发送 domain_bind 命令
  3. RDP 连接:用户通过 rdp-xxx.2c2a.com:443 连接,Gateway 提取 SNI 路由到对应隧道
  4. 数据转发: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/

设计要点

  • 循环依赖解耦controlrdp 通过 DomainRouter/EventBroadcaster 接口解耦
  • 帧协议:3 字节头 (2B length + 1B channel) + payload,支持 RDP/WinRM/RemoteExec/Control 四通道
  • 心跳机制:30s 间隔发送,90s 超时断开
  • 自动重连:边缘端指数退避重连(1s → 60s)

许可证

AGPL-3.0 License - 查看 LICENSE 文件了解详情。

About

ZASCA架构的网关层

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors