这是一个建立反向映射隧道的程序,支持一个Client/Server对进行PQC加密握手,使用 Go 语言实现。
注意事项:这是一个实验版本,需要使用OpenSSL3.5进行编译。
系统包含两个独立的程序:
server:运行在公网服务器上
client:运行在内网机器上
外部用户 → server:8080 → 控制连接 → client → 本地服务:80
每个帧的格式:
| 1 byte frame_type | 4 bytes conn_id | 4 bytes payload_len | payload... |
帧类型:
0x01 - NEW_CONN:新连接请求(server → client)0x02 - DATA:数据传输(双向)0x03 - CLOSE_CONN:连接关闭(双向)0x04 - INIT:初始化配置(client → server,用于指定远程端口)cd reverse-tunnel
export CGO_ENABLED=1
export LD_LIBRARY_PATH=/opt/openssl-oqs/lib:$LD_LIBRARY_PATH
go build -o bin/server ./cmd/server
go build -o bin/client ./cmd/client
重要:Windows 上编译需要 OpenSSL 3.5+ with oqs-provider 环境,否则无法编译成功。
详细说明请参考 WINDOWS_BUILD.md
./bin/server [选项]
选项:
--control-listen:控制端口监听地址(默认 :7000)--public-listen:公开端口监听地址(可选,留空则由客户端指定)--tls:启用 PQC mTLS(可选)--tls-cert:服务器证书文件路径(默认 /root/pq-certs/server.crt)--tls-key:服务器私钥文件路径(默认 /root/pq-certs/server.key)--tls-ca:CA 证书文件路径(默认 /root/pq-certs/ca.crt)示例:
# 使用默认控制端口,公开端口由客户端指定
./bin/server
# 指定公开端口
./bin/server --control-listen=:7000 --public-listen=:8080
# 启用 PQC mTLS
./bin/server --control-listen=:7000 --tls \
--tls-cert=/root/pq-certs/server.crt \
--tls-key=/root/pq-certs/server.key \
--tls-ca=/root/pq-certs/ca.crt
./bin/client [选项]
选项:
--server:服务器地址(必填,例如 1.2.3.4:7000)--local:本地服务地址(必填,例如 127.0.0.1:80)--remote-port:远程端口(可选,服务器要监听的端口,0 表示由服务器指定)--tls:启用 PQC mTLS(可选)--tls-cert:客户端证书文件路径(默认 /root/pq-certs/client.crt)--tls-key:客户端私钥文件路径(默认 /root/pq-certs/client.key)--tls-ca:CA 证书文件路径(默认 /root/pq-certs/ca.crt)--tls-server-name:服务器名称(TLS SNI,留空则使用服务器地址)示例:
# 客户端指定远程端口(推荐)
./bin/client --server=1.2.3.4:7000 --local=127.0.0.1:80 --remote-port=8080
# 由服务器指定端口
./bin/client --server=1.2.3.4:7000 --local=127.0.0.1:80
# 启用 PQC mTLS
./bin/client --server=127.0.0.1:7000 --local=127.0.0.1:80 --remote-port=8080 --tls \
--tls-cert=/root/pq-certs/client.crt \
--tls-key=/root/pq-certs/client.key \
--tls-ca=/root/pq-certs/ca.crt
启动服务器:
./bin/server --control-listen=:7000
启动客户端:
./bin/client --server=127.0.0.1:7000 --local=127.0.0.1:80 --remote-port=8080
测试访问:
curl http://127.0.0.1:8080
运行所有测试:
go test -v ./internal/tunnel
reverse-tunnel/ ├── cmd/ │ ├── server/main.go # 服务器入口 │ └── client/main.go # 客户端入口 ├── internal/ │ ├── proto/proto.go # 协议编解码 │ ├── tunnel/ │ │ ├── server.go # 服务器核心逻辑 │ │ ├── client.go # 客户端核心逻辑 │ │ └── server_test.go # 集成测试 │ └── pqctls/ # PQC mTLS 实现 ├── go.mod └── README.md
sync.Map 管理 connID 映射(线程安全)sync.RWMutex 保护控制连接atomic 生成唯一 connID本项目为示例/教育用途,可根据需要修改和使用。
注意:生产环境使用前请确保启用 PQC mTLS 以保障安全性。