deploy-option2-tunnel
方案 2 部署指南:内网穿透隧道(手机随处可用)
目标:不买服务器、不做备案,让手机在任何网络下都能通过一个 HTTPS 网址使用云账本。
手机端不需要安装任何客户端 —— 这对纯血鸿蒙(HarmonyOS NEXT)尤其重要。
一、架构
手机 / 任何设备
│ https://jz.你的域名.com
▼
┌─────────────────┐
│ 隧道服务商边缘节点 │ TLS 终止(真证书,自动续期)
└────────┬────────┘
│ 反向隧道(由你的电脑主动拨出,不需要公网 IP)
▼
┌─────────────────────────────────────┐
│ 你的电脑(家用宽带 / 热点后面) │
│ │
│ cloudflared ──► 127.0.0.1:51194 │
│ Node 云账本 │
│ └── SQLite │
└─────────────────────────────────────┘
关键点:隧道是电脑主动拨出的,所以不需要公网 IP、不需要路由器端口映射、不需要备案。
代价是电脑必须开着。
二、两条路怎么选
| Cloudflare Tunnel | 花生壳(免费版) | |
|---|---|---|
| 费用 | 免费 | 免费(付费版 1299 元/年起) |
| 带宽 | 不限 | 1 Mbps(约 128 KB/s) |
| 流量 | 不限 | 每月 1 GB |
| 并发 | 不限 | 5 个 |
| HTTPS | ✅ 自带真证书 | 需在控制台确认是否提供 |
| 域名 | 需要自己的域名(约 10~70 元/年)或临时域名 | 花生壳分配二级域名 |
| 国内速度 | 不稳定(社区称「国内最强减速器」) | 快、延迟平稳 |
| 掉线重连 | 自动 | 免费版需等 60 秒 |
关于流量:云账本流量极小——首屏约 300 KB,之后 Service Worker 缓存静态资源,
每次只产生几 KB 的 API 请求。按一天用 20 次估算,月流量约 30 MB,
远低于花生壳 1 GB 的限制。所以流量不是瓶颈,速度和 HTTPS 才是。
建议的推进顺序
① Cloudflare 快速隧道(零成本、零注册,5 分钟)→ 先测速度
│
├── 速度能接受 → 买个便宜域名,转成命名隧道(正式长期用)
│
└── 速度太差 → 改用花生壳免费版(但要确认 HTTPS)
三、第一步:5 分钟零成本验证
⚠️ 实测结论:快速隧道在当前网络下不可用
本项目最终没有采用 Cloudflare 方案,改用了花生壳(见第五节,已验证可用)。
下面是快速隧道的实测记录,留作参考,避免以后重复踩坑。在本机(中国移动出口)实测,Cloudflare 快速隧道(Quick Tunnel)拿到的
*.trycloudflare.com地址无法使用,证据链如下:
检查 结果 cloudflared 连上边缘并注册 ✅ Registered tunnel connection连通性预检 ✅ SUMMARY: Environment is healthy.trycloudflare.com主域解析✅ 正常 随机子域 xxx.trycloudflare.com解析❌ 本机 / 223.5.5.5 / 119.29.29.29 / 1.1.1.1 全部返回不存在 用 curl --resolve绕过 DNS 直连边缘❌ Cloudflare 返回 Error 1016 Origin DNS error Cloudflare 边缘 IP 的 TCP 连通性 ✅ 可达 也就是说:隧道本身连上了,但 Cloudflare 侧没有为这个临时域名建立可用的解析与路由。
去掉--edge-ip-version 4结果一样,不是参数问题。这不代表 Cloudflare 方案整体不可用 —— 命名隧道是另一套机制:
域名是你自己的,记录通过认证 API 显式写入你的 DNS 区(
cloudflared tunnel route dns),客户端解析的是你自己域名指向的标准
Cloudflare 地址,不依赖*.trycloudflare.com的临时供给。
但这一点必须在买了域名之后才能验证。因此建议的顺序是:先试花生壳(免费、国内、无需域名、可立刻验证);
若花生壳不提供 HTTPS,再花约 ¥10 买个域名走命名隧道。
3.0 最省事的方式:一键上线
双击 deploy\start-online.cmd 就行。它会自动:
- 建立 Cloudflare 临时隧道并抓到公网地址
- 用那个地址作为
ACCT_PUBLIC_URL启动云账本(隧道模式) - 验证公网可达,把手机访问地址打印出来
[1/3] 正在建立隧道(约 5~10 秒)...
地址: https://xxxx-xxxx-xxxx.trycloudflare.com
[2/3] 正在启动云账本(只监听本机,外部走隧道)...
已启动
[3/3] 正在验证公网可达性...
上线成功!
手机访问地址:https://xxxx-xxxx-xxxx.trycloudflare.com
窗口保持开着,按回车键即停止服务并退出。窗口弄丢了就用 deploy\stop-online.cmd。
注意:脚本里带了 UTF-8 BOM。Windows PowerShell 5.1 默认按 GBK 读
.ps1,
没有 BOM 的话中文会被解析坏掉。改动这个脚本后请保留 BOM。
下面 3.1 ~ 3.5 是手动分步的做法,想弄清每一步在做什么可以看。
3.1 安装 cloudflared
winget install Cloudflare.cloudflared
装完新开一个终端让 PATH 生效。验证:
cloudflared --version
3.2 以「隧道模式」启动云账本
双击 deploy\start-tunnel.cmd,它会带上正确的环境变量:
ACCT_HOST=127.0.0.1 只监听回环,外部无法直连绕过 HTTPS
ACCT_TRUST_PROXY=1 信任隧道传来的真实客户端 IP(限流才有意义)
ACCT_FORCE_HTTPS=1 http 一律 301 到 https(本机 localhost 自动放行)
ACCT_PUBLIC_URL=... 跳转目标,见下方说明
ACCT_HSTS=0 确认域名稳定后再改 1
ACCT_CORS_ORIGIN= 留空 = 同源,不发任何 CORS 头
⚠️ 记得把脚本里的
ACCT_PUBLIC_URL改成你实际的公网地址。
隧道和反向代理常常把Host头改写成127.0.0.1:51194,
若直接用请求头拼跳转地址,http://你的域名会跳到https://127.0.0.1这种打不开的地方。
用快速隧道时可以先填那个临时地址,转正式隧道后再改。
启动后自检应该不再提示「监听地址对外且未启用信任代理」。
3.3 建立临时隧道
另开一个窗口,双击 deploy\quick-tunnel.cmd,或手动运行:
cloudflared tunnel --url http://127.0.0.1:51194 --edge-ip-version 4
--edge-ip-version 4不是可选项。实测某些家用路由器 / 手机热点网关对
region1.v2.argotunnel.com的 A 记录返回畸形响应,不加这个参数会直接报
Couldn't resolve SRV record ... no such host退出。详见第八节。
输出里会有一行:
+--------------------------------------------------------------------------------------------+
| Your quick Tunnel has been created! Visit it at: |
| https://random-words-here.trycloudflare.com |
+--------------------------------------------------------------------------------------------+
3.4 用手机验证
- 手机关掉 Wi-Fi,用移动数据
- 浏览器打开上面那个
https://xxx.trycloudflare.com - 能登录、能记账 → ✅ 通了
- 测一下速度:切换页面、打开报表,感受是否可接受
3.5 验证安全配置
在电脑上执行:
# 应该 301 到 https
curl.exe -I http://127.0.0.1:51194
# 应该返回 200,且带安全响应头
curl.exe -I https://你的临时域名.trycloudflare.com
手机浏览器打开后,看地址栏是不是 https + 锁图标。
四、Cloudflare 命名隧道(✅ 实测跑通)
快速隧道的地址每次重启都会变,只适合验证。命名隧道用自己的域名,是长期方案。
本项目已实测跑通,完整记录如下。
4.1 准备域名
- 在任意注册商买一个域名(本项目用的是
dlink.work,阿里云注册) - 完成实名认证 —— 国内注册商必须做,否则域名不能解析
- 等注册局审核完成 —— 控制台状态从「注册局审核中」变成「正常」才会写入全球 DNS
- 实测:从注册到 NS 首次可见,约 30~60 分钟
- 期间阿里云会给你的注册邮箱发「实名认证成功」的邮件。邮件里提到的「备案」跟本项目无关
(备案只针对服务器在中国大陆的情况;隧道方案的服务器在境外,不需要备案)
- 把域名的 NS 改成 Cloudflare 的(不要留在注册商的 NS 上)
- Cloudflare → Add a domain → 输入域名 → 选 Free 套餐
- Cloudflare 会给你两个 NS,形如
heather.ns.cloudflare.com/renan.ns.cloudflare.com - 回注册商控制台 → 域名 → DNS 修改 → 替换成这两个
- 实测:改完后约 3 分钟在公共 DNS 上生效
4.2 创建命名隧道
cloudflared tunnel login # 浏览器授权,选中你的域名
cloudflared tunnel create yunzhangben # 记下输出的隧道 ID
cloudflared tunnel route dns yunzhangben jz.你的域名.com
⚠️ tunnel login 有三个坑(都踩过)
| 现象 | 原因 | 解决 |
|---|---|---|
一直提示 Please verify your email |
Cloudflare 账号邮箱没验证。注意:My Profile 页面不一定显眼地标出来,要看控制台最底部的红色横幅 |
点横幅重发验证邮件,点最新的那封(旧链接会过期) |
提示 Failed to write the certificate |
8~14 分钟的授权窗口内没操作完,cloudflared 进程退出后就没人接收证书了 | 重新 tunnel login,这一次立刻点完 |
授权页面显示域名为 Invalid nameservers |
NS 还没改 | 其实可以先授权,不阻塞;但域名要等 NS 生效才能用 |
授权成功的标志:
You have successfully logged in+~/.cloudflared/cert.pem出现。
4.3 写配置文件
%USERPROFILE%\.cloudflared\config.yml:
tunnel: <你的隧道ID>
credentials-file: C:\Users\<用户名>\.cloudflared\<你的隧道ID>.json
loglevel: info
no-autoupdate: true
ingress:
- hostname: jz.你的域名.com
service: http://127.0.0.1:51194
originRequest:
connectTimeout: 10s
- service: http_status:404
4.4 开机自启
本项目不用 cloudflared service install(要管理员权限),改用与云账本一致的
「启动文件夹 + VBS」方式:
deploy\install-autostart.cmd # 会同时装:云账本.lnk 和 云账本-隧道.lnk
时间线:deploy\run-tunnel-hidden.vbs → cloudflared --logfile data\tunnel.log tunnel run yunzhangben
⚠️ 踩过的坑:最初用
cmd /c "...cloudflared.exe" ... >> log 2>&1的写法,
完全静默失败(没进程、没日志)。原因是安装路径含括号
C:\Program Files (x86)\cloudflared\,会把cmd.exe的引号解析搞坏。
改用 cloudflared 自带的--logfile参数后就正常了 —— 不经过 shell 就没有这个问题。
4.5 实测结果(2026-09-12)
| 检查项 | 结果 |
|---|---|
| 证书 | ✅ CN=dlink.work,Let's Encrypt 签发,TLS 1.3,90 天自动续期 |
| HTTP | ✅ 200 |
| 安全响应头 | ✅ CSP / X-Frame-Options / Referrer-Policy 全部透传 |
| 延迟 | 1.0 ~ 1.2 秒 |
4.6 和花生壳对比
| 花生壳 | Cloudflare 命名隧道 | |
|---|---|---|
| 延迟 | 0.45 秒 🏆 | 1.1 秒 |
| 年成本 | ¥0.01(促销价) | ¥10(域名) |
| 到期风险 | ⚠️ 促销价,可能变 | ✅ 自己的域名,不受第三方摆布 |
| 域名 | 花生壳分配的 | ✅ 自己的 |
| 服务地 | 国内节点 | 境外节点 |
结论:两个都留着最划算。 花生壳当主力(快一倍),Cloudflare 当备用门
(花生壳哪天涨价或到期,直接切过去,手机改个书签就行)。两者互不影响,
都已配好开机自启。
五、方案 2 的实际落地:花生壳(✅ 已验证可用)
这是本项目实际跑通的方案。 下面是完整的实测记录,含踩过的坑。
5.1 实测结论
| 检查项 | 结果 |
|---|---|
| 公网 HTTPS 访问 | ✅ HTTP 200 |
| 延迟 | ✅ 0.27 ~ 0.5 秒(走国内阿里云节点) |
| 证书 | ✅ DigiCert / RapidSSL 签发 *.vicp.fun,严格校验通过 |
| TLS 版本 | ✅ 1.3 |
| 静态资源 | ✅ HTML / JS / CSS / manifest / sw.js / 图标 全部 200 |
| 安全响应头 | ✅ X-Frame-Options、CSP、Referrer-Policy 全部透传 |
| 手机浏览器 | ✅ 原生浏览器直接可用,可「添加到主屏幕」 |
比 Cloudflare 那条路快得多,而且国内解析稳定。
5.2 操作步骤
-
打开 https://hsk.oray.com/download 下载 Windows 客户端(认准
oray.com域名) -
注册 / 登录贝锐账号
-
客户端里添加映射:
字段 填什么 应用类型 HTTPS(HTTP 映射官方已下架,不要选 HTTP) 内网主机 127.0.0.1内网端口 51194外网端口 443(固定,不可改) -
保存后列表里会显示形如
https://xxxxx.vicp.fun的外网地址 -
手机浏览器打开它 → 应看到 🔒 并进入登录页
5.3 ⚠️ 最大的坑:HTTP/HTTPS 映射在体验版只有 2 小时试用期
官方客服原话:
花生壳内网穿透体验版没有限制使用时长,但有以下限制:
- 流量限制:每月 1 GB,用完后映射将无法访问
- HTTP/HTTPS 映射限制:体验版只有 2 个小时的试用期,试用期结束后
若需继续使用,需付费开通对应映射类型
这就是「隧道突然断掉」的真正原因,不是网络问题、不是配置错误。
到期时的表现:
- 手机报
net::ERR_EMPTY_RESPONSE(DNS 通、TLS 握手成功,但服务端不回数据) - 花生壳客户端里那条映射显示「网络映射已到期」
排查时第一件事就是看花生壳里的映射状态,不要从头查网络。
解决办法:购买「HTTP 映射服务」/「HTTPS 映射服务」(实测有 ¥0.01 的促销价),
这属于付费开通映射类型,而不是买时长。订单里「购买期限」显示为 -。
注意确认:这个 ¥0.01 到底是永久开通还是按年续费,建议直接问客服。
若是按年,记得设日历提醒;若之后被要求升级到 1299 元/年的标准版,则应改走
「域名 + 自建」方案。
不要买花生壳的标准版(1299 元/年,企业定位),对个人记账太贵。
流量够不够:实测首屏约 46 KB,之后 Service Worker 缓存静态资源,
日常只产生几 KB 的 API 请求。按每天开 20 次估算约 6 MB/月,
重度使用约 30 MB/月,而额度是 1024 MB/月 —— 用不到 3%。
5.4 关于应用侧的配置
保持默认(局域网模式)即可,不要切成反向代理模式。 原因:
- 不能开
ACCT_FORCE_HTTPS:花生壳在它那边终止 TLS,应用收到的是普通 HTTP。
如果应用强制跳转 https,会形成无限重定向。 - 不能开
ACCT_TRUST_PROXY:不确定花生壳是否清洗客户端自带的
X-Forwarded-For。若它不清洗而应用又信任,攻击者就能伪造 IP 绕过登录限流。
默认不信任是安全的。
副作用只有一个:审计日志里的客户端 IP 显示为 127.0.0.1(花生壳在本机转发)。
登录限流依然有效。
5.5 开机自启
三个东西都要在运行:花生壳客户端、云账本、电脑不关机。
花生壳客户端自带开机自启(装好后默认开启)。云账本用:
deploy\install-autostart.cmd 安装:登录 Windows 后自动隐藏启动
deploy\install-autostart.cmd -Uninstall 卸载
它只是在「启动」文件夹放一个快捷方式指向 deploy\run-hidden.vbs,
不需要管理员权限,也不装系统服务,删掉快捷方式即彻底还原。
后台运行时日志写在 data\server.log,连不上时先看它。
✅ 实测验证(2026-09-12)
一次真实重启验证通过:
| 时间 | 事件 |
|---|---|
| 04:36 | 电脑开机 |
| 07:00:56 | 花生壳客户端自动启动 |
| 07:01:34 | 云账本自动启动(node server/index.js,无窗口) |
| 07:01:59 | 日志出现用户操作 |
| 验证 | 公网连续 5 次 HTTP 200,0.31~0.41 秒 |
全程没有任何手动操作,重启后手机即可直接使用。
排查提示:花生壳的「诊断」页面有时会误报「内网连接失败」——
如果它恰好在客户端或应用重启的间隙运行,就会测到连接失败。
以手机实际能否打开为准;重新点一次诊断通常就正常了。
5.6 日常维护建议
| 项 | 建议 |
|---|---|
| 自动备份 | 默认只在应用启动时备份一次。若电脑长期不关机,建议到「设置 → 备份与恢复」开启按间隔自动备份 |
| 异地备份 | 定期在「设置」里下载一份数据库到手机或网盘 |
| 密码强度 | 地址已公网可达,务必用 12 位以上的强密码 |
| 映射到期 | 定期去花生壳看映射状态;手机打不开时先查这里 |
5.7 为什么不用 Cloudflare 方案
见本文件第三节的实测记录:快速隧道在当前网络下拿到的域名解析不通
(四个 DNS 全部返回不存在),绕过 DNS 直连边缘则返回 Error 1016。
再加上社区普遍反馈其在国内速度很差,本项目改走花生壳。
命名隧道(需自备域名)是另一套机制,理论上更可靠,但需要先买域名才能验证,
本项目未采用。
六、安全须知(重要)
把财务应用暴露到公网,这几条必须做到:
异地备份(可选但建议)
# 用 rclone 把备份目录同步到网盘(以 OneDrive 为例)
rclone sync "E:\Works\003deepseek\data\backups" onedrive:yzb-backup --max-age 30d
配合 Windows 计划任务每天跑一次。
七、手机端怎么用
零安装。 就是浏览器打开 https://你的域名:
华为 / 鸿蒙 NEXT
- 用原生华为浏览器打开网址(不需要卓易通、不需要 VPN)
- 登录后,菜单里选「添加到桌面」(部分版本叫「添加书签 → 桌面」)
- 桌面会多一个独立图标,点开即用
鸿蒙的 PWA 支持各家说法不一:有反馈说装到桌面后仍显示地址栏。
不影响使用,只是没那么「像 App」。HTTPS 到位的前提下,
离线记账队列是可用的(这个能力由应用自己实现,不依赖 Service Worker)。
安卓 / iPhone
- 安卓 Chrome:菜单 → 「安装应用」/「添加到主屏幕」
- iPhone Safari:分享 → 「添加到主屏幕」
装到桌面后是全屏运行、有独立图标、可离线记账。
八、常见问题
Q:cloudflared 报 Couldn't resolve SRV record region1.v2.argotunnel.com ... no such host 然后退出?
实测踩到过。不是被封,而是某些家用路由器 / 手机热点网关对
region1.v2.argotunnel.com 的 A 记录返回畸形响应(PowerShell 里会看到 Bad DNS packet),
但 AAAA 和 SRV 查询都正常,公共 DNS 也全部正常解析。
两种解法(脚本里已经内置了第一种):
- 强制走 IPv4 —— 加
--edge-ip-version 4:cloudflared tunnel --url http://127.0.0.1:51194 --edge-ip-version 4 - 把本机 DNS 改成公共解析(管理员 PowerShell,需要改回来时把
-ResetServerAddresses加上):Set-DnsClientServerAddress -InterfaceAlias "WLAN" -ServerAddresses 223.5.5.5,119.29.29.29
诊断命令:
Resolve-DnsName region1.v2.argotunnel.com -Type A # 看是否报 Bad DNS packet
Resolve-DnsName region1.v2.argotunnel.com -Server 223.5.5.5 # 公共 DNS 是否正常
隧道起来后 cloudflared 会打印一份连通性预检表,
SUMMARY: Environment is healthy. 就说明链路没问题。
Q:电脑关机了还能用吗?
不能。方案 2 依赖你的电脑在线。要 24 小时可用请走方案 3(云服务器)。
Q:地址栏显示不是 https 怎么办?
说明隧道没提供 TLS。检查是否用了 https:// 前缀;若隧道本身只支持 HTTP,
参考第五节的花生壳注意事项,或改回 Cloudflare。
Q:手机能打开首页但登录失败?
多半是 ACCT_TRUST_PROXY 没开——限流把隧道节点当成了同一个客户端。
确认是双击 start-tunnel.cmd 启动的,而不是旧的 start.cmd。
Q:局域网访问不了?
隧道模式把应用绑到了 127.0.0.1,局域网自然不通。两种模式二选一:
- 日常在家用 →
start.cmd(局域网模式) - 出门在外用 →
start-tunnel.cmd+ 隧道
Q:更新了代码,手机看到的还是旧的?
Service Worker 会缓存。手机浏览器里强制刷新,或在应用内改一下设置触发更新。
Q:临时域名能长期用吗?
不建议。trycloudflare.com 的地址每次重启都变,Cloudflare 官方也说明它仅供测试。
浙公网安备 33010602011771号