FRP 内网穿透

平台部署在没有公网 IP 的内网/IDC/办公室局域网,只有一台带公网 IP 的云服务器,想让公网用户访问内网 CubeStudio 时读这篇

02-部署安装 / 网络
FRPfrpsfrpc内网穿透intranet penetration反向代理reverse proxy端口转发port forwardingNAT穿透frpc.inifrps.initokenrangeNodePortingress

通过 FRP 内网穿透,把 CubeStudio 暴露到公网

本篇提供一套 基于 FRP 的内网穿透方案,用于在以下场景下让公网用户访问到部署在内网的 CubeStudio 平台:

  • 平台已部署在 内网 / 私有 IDC / 办公室局域网,没有公网 IP;
  • 仅有一台 带公网 IP 的云服务器(阿里云 / 腾讯云 / AWS 等任意厂商均可,最低 1C2G 即可);
  • 希望把 CubeStudio 的 Web 控制台、Notebook、推理服务、内部服务端口、SSH 等都通过这台云服务器对外暴露。

整个方案不需要修改 CubeStudio 任何业务代码,只是在网络层做端口转发。

本文涉及的配置样例文件(frps.ini / frpc.ini / start-server.sh / start-client.sh 等)位于仓库 install/kubernetes/frp/ 目录,docs1 知识库不再单独拷贝这些文件。


1. 整体架构

            公网用户
               │  http(s)/tcp
               ▼
   ┌──────────────────────────┐
   │   云服务器(公网 IP)      │  ← frps(服务端)
   │   xx.xx.xx.xx:7000       │     监听 7000 + 业务端口
   └──────────────┬───────────┘
                  │  反向长连接(由内网主动发起)
                  │  token 鉴权 + (可选)TLS
                  ▼
   ┌──────────────────────────┐
   │   内网 CubeStudio 节点   │  ← frpc(客户端)
   │   192.168.3.20           │     转发到 K8s 入口 / NodePort
   └──────────────────────────┘

要点:

  • frpc 由内网主动发起到 frps 的连接,所以内网无需任何公网入口;
  • 公网用户访问 云服务器:remote_port,流量被 frps → frpc → 内网真实服务转发;
  • 配置文件中所有 local_ip 都应指向 内网 CubeStudio 的 K8s 入口节点(一般是 nginx-ingress 所在节点 / NodePort 节点)。

2. 准备工作

2.1 选一台公网云服务器

  • 系统建议:Ubuntu 22.04+;
  • 安全组 / 防火墙:放通 frpc.ini 中所有 remote_port。其中 7000 用于 frpc 接入 frps,业务转发端口见下文第 4.2 节端口规划,按需放通。

2.2 下载 FRP 二进制(服务端、客户端各下载一次)

# amd64 服务器(GitHub)
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz

# arm64 服务器(GitHub)
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_arm64.tar.gz

# 国内镜像(GitHub 不通时使用)
# amd64
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/install/frp_0.51.3_linux_amd64.tar.gz
# arm64
wget https://cube-studio.oss-cn-hangzhou.aliyuncs.com/arm64/frp_0.51.3_linux_arm64.tar.gz

解压并放到 /root/frp/(启动脚本默认从这里读取):

tar -zxvf frp_0.51.3_linux_amd64.tar.gz
mv frp_0.51.3_linux_amd64 /root/frp

服务端只需要 frps + frps.ini,客户端只需要 frpc + frpc.ini。仓库提供两份示例配置(精简版 *.ini 与完整版 *_full.ini,以及 *.toml 新格式),直接放到 /root/frp/ 即可。


3. 在公网云服务器上部署 frps(服务端)

3.1 配置 frps.ini

[common]
bind_port = 7000
bind_addr = 0.0.0.0
token = uyennjdsahyeii677d8nedebgsdt263u   # 与 frpc.ini 必须保持一致,建议改成你自己的随机串

3.2 启动 frps

cd /root/frp
sh start-server.sh
# start-server.sh 内部:
# nohup /root/frp/frps -c /root/frp/frps.ini > runoob.log 2>&1 &
# (脚本先用 pgrep "frps" 判断进程是否已存在,避免重复拉起)

建议加到 crontab 做存活守护(脚本自身已经做了 pgrep 判断,重复执行不会拉起多个进程):

crontab -e
# 每 5 分钟检查一次,挂了自动拉起
*/5 * * * * sh /root/frp/start-server.sh > /dev/null 2>&1 &

3.3 放通安全组 / 防火墙

至少放通:

  • 7000/tcp:frpc 接入端口;
  • 业务侧所有 remote_port(见下一节端口规划)。

4. 在内网 CubeStudio 节点上部署 frpc(客户端)

