tuiceday
← 回到实测
LAB

手机遥控家里的 agent(实录)· Tailscale + serve + 回环小代理

可复现文本2026-10-14

手机遥控家里的 agent(实录)· Tailscale + serve + 回环小代理

链路
手机 Chrome → Tailscale(WireGuard) → tailscaled serve :443 → 127.0.0.1:19400 小代理 → 桌面版 GUI :19387
实测
蜂窝 IPv6 直连(非中继)· wss 握手 101 · 鉴权 RPC 200 · 重启后 serve 规则仍在
不需要
公网 IP / 端口映射 / DDNS / 反向隧道 / 手机 App / Termux
四个前提
有人登录 Windows · 宿主 GUI 在跑 · 19387 不漂移 · 别启动会抢 100.0.0.0/8 的 VPN 客户端
本次固定提示词(展开)
提示词是实验条件:换一套 prompt,同一个模型的产出可能完全不同。所以本栏把 prompt 和结果一起给。
短问答
用一句话解释什么是显存带宽。
三句话说明
用三句话说明为什么小模型在消费级显卡上更实用。
代码
用 Python 写一个函数,把秒数格式化成 1h2m3s 的形式。只要代码。
完整实录(展开)

① 最终形态

  • 链路:手机 Chrome → Tailscale(直连打不通时自动走 DERP 中继)→ 家里的 tailscaled → serve 把 tailnet 的 :443 反代到本机回环 → 127.0.0.1:19400 小代理(约 100 行 Node)→ 127.0.0.1:19387 桌面版 GUI。
  • 手机侧零配置:不输密码、不装 App、不装 Termux。那张签名 cookie 是本机代理替它带的,手机从头到尾没拿到过。
  • 路由器一根手指都不用动:不需要公网 IP、端口映射、DDNS、反向隧道;serve 默认只在 tailnet 内可见(不是 funnel)。

② 为什么"直接连"一定失败(三道闸)

  • 闸 1 · 宿主只绑回环:GUI 只听 127.0.0.1:19387,手机哪怕在同一局域网也连不上 → 必须有个"从回环往外转"的东西,tailscale serve 就是。
  • 闸 2 · /api 要一张绑定"授权域"的签名 cookie:实测不带 cookie 时连回环 Host 也照样 401;cookie 名 = base64url(sha256("<host:port>"))。用域名直连时服务端算出的授权域与地址栏对不上,现场签一张也照样被拒(实测 8 组组合全 401)→ 中间必须有代理,让上游始终看到回环授权域。
  • 闸 3 · 上游有意不给远程页面完整能力:非回环页面 → 设置持久化模式判成 memory,设置镜像一个请求都不发。这是设计不是 bug → 本文不绕它:手机上看会话、跑 agent,改设置回 PC 上改。

③ 工具与步骤

  • 只用两样:Tailscale(两端各一个客户端)+ Node(小代理,零依赖)。
  • 开反代:tailscale serve --bg --https=443 http://127.0.0.1:19400。关键在 --bg —— 规则写进 tailscaled 配置,重启电脑后自动恢复(实测重启后两条规则都在)。
  • 小代理三件事:① 把 Host / Origin 改写成回环 ② 从本机凭据库取密钥现签 cookie 带上(值不落日志)③ 转发 WebSocket 升级(实时输出是 wss 不是轮询)。只绑回环 —— 绑 0.0.0.0 等于把凭据送给整个局域网。
  • 自启:启动夹放 .lnk(目标 wscript.exe)→ 脚本要幂等、宿主没起来也照启动、写日志。

④ 三个坑(每个都附判据)

  • 裸脚本不执行:重启后代理没起、无报错、日志一行都没有。判据:日志一行都没有 = 根本没被执行;有行但失败 = 脚本内部问题。
  • VPN 的系统代理吞掉 tailnet:Clash 系客户端的 bypass 写死 localhost;127.*;192.168.*;10.*;172.16-31.*,不含 100.64.0.0/10 与 *.ts.net → 这台电脑上所有浏览器都访问不了 tailnet。判据:node(不走系统代理)200 / 浏览器 ERR_CONNECTION_CLOSED。
  • 会出事的是路由不是端口:"VPN 抢了 UDP 41641"实测不成立(41641 一直属于 tailscaled,手机 peer 是蜂窝 IPv6 直连);真正断线的是某些 VPN 抢 192.168.0.0/24 与 100.0.0.0/8。另外 Windows 版 Tailscale 没有官方改端口入口。

⑤ 怎么证明"真的可用"

  • 鉴权:POST /api/session/list → 200 才算过(401 = 没过)。
  • 实时:wss://<host>/api/remote.mux → 101 Switching Protocols。
  • 到位:tailscale status 里手机 peer online + active,看清是 direct 还是 relay。
  • 扛重启:重启后 serve status 两条规则在、代理日志有 started。

⑥ 边界与安全

  • 别用 tailscale funnel(那会暴露到公网);代理只绑回环;cookie 是 30 天长期凭据。
  • 手机端设置页不可用是上游有意设计,本文不去绕。
  • 宿主关机、或重启后没人登录 → 用户级启动项不会跑,做不到无人值守。
  • 实测数字:direct(蜂窝 IPv6)· wss 101 · RPC 200 · 第三条机器 tailnet 打开 HTTP 200 · 两条 serve --bg 规则重启后仍在。

完整版中英对照长文:打开 /note/

坑:启动夹里放裸 .vbs 不会被执行(按文件关联被"打开"而非运行,无报错、日志一行都没有)→ 必须放 .lnk 指向 wscript.exe;另外 Tailscale 的端口(UDP 41641)从头到尾没被 VPN 抢过,真正会断线的是路由。
来源:本机实录 2026-10-14,从手机端实测通过;完整长文见 tuiceday.cn/note/

本页是该条实测的独立页面;完整列表见 实测。