FastTunnel v2 内网穿透 Docker 部署完整指南(服务端 + 客户端)
标签:#内网穿透 #FastTunnel #Docker #运维 #Linux
前言
FastTunnel 是一款开源的内网穿透工具,支持 HTTP 站点穿透和 TCP 端口转发。本文记录将 FastTunnel 从传统二进制部署迁移至 Docker 容器化部署的完整过程,适用于需要将内网服务(如后台管理系统、文件管理器、CI/CD 工具等)暴露到公网的场景。
环境说明:
服务端:阿里云 ECS
客户端:内网 Ubuntu 24.04 服务器
Docker 版本:服务端 26.x,客户端 27.x
一、服务端部署(阿里云 ECS)
1.1 准备配置文件
mkdir -p /www/dk_project/dk_app/dk_fasttunnel_server/config
创建 appsettings.json(注意:JSON 不支持注释,务必使用标准格式):
cat > /www/dk_project/dk_app/dk_fasttunnel_server/config/appsettings.json << 'EOF'
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Yarp.ReverseProxy": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"WriteTo": []
},
"AllowedHosts": "*",
"urls": "http://*:1270",
"EnableFileLog": false,
"FastTunnel": {
"WebDomain": "你的根域名",
"EnableForward": true,
"Tokens": [ "你的Token" ],
"Api": {
"JWT": {
"ClockSkew": 10,
"ValidAudience": "https://suidao.io",
"ValidIssuer": "FastTunnel",
"IssuerSigningKey": "This is IssuerSigningKey",
"Expires": 120
},
"Accounts": [
{
"Name": "admin",
"Password": "admin123"
}
]
}
}
}
EOF
关键配置说明:
⚠️ 常见坑: v2 服务端必须配置
Api.JWT节点,否则客户端连接时服务端会返回 500 错误。
1.2 创建 docker-compose.yml
cat > /www/dk_project/dk_app/dk_fasttunnel_server/docker-compose.yml << 'EOF'
services:
fasttunnel-server:
image: springhgui/fasttunnel-v2:latest
container_name: fasttunnel-server
network_mode: host
volumes:
- ./config/appsettings.json:/app/config/appsettings.json
restart: unless-stopped
EOF
使用
network_mode: host的原因:服务端需要监听多个端口(1270 通信端口 + 各转发端口),host 模式最简便。
1.3 启动服务端
cd /www/dk_project/dk_app/dk_fasttunnel_server
# Docker Compose V2(新版)
docker compose up -d
# Docker Compose V1(旧版,如提示 unknown flag: -d)
docker-compose up -d
# 查看日志
docker logs fasttunnel-server --tail 20
正常启动日志:
Now listening on: http://[::]:1270
Application started. Press Ctrl+C to shut down.
二、客户端部署(内网服务器)
2.1 拉取客户端镜像
⚠️ 注意区分镜像名称:
springhgui/fasttunnel-v2→ 服务端
springhgui/fasttunnel-client→ 客户端(正确)
springhgui/fasttunnel-client-v2→ 也是客户端,但行为与服务端相同,不推荐
国内服务器拉取 Docker Hub 镜像可能超时,建议配置代理或使用镜像加速。
docker pull springhgui/fasttunnel-client:v2.1.2
2.2 准备配置文件
mkdir -p /www/dk_project/dk_app/dk_fasttunnel/config
创建客户端配置(JSON 中不能有注释):
cat > /www/dk_project/dk_app/dk_fasttunnel/config/appsettings.json << 'EOF'
{
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"WriteTo": []
},
"FastTunnel": {
"Server": {
"ServerAddr": "
",
"ServerPort": 1270
},
"Token": "你的Token",
"Webs": [
{
"LocalIp": "127.0.0.1",
"LocalPort": 8090,
"SubDomain": "api-cloud-test"
}
],
"Forwards": [
{ "LocalIp": "127.0.0.1", "LocalPort": 5244, "RemotePort": 1271, "Protocol": "TCP" },
{ "LocalIp": "127.0.0.1", "LocalPort": 48080, "RemotePort": 1275, "Protocol": "TCP" },
{ "LocalIp": "127.0.0.1", "LocalPort": 3004, "RemotePort": 1274, "Protocol": "TCP" }
]
}
}
EOF
配置说明:
2.3 创建 docker-compose.yml
cat > /www/dk_project/dk_app/dk_fasttunnel/docker-compose.yml << 'EOF'
services:
fasttunnel-client:
image: springhgui/fasttunnel-client:v2.1.2
container_name: fasttunnel-client
network_mode: host
volumes:
- ./config/appsettings.json:/app/appsettings.json
restart: unless-stopped
EOF
2.4 启动客户端
cd /www/dk_project/dk_app/dk_fasttunnel
docker compose up -d
docker logs fasttunnel-client --tail 20
连接成功日志:
===== FastTunnel Client Start =====
正在连接服务端 你的IP:1270
穿透协议 | 映射关系(公网=>内网)
HTTP | http://api-cloud-test.example.com:1270 => 127.0.0.1:8090
TCP | example.com:1271 => 127.0.0.1:5244
三、常见问题排查
问题一:客户端报 500 错误
ERR The server returned status code '500' when status code '101' was expected.
原因: 服务端 appsettings.json 缺少 Api.JWT 配置节点。
解决: 在服务端配置中添加完整的 Api.JWT 配置后重启服务端容器。
问题二:配置不生效,容器行为异常
原因: JSON 配置文件中包含注释(// 或 /* */),导致解析失败,配置项未被读取。
解决: 删除所有注释,保持标准 JSON 格式。
问题三:镜像拉取超时
国内服务器访问 Docker Hub 网络问题,解决方案:
# 方案一:配置代理
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
EOF
systemctl daemon-reload && systemctl restart docker
# 方案二:指定具体版本 tag 重试
docker pull springhgui/fasttunnel-client:v2.1.2
问题四:端口被旧进程占用
# 查找占用进程
ss -tlnp | grep 1270
# 杀掉旧进程
kill <PID>
# 重启容器
docker compose restart
四、目录结构总览
/www/dk_project/dk_app/
├── dk_fasttunnel_server/ # 服务端(部署在公网 ECS)
│ ├── docker-compose.yml
│ └── config/
│ └── appsettings.json
└── dk_fasttunnel/ # 客户端(部署在内网服务器)
├── docker-compose.yml
└── config/
└── appsettings.json
五、维护命令
# 查看运行状态
docker ps | grep fasttunnel
# 实时查看日志
docker logs fasttunnel-client -f
# 重启客户端(修改配置后)
docker compose restart
# 更新镜像
docker compose pull && docker compose up -d
总结
FastTunnel v2 Docker 部署相比传统二进制部署有以下优势:
容器自动重启,无需额外配置 systemd 服务
环境隔离,升级回滚方便
统一目录管理,配合宝塔 Docker 面板可视化管理
主要注意点:JSON 配置不能有注释、v2 服务端必须配置 JWT、客户端镜像名为 fasttunnel-client 而非 fasttunnel-client-v2。