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 就行。它会自动:

  1. 建立 Cloudflare 临时隧道并抓到公网地址
  2. 用那个地址作为 ACCT_PUBLIC_URL 启动云账本(隧道模式)
  3. 验证公网可达,把手机访问地址打印出来
  [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 用手机验证

  1. 手机关掉 Wi-Fi,用移动数据
  2. 浏览器打开上面那个 https://xxx.trycloudflare.com
  3. 能登录、能记账 → ✅ 通了
  4. 测一下速度:切换页面、打开报表,感受是否可接受

3.5 验证安全配置

在电脑上执行:

# 应该 301 到 https
curl.exe -I http://127.0.0.1:51194

# 应该返回 200,且带安全响应头
curl.exe -I https://你的临时域名.trycloudflare.com

手机浏览器打开后,看地址栏是不是 https + 锁图标


四、Cloudflare 命名隧道(✅ 实测跑通)

快速隧道的地址每次重启都会变,只适合验证。命名隧道用自己的域名,是长期方案。
本项目已实测跑通,完整记录如下。

4.1 准备域名

  1. 在任意注册商买一个域名(本项目用的是 dlink.work,阿里云注册)
  2. 完成实名认证 —— 国内注册商必须做,否则域名不能解析
  3. 等注册局审核完成 —— 控制台状态从「注册局审核中」变成「正常」才会写入全球 DNS
    • 实测:从注册到 NS 首次可见,约 30~60 分钟
    • 期间阿里云会给你的注册邮箱发「实名认证成功」的邮件。邮件里提到的「备案」跟本项目无关
      (备案只针对服务器在中国大陆的情况;隧道方案的服务器在境外,不需要备案
  4. 把域名的 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.vbscloudflared --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 操作步骤

  1. 打开 https://hsk.oray.com/download 下载 Windows 客户端(认准 oray.com 域名)

  2. 注册 / 登录贝锐账号

  3. 客户端里添加映射:

    字段 填什么
    应用类型 HTTPS(HTTP 映射官方已下架,不要选 HTTP)
    内网主机 127.0.0.1
    内网端口 51194
    外网端口 443(固定,不可改)
  4. 保存后列表里会显示形如 https://xxxxx.vicp.fun 的外网地址

  5. 手机浏览器打开它 → 应看到 🔒 并进入登录页

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

  1. 原生华为浏览器打开网址(不需要卓易通、不需要 VPN)
  2. 登录后,菜单里选「添加到桌面」(部分版本叫「添加书签 → 桌面」)
  3. 桌面会多一个独立图标,点开即用

鸿蒙的 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.comA 记录返回畸形响应(PowerShell 里会看到 Bad DNS packet),
但 AAAA 和 SRV 查询都正常,公共 DNS 也全部正常解析。

两种解法(脚本里已经内置了第一种):

  1. 强制走 IPv4 —— 加 --edge-ip-version 4
    cloudflared tunnel --url http://127.0.0.1:51194 --edge-ip-version 4
    
  2. 把本机 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 官方也说明它仅供测试。

posted @ 2026-09-12 12:06  omig001  阅读(10)  评论(0)    收藏  举报