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 2 3 4 5 6 7
| ======================================== GMPF 客户端 - 国密 TLS 内网穿透 ========================================
请输入服务端地址 (如 1.2.3.4:8443): 1.2.3.4:8443 服务端暴露端口 [6993]: 本地目标地址 [127.0.0.1:22]:
|
方括号内为默认值,直接回车即可使用。
连接测试
使用示例
映射内网 SSH
1 2
| go run main.go -s your-server:8443 -p 6993 -t 127.0.0.1:22
|
编译
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 流
|
数据包截图

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