轻量级 TCP/UDP 端口隧道,Go 语言编写,零依赖,单文件部署。参照了 NPS、FRP 等穿透工具的功能和 UI的优点,结合自身需求用 AI 辅助重写了全部代码,属于全新系统。
| 镜像 | 说明 | 大小 |
|---|---|---|
| ad80a1/ptg-server | 服务端(含 Web 管理面板) | ~32MB |
| ad80a1/ptg-client | 客户端 | ~11MB |
适用场景: 个人/小团队、穿透端口较多、追求最佳性能
# 拉取镜像
docker pull ad80a1/ptg-server:latest
docker pull ad80a1/ptg-client:latest
# 启动服务端
docker run -d --name ptgs --restart unless-stopped --network host \
-v /opt/port-tunnel-go:/opt/port-tunnel-go \
ad80a1/ptg-server:latest
# 启动客户端
docker run -d --name ptgc --restart unless-stopped --network host \
ad80a1/ptg-client:latest \
--host 服务端IP --port 9999 --local 8080 --mode tcp \
--remark "my-service" --token ***
适用场景: 生产环境、多服务共存、需要安全隔离
# 启动服务端(映射管理端口)
docker run -d --name ptgs --restart unless-stopped \
-p 8888:8888 \
-p 9999:9999 \
-v /opt/port-tunnel-go:/opt/port-tunnel-go \
ad80a1/ptg-server:latest
# ⚠️ 穿透端口需额外映射,例如映射 3000 端口:
docker run -d --name ptgs --restart unless-stopped \
-p 8888:8888 \
-p 9999:9999 \
-p 3000:3000 \
-v /opt/port-tunnel-go:/opt/port-tunnel-go \
ad80a1/ptg-server:latest
| 场景 | 推荐方案 |
|---|---|
| 个人 / 小团队 | Host 模式 — 简单高效 |
| 生产环境 / 多服务共存 | 端口映射 — 安全隔离 |
| 穿透大量端口 | Host 模式 — 避免逐个映射 |
| Docker Swarm / K8s | 端口映射 — 符合编排规范 |
新版本镜像会自动更新程序文件(server-bin、static),但 config.json 不会被覆盖(保留用户配置)。如果你之前部署过旧版本且 config.json 中有硬编码的公网 IP,升级后请到系统设置确认 IP 是否正确,或手动删除 /opt/port-tunnel-go/config.json 让容器重新初始化。
二级转发允许将流量从服务端再转发到另一个目标地址,实现多级代理链路。典型场景:
用户 → 服务端公网端口 → 客户端 → --target 目标地址
客户端收到服务端转发的流量后,不会发到本地 --local 地址,而是转发到 --target 指定的目标。
只需在客户端启动参数中添加 --target 即可:
# 将服务端 8080 端口的流量,转发到 192.168.1.100:80
docker run -d --name ptgc --restart unless-stopped --network host \
ad80a1/ptg-client:latest \
--host 服务端IP --port 9999 --local 8080 --mode tcp \
--target 192.168.1.100:80 \
--remark "relay-to-100" --token ***
场景: 将阿里云服务端的 8080 端口,转发到百度云内网的 3306(MySQL)。
第一步:启动服务端(阿里云)
docker run -d --name ptgs --restart unless-stopped --network host \
-v /opt/port-tunnel-go:/opt/port-tunnel-go \
ad80a1/ptg-server:latest
第二步:启动客户端(百度云或公司内网,能访问 MySQL 的机器)
docker run -d --name ptgc --restart unless-stopped --network host \
ad80a1/ptg-client:latest \
--host 阿里云IP --port 9999 --local 8080 --mode tcp \
--target 127.0.0.1:3306 \
--remark "mysql-relay" --token ***
第三步:连接
# 从任何机器连接阿里云 8080,实际到达百度云 MySQL
mysql -h 阿里云IP -P 8080 -u root -p
version: "3.8"
services:
ptg-client:
image: ad80a1/ptg-client:latest
container_name: ptgc
network_mode: host
command: >
--host 服务端IP
--port 9999
--local 8080
--mode tcp
--target 192.168.1.100:80
--remark "relay"
--token ***
restart: unless-stopped
--local 和 --target 二选一:指定了 --target 后,--local 不生效--token 使用,避免未授权访问| 参数 | 默认值 | 说明 |
|---|---|---|
--local | (必填) | 本地转发地址,如 8080 或 127.0.0.1:8080 |
--host | 0.0.0.0 | 服务端地址 |
--port | 9999 | 服务端管理端口 |
--mode | tcp | 隧道模式:tcp 或 udp |
--minutes | 180 | 隧道有效期(分钟) |
--bind | (自动) | 指定服务端映射端口 |
--remark | (可选) | 隧道备注名称 |
--token | (可选) | 访问令牌 |
--target | (可选) | 二级转发目标地址(与 --local 互斥) |
--tag | (可选) | 隧道标签 |
服务端数据文件存储在 /opt/port-tunnel-go/,务必挂载此目录:
-v /opt/port-tunnel-go:/opt/port-tunnel-go
version: "3.8"
services:
ptg-server:
image: ad80a1/ptg-server:latest
container_name: ptgs
network_mode: host
volumes:
- ./data:/opt/port-tunnel-go
restart: unless-stopped
version: "3.8"
services:
ptg-server:
image: ad80a1/ptg-server:latest
container_name: ptgs
ports:
- "8888:8888"
- "9999:9999"
volumes:
- ./data:/opt/port-tunnel-go
restart: unless-stopped
https://gitee.com/cncsrf/port-tunnel-go
MIT
Content type
Image
Digest
sha256:8ef8267ef…
Size
11.6 MB
Last updated
3 months ago
docker pull ad80a1/ptg-server