4.1 修改 frpc.ini

需要按你自己的环境替换 3 个变量:

字段 含义 仓库示例值
server_addr 公网云服务器 IP / 域名 47.94.241.197(替换成你的公网 IP)
server_port frps.inibind_port 一致 7000
token frps.initoken 一致 uyennjdsahyeii677d8nedebgsdt263u
各 section 中的 local_ip 内网 CubeStudio 的 K8s 入口节点 IP(ingress 所在节点 / NodePort 节点) 192.168.3.20

4.2 端口规划(重要)

仓库的 frpc.ini 默认把 CubeStudio 的核心端口全部映射出去(以下与 install/kubernetes/frp/frpc.ini 实际内容一致):

section 用途 内网端口(local_port) 公网端口(remote_port) 说明
[web] Web 控制台 (HTTP) 80 8888 浏览器访问 http://公网IP:8888 即可登录 cube-studio
[https] Web 控制台 (HTTPS) 443 8443 启用 HTTPS 时使用
[web-0]~`[web-4]` 预留 Web 端口 1080~1084 同号 备用 / 自定义服务端口
[ssh] SSH 22 8022 远程登录入口节点(暴露需谨慎,见安全建议)
[range:notebook] Notebook 端口段 10001~10227(奇数) 同号 JupyterLab / VSCode-Server 实例端口,每个 notebook 占一个
[range:service] Service 端口段 30000~30226(偶数) 同号 K8s NodePort 服务端口段,模型服务 / 内部服务用
[range:inference] Inference 端口段 20000~20226(偶数) 同号 推理服务端口段
[range:rental] 租用 / 弹性服务端口段 40000~40226(偶数) 同号 资源租用类服务端口段

端口段并非连续,而是分两截:notebook 为 10001-10119 + 10201-10227(奇数);service / inference / rental 分别为 xx000-xx118 + xx200-xx226(偶数)。配置形如 [range:notebook],FRP 会一次性建立大量 TCP 隧道。如果你只用其中一部分,请删掉用不到的端口范围,减少云服务器负载与暴露面。

4.3 启动 frpc

cd /root/frp
sh start-client.sh
# start-client.sh 内部:
# nohup /root/frp/frpc -c /root/frp/frpc.ini > /runoob.log 2>&1 &
# (脚本先用 pgrep "frpc" 判断进程是否已存在,避免重复拉起)

同样建议加到 crontab 做存活守护:

crontab -e
*/5 * * * * sh /root/frp/start-client.sh > /dev/null 2>&1 &

5. 公网访问验证

完成上面步骤后,从公网任意客户端:

# 1) Web 控制台(默认账号 admin / admin)
curl -I http://公网ip:8888

6. 安全建议

公网穿透 = 把内网端口直接挂到互联网上,务必做这几件事

  1. 改默认 tokenfrps.ini / frpc.ini 里的 token 必须改成你自己的强随机串;
  2. 改 CubeStudio 默认密码:登录后第一时间修改 admin 默认口令;
  3. 最小化端口暴露:用不到的 [range:*] 段全部删掉,尽量不要开放到内网的 SSH(22 → 公网 8022);
  4. 加防火墙:在云服务器安全组里限制源 IP;
  5. 日志监控:关注 runoob.log,发现异常连接及时处置。

7. 常见问题

现象 排查方向
frpc 启动后 runoob.log 提示 login to server failed 检查 server_addr / server_port / token 是否与 frps 端一致;云服务器 7000 端口安全组是否放通
公网访问 :8888 超时 云服务器安全组没放通对应 remote_port;或者 local_ip 不是内网 ingress / NodePort 节点
公网访问 :8888 拿到 502 / 连接被重置 frpc 能连上 frps,但 local_ip:local_port 在内网不可达,去内网节点 curl 192.168.3.20:80 验证
Notebook 进得去但 WebSocket 断 FRP 0.51 默认支持 WS,确认浏览器侧端口与 CubeStudio 平台分配的 notebook 端口一致

8. 文件清单

文件 部署位置 作用
frps.ini / frps_full.ini / frps.toml 公网云服务器 frps 服务端配置(精简版 + 完整版 + toml 示例)
frpc.ini / frpc_full.ini / frpc.toml 内网入口节点 frpc 客户端配置(精简版 + 完整版 + toml 示例)
start-server.sh 公网云服务器 启动 frps 的守护脚本(带 pgrep 防止重复拉起)
start-client.sh 内网入口节点 启动 frpc 的守护脚本(带 pgrep 防止重复拉起)

以上文件均在仓库 install/kubernetes/frp/ 目录下。

最后更新 2026-07-04完整文档以官方仓库为准:GitHub Wiki