GMPF - 国密 TLS 内网穿透工具

基于 tjfoc/gmsm 的国密 TLS 内网穿透工具,把内网服务映射到公网端口。

架构

1
2
外部用户 ──→ Server:expose_port ──[GMSSL]──→ Client ──→ 127.0.0.1:target_port
(公网) (公网机器) (内网机器) (内网服务)
  • Client 在内网主动连接 Server,注册隧道
  • Server 监听公网端口,收到连接后通知 Client 建立数据通道
  • 每个连接独立一条 GMSSL 数据通道,互不干扰

快速开始

启动服务端(公网机器)

1
2
cd gmpf/server
go run main.go
参数 环境变量 说明 默认值
GMPF_LISTEN GMSSL 监听地址 0.0.0.0:8443

自定义监听地址:

1
GMPF_LISTEN=0.0.0.0:9443 go run main.go

启动客户端(内网机器)

方式一:命令行参数

1
2
cd gmpf/client
go run main.go -s 1.2.3.4:8443 -p 6993 -t 127.0.0.1:22
参数 说明 默认值
-s 服务端地址(必填)
-p 服务端暴露端口 6993
-t 本地目标地址 127.0.0.1:22
-c 证书目录 ../certs
-verify 开启证书链验证 false

方式二:交互式输入

不带 -s 参数启动时,进入交互模式:

1
go run main.go
1
2
3
4
5
6
7
========================================
GMPF 客户端 - 国密 TLS 内网穿透
========================================

请输入服务端地址 (如 1.2.3.4:8443): 1.2.3.4:8443
服务端暴露端口 [6993]:
本地目标地址 [127.0.0.1:22]:

方括号内为默认值,直接回车即可使用。

连接测试

1
ssh -p 6993 your-server

使用示例

映射内网 SSH

1
2
go run main.go -s your-server:8443 -p 6993 -t 127.0.0.1:22
# 外部通过 ssh -p 6993 your-server 连接

编译

1
2
3
4
./build.sh              
./build.sh linux
./build.sh darwin
./build.sh clean

编译完成保存 build/ 目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
build/
├── linux-arm64/
│ ├── gmpf-server
│ └── gmpf-client
├── linux-amd64/
│ ├── gmpf-server
│ └── gmpf-client
├── darwin-arm64/
│ ├── gmpf-server
│ └── gmpf-client
├── darwin-amd64/
│ ├── gmpf-server
│ └── gmpf-client
└── windows-amd64/
├── gmpf-server.exe
└── gmpf-client.exe

部署时将证书 certs/ 目录一并复制到服务端/客户端同级目录。

协议

1
2
3
4
5
6
7
8
9
10
控制通道(客户端发起,长连接):
Client → Server: REGISTER <expose_port>:<target_addr>\n
Server → Client: 200 OK <expose_port>\n
Server → Client: NEW_CONN <session_key>\n (通知客户端建立数据通道)
Client → Server: HEARTBEAT\n

数据通道(每个连接独立建立):
Client → Server: DATA_CONN <session_key>\n
Server → Client: 200 OK\n
→ 双向原始 TCP 流

数据包截图

image-20260409163632019

缺陷说明

  • tjfoc/gmsm v1.4.1 的 SM2 证书链验证存在缺陷,默认跳过 (InsecureSkipVerify)
  • GMSSL 加密通道(SM2+SM3+SM4)仍然生效,仅跳过证书链校验
  • 如需开启验证:-verify 参数或 GMPF_VERIFY_CERT=1(需 gmsm 修复后才能正常工作)