DSH手机访问,Tailsacale + dsh-mobile插件
我想让手机在外面也能指挥家里那台 Mac 上的 dsh。不是远程桌面那种指挥,是打开手机,看到会话列表,发一句话,看它跑。
问题很快就来了:家里有公网 IP,但从外面连不进来。我查了一下自己的出口,是 175 开头的一个地址,看着就是可以直接拨回来的那种,实际上连不上——家里的路由器默认不接受入站连接,我没有给它做端口映射。而且这个地址是动态的,光猫重启、运营商续租都会变,把它写死进任何配置里,过几天就失效了。
真要顺着这条路走,得在路由器上开端口映射,再挂一个动态 DNS 服务,把会变的地址绑成一个固定名字。这条路是通的,我也认真考虑过,最后还是没走:把一个端口开到公网上,等于让互联网上所有扫描器都能来敲我的门,我不太能接受那种“谁都能访问”的状态。
AI建议我使用Tailscale。我没同意,后来证明我的想法是错的。这是因为我以前使用过Tailscale,那时候的经验限制了我。
我当年是这么干的
那时候我对 Tailscale 的理解就是一条 VPN。于是按它最标准的用法来:手机、VPS、家里的电脑,三台都装客户端。家里没有任何对外开放的入口,VPS 顺便当个落脚点。
但是在安卓上遇到了问题。系统只有一个 VPN 槽位。Tailscale 占了它,我手机上就上不了外网了——能连家里,是连 Google、连 GitHub 全都断。Tailscale 给了一条到内网的路,但它不负责帮你翻墙。
那怎么办?我当时的解法是把 VPS 设成TailScale的出口节点(exit node),让手机的流量先绕到 VPS,再从 VPS 出去。听起来很合理:反正 VPS 是国外的,顺便当个梯子用。
能用,但慢。慢到我宁愿不用。原因也不难想:流量先加密到 VPS,绕一圈再出去,而 VPS 本身是个小机器,线路也一般。这不是 Tailscale 的错,是我把两种完全不同的需求——“连回家里”和“上外网”——硬塞进了同一条隧道里。
后来干脆就不用了。因为Codex这种直接就能使用手机访问了。
这次才想明白:它不该是一条全局 VPN
这次是AI帮我自动配置的,它配置了一条单独的规则,只有特定的访问才会通过规则走Tailscale。这个是最近的代理应有都有能力,之前我使用的时候代理都还不支持TailScale,所以我使用的官方的客户端。
技术上靠的是 mihomo。它在 1.19.25 版本支持了 type: tailscale 的出站,意思是我可以在 Clash 配置里写一个 tailscale 类型的节点,跟机场节点并列排在一起。FlClash 仍然是手机上唯一的 VPN,翻墙流量照旧走机场,只有去家里那台 Mac 的流量才被这个节点接手。
两个需求分开了,谁也不挤谁。这才是这次的真正收获:不是“省下了一台 VPS”,而是发现 Tailscale 可以按规则用。我以前的用法是“开一条隧道接管全部流量”,现在的用法是“在某些地址上,多一条回家的路”。
配置起来就三段:一个 tailscale 类型的出站,一个 select 组,两条规则。多一条规则,多一条路,仅此而已。
不过它不随 FlClash 启动就开始连接。按官方文档的说法,任何类型的节点都只在第一次有流量命中时才建立连接,所以头几次访问超时是正常的,不是配错了。
让它以为我还站在家里
真正有意思的是最后一步,子网路由。
移动网关只监听 10.0.0.114:3443,自签证书也只签了这一个地址。如果让手机直接去访问 Tailscale 分给它的 100.x 地址,证书对不上,配对得重做一遍。
所以我没动网关,而是在 Mac 上宣告了一条 10.0.0.0/24 的路由,再到后台批准。这样一来,手机拨的还是 10.0.0.114,包却走的是 tailnet。它以为自己在家里。地址没变,证书没变,配对记录也没变。
这条路也是可逆的。哪天不想给整个网段开门,把宣告改成 10.0.0.114/32,后台重新勾一次,就只放开这一台。
到底是不是直连
装完我盯着连接状态看了两轮。
在家,Wi-Fi 开着,curAddr 是 10.0.0.6,手机在局域网里的地址。关掉 Wi-Fi 换成移动数据,同一个节点,curAddr 变成 175.x.x.x,运营商给我分的公网地址。
两行字,一个是局域网直连,一个是公网打洞直连,都不是中继。这一点很重要。当年那套三台机器的方案给我留下的印象就是“能连上,但慢”,慢的原因几乎都出在中继或者绕行上。真直连的话,延迟就是你两端网络的自然延迟,中间没有多一跳。
顺带澄清一个误会
我装完一开始以为,安全是靠那个自签证书保证的——手机上装了 CA 证书才能连上,听起来像是“装了证书才有权限”。这可能吗?不是。证书只干一件事:让手机相信这个 HTTPS 是这台电脑的,链路能加密、不被中间人冒充。它不负责授权。
真正拦人的是配对。网关对所有未配对的请求一律返回 401,配对码是 256 位随机串,只在电脑本机的回环接口上生成,两分钟过期,用过即废,还有频率限制,电脑那边存的也只是令牌的哈希。缺一个都不行:只有证书没有令牌,拿到地址的人就能控制你的电脑;只有令牌没有证书,令牌会被同一个网络里的人嗅探走。
所以这套东西的门禁其实是够的,这一点我很确定。但“认证够不够”和“我愿不愿意把这扇门放到公网上”是两件事。一台能执行 shell 的机器,长期挂在一个被全世界的扫描器反复敲打的端口后面,我睡得不安稳。Tailscale 这条路,公网上根本没有我开放的端口,也就没有这些事。
那 VPS 现在还要不要
按这次的用法,不需要了。它不再承担“让手机出网”的职责——那是机场节点的事;它也没成为中继,因为两端打洞成功,直接直连。
只有一种情况我会重新考虑:打洞失败,流量长期走 DERP 中继,而中继节点基本在国外,慢到没法用。那时候才值得起一台国内的小机器自建中继。到那一步,VPS 的角色是提速备件,不再是必需品。
总结
这几年我一直以为 Tailscale 是一条 VPN,包住所有流量。按那个理解搭出来的方案,必然要牺牲别的东西——要么牺牲手机的翻墙,要么牺牲速度,要么再加一台 VPS 去补。我当年选了加 VPS,然后被速度劝退。
这次真正想通的是:它可以是规则里的一条旁路。手机上还是那套代理,只有去家里那台 Mac 的地址,才拐上这条路。翻墙归翻墙,回家归回家,两件事本来就该分开走。
我没有租 VPS,也没有开端口映射。配置加起来不到二十行,全部收益就是:在外面打开手机,能看见家里那台 Mac 上的会话列表。
