从零搭建个人混合云:腾讯云 + 飞牛 NAS + OpenClaw 远程运维架构
本文记录我如何把「一台校园内网的飞牛 NAS」「一台腾讯云服务器」「本机 Windows」以及一个 AI Agent(OpenClaw)串成一套可远程运维的混合云架构。文中所有 IP、端口、账号、口令、Token、密钥均已做模糊处理,仅保留架构思路与关键命令。
写在前面
我手头的设备比较分散,需求却很统一:
- 飞牛 NAS(fnOS):放在学校内网,没有公网 IP,自带远程访问只支持浏览器 / 应用 / WebDAV,无法直接映射 SSH。
- 腾讯云轻量服务器:有公网 IP,跑着 1Panel 面板、Halo 博客、以及一个 AI Agent。
- 本机 Windows:日常开发机,同样在内网。
- OpenClaw:部署在腾讯云上的 AI Agent,希望它能反过来操作 NAS 和本机。
核心诉求就一句话:
让分散在三个网络里的设备能互相安全地访问和运维,并且让 AI Agent 也能参与进来。
一、整体架构
最终形成 两条反向 SSH 隧道 + 一条应用反代:
几个关键设计:
- 两条隧道都只绑定在 Docker 网桥
172.18.0.1上,仅容器内可达,绝不暴露公网。 - NAS 的 Web 界面通过
frps的 vhost HTTP 端口(:9002)对外,再由 1Panel 的 OpenResty 反向代理到nas.example.com。 - AI Agent(OpenClaw)通过容器内的
ssh别名分别连到 NAS 和本机,实现「对话式运维」。
二、SSH 密钥与身份隔离
一套好的远程运维架构,第一步是 把身份拆开、把密钥管好。
我在本机 D:\key\ 下统一存放密钥与文档:
D:\key\
├── ssh\
│ ├── fnos_ed25519 飞牛 admin 专用私钥
│ ├── github_ed25519 GitHub 私钥
│ └── tencent-agent_ed25519 腾讯云 agent 私钥
├── tunnel\
│ └── win-tunnel.bat 本机反向隧道维持脚本
└── docs\ 各类接入说明文档
账号设计原则是 「给人用的账号」和「给 Agent 用的账号」分开:
| 设备 | 管理账号 | Agent 账号 | 说明 |
|---|---|---|---|
| 腾讯云 | root(仅密钥) | agent(sudo + docker) | 操作可审计、可单独封禁 |
| 飞牛 NAS | root(复用主密钥) | admin(专用密钥) | 日常维护足够用 |
| 本机 Win | 管理员 | linxiang(普通用户) | Agent 拿不到系统级权限 |
为什么这么做? 一旦某个 Agent 出问题,只需在对应设备的
authorized_keys里删掉那一行公钥即可立即吊销,不影响其他设备。
三、飞牛 NAS 接入:反向隧道打通
飞牛在学校内网、没有公网 IP,最稳妥的办法是让 NAS 主动连出来,建立反向 SSH 隧道。
NAS 侧 用 systemd 服务 + autossh 做自启自愈:
飞牛 systemd 服务:fnos-tunnel.service(autossh 自愈)
专用密钥:/root/.ssh/fnos_tunnel_ed25519
腾讯云侧账号:fnos(受限用户,仅端口转发)
腾讯云侧 sshd 开启 GatewayPorts clientspecified,让隧道只绑定在 Docker 网桥地址上:
# 飞牛侧大致逻辑(autossh 维持)
autossh -M 0 -N \
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-R 172.18.0.1:2222:127.0.0.1:22 fnos@<云服务器>
这样,腾讯云容器里就能通过 172.18.0.1:2222 连到飞牛的 SSH。
NAS Web 界面的对外发布
NAS 的 Web 管理界面通过 frps 发布:飞牛侧跑 frpc,把 Web 端口映射到腾讯云的 frps(vhost HTTP 端口 :9002),再由 1Panel 的 OpenResty 反代到 nas.example.com,并配上 Let's Encrypt 证书实现 HTTPS。
⚠️ 踩坑提醒:1Panel 的「代理型网站」会把
location块放在站点的proxy/root.conf里,再通过include引入主配置。千万不要手动往主配置里再写一个location /,否则会触发duplicate location "/"导致 nginx 起不来。正确做法是让面板自己管理,或在proxy/root.conf里维护那唯一的location。
四、本机 Windows 接入:反向隧道 + 计划任务
让 AI Agent 能操作本机,同样用反向隧道;但 Windows 上没有 autossh,就用 计划任务 + 循环脚本 维持。
win-tunnel.bat 的核心逻辑:
:loop
"%SSH%" -o BatchMode=yes -o ExitOnForwardFailure=yes ^
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 ^
-N -R 172.18.0.1:2223:127.0.0.1:22 tencent-agent >> "%LOGFILE%" 2>&1
timeout /t 5 /nobreak >nul
goto loop
再用「任务计划程序」创建 OpenClaw-Win-Tunnel,登录时启动、断线自动重连。
腾讯云容器内配置别名:
Host win
HostName 172.18.0.1
Port 2223
User linxiang
IdentityFile /home/node/.ssh/win_ed25519
这样在 OpenClaw 对话里说一句「看看我电脑的磁盘占用」,Agent 就会在容器里执行 ssh win "...",命令实际在本机 Windows 上执行。
五、让 AI Agent 参与运维
OpenClaw 通过 1Panel 应用商店部署在腾讯云上,容器名形如 1Panel-openclaw-xxxx。给它在容器内配好 ssh_config.d/ 下的别名后,它就能:
ssh fnos "systemctl is-active fnos-tunnel.service"—— 检查飞牛隧道ssh win "hostname"—— 连本机- 用
openclaw status/channels list/devices list管理自己
安全上做了几件事:
- 显式信任插件(
plugins.allow),消除告警。 - 开启设备认证(依赖 HTTPS 安全上下文),批准自己的浏览器为 operator。
- 限制访问来源
allowedOrigins,并配置trustedProxies,避免「Proxy headers from untrusted address」。 - 网关 Token 与模型 API Key 单独存放在
.env,绝不外泄。
六、安全加固清单
远程运维架构最怕「方便了但也裸奔了」。这里是我做的几层防护:
- 隧道只绑内网网桥:
-R绑定172.18.0.1,公网扫描不到 NAS / 本机的 SSH。 - 最小权限:Agent 账号权限刚好够用(本机是普通用户),不滥给 root。
- 密钥分级:不同设备不同密钥,可单独吊销。
- 只开必要端口:云安全组只放行 80/443,网关端口仅通过反代访问。
- HTTPS + 自动续期:用 acme.sh + Let's Encrypt,配合 cron 自动续期。
七、经验总结
- 反向隧道是内网穿透的稳妥选择:设备主动外连,无需公网 IP,配合 autossh / 计划任务可实现自愈。
- 身份隔离比什么都重要:给 Agent 一个独立、可审计、可吊销的账号,比事后补救强得多。
- 配置交给面板管理:像 1Panel 这类面板有自己生成配置的规则,手动改容易冲突(
duplicate location就是典型)。理解它的模板结构后再动手。 - 文档即资产:把每台设备的接入方式、密钥位置、排障命令写成文档,后续接入新设备或排查问题时能省大量时间。
本文由个人实践整理,所有敏感信息已模糊处理。架构仅供参考,请根据自身环境调整。