通过 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.ini 中 bind_port 一致 |
7000 |
token |
与 frps.ini 中 token 一致 |
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. 安全建议
公网穿透 = 把内网端口直接挂到互联网上,务必做这几件事:
- 改默认 token:
frps.ini/frpc.ini里的token必须改成你自己的强随机串; - 改 CubeStudio 默认密码:登录后第一时间修改
admin默认口令; - 最小化端口暴露:用不到的
[range:*]段全部删掉,尽量不要开放到内网的 SSH(22→ 公网8022); - 加防火墙:在云服务器安全组里限制源 IP;
- 日志监控:关注
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/目录下。