Docker + FRP 实现内网服务器公网访问(SSH/Xftp穿透)实战分享

0 阅读2分钟

一、前言

很多时候内网服务器没有公网 IP,远程管理很麻烦。
本文分享我用 FRP + Docker 实现公网访问内网 SSH / Xftp 的实战经验,包含配置、部署流程和排查方法。


二、整体架构

+------------------+        SSH/Xftp         +------------------+
|                  |  ------------------->   |                  |
|  本地电脑        |                          |  公网服务器      |
|  (你的电脑)      | <-------------------   |  frps Docker容器 |
|                  |        TCP 15000       |  bindPort:7000   |
+------------------+                          |  web:7500        |
                                               +------------------+
                                                       │
                                                       │ TCP隧道
                                                       ▼
                                               +------------------+
                                               |                  |
                                               |  内网服务器      |
                                               |  frpc Docker容器 |
                                               |  SSH 22          |
                                               +------------------+

✅ 原理:内网服务器主动连接公网 FRPS,FRPS 动态监听 remotePort,实现 TCP 转发
⚠️ 注意:FRP 是端口级映射,不是 VPN,单端口穿透仅能访问指定服务


三、FRPS 服务端部署(公网服务器)

1️⃣ 创建配置目录

mkdir -p /data/sfs-0001/docker_data/frp

2️⃣ 配置 frps.toml

bindPort = 7000

auth.method = "token"
auth.token = "你的token"

webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "你的密码"

log.level = "info"
log.maxDays = 7

说明:

  • 7000 → FRPC 连接端口
  • 7500 → Web 管理后台
  • auth.token → 连接验证

3️⃣ 启动 FRPS 容器

docker run -d \
  --name frps \
  --restart=always \
  -p 7000:7000 \
  -p 7500:7500 \
  -v /data/sfs-0001/docker_data/frp/frps.toml:/etc/frp/frps.toml \
  docker.m.daocloud.io/snowdreamtech/frps

4️⃣ 安全组端口放行

端口用途
7000FRPC 连接
7500Web 管理后台
15000SSH 映射端口

四、FRPC 客户端部署(内网服务器)

1️⃣ 配置 frpc.toml

路径 /data/frp/frpc.toml

serverAddr = "公网IP"
serverPort = 7000

auth.method = "token"
auth.token = "你的token 同上"

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1" //注意这里改成本机的ip 因为容器内部的 `127.0.0.1` 指向容器自己
localPort = 22
remotePort = 15000

✅ localPort → 内网服务端口
✅ remotePort → 公网映射端口


2️⃣ 启动 FRPC 容器

docker run -d \
  --name frpc \
  --restart=always \
  -v /data/frp/frpc.toml:/etc/frp/frpc.toml \
  docker.m.daocloud.io/snowdreamtech/frpc

五、验证与排查

  1. 查看 frpc 日志
docker logs frpc

输出示例:

login to server success
proxy added: [ssh]
start proxy success

2. SSH / Xftp 测试

ssh -p 15000 root@公网IP

⚠️ 如果报 Connection closed,一般是 SSH 本身策略限制(root 禁止密码登录或密钥问题),不是 FRP 问题。

  1. 后台管理确认客户端在线
http://公网IP:7500

输入账号密码后可以进入页面 image.png


六、问题排查经验

  • 拉镜像失败 → 配置国内 Docker 镜像源
    • docker.m.daocloud.io/snowdreamtech/frps是国内的镜像 正常应该是可以直接拉取
    • 实在下不了可以用我上传的夸克的文件 链接:pan.quark.cn/s/08b4b6ac3… 提取码:ETJY
    • frps-image.tar放入公网服务器 加载本地tar镜像包 docker load -i frps-image.tar
    • frpc-image.tar放入内网服务器 加载本地tar镜像包 docker load -i frpc-image.tar
  • 端口无法访问 → 检查安全组、防火墙

七、总结

✅ 完成 FRP 服务端 + 内网客户端部署
✅ 实现公网访问内网 SSH / Xftp
✅ 完成 Docker 化部署
✅ 可灵活扩展其他服务端口

技术点:FRP 内网穿透、Docker 容器化、端口映射、SSH 安全策略