最近家里的联通光猫的3poe拨号上网的用户名和密码都变更了,导致路由器拿不到公网,因此家里的网络瘫痪了小一段时间。本来我是觉得可能是刷openwrt的路由坏了,因为这个路由器虽然配置不错(指AX3000),但其实是我在咸鱼上50r+淘的运营商定制路由器。当时春节前一天,打10010电话叫师傅过来的时候刚开始师傅脾气很冲(指师傅想跟我无限制格斗),后面耐心和他说明情况后倒没什么,发现就是路由器的3poe账号密码变了,同步修改路由和光猫两边的上网方式(从3poe改成dhcp)就可以了。
由于家里的宽带本来也快到期了,续费时大概率还是哪家便宜选哪家,所以公网 IP 被收回对我来说几乎是注定的结果。只是这样一来,一个现实问题就摆在面前:如果不再拥有公网地址,我该如何在外网环境下访问家里的那台小服务器呢?
这台小服务器配置还不错,功耗也低,常年开着也不心疼电费,完全闲置实在可惜。既然公网直连这条路可能走不通(其实公网直连也有坏处,年前飞牛爆出的0day漏洞让几十万台裸奔机变成了肉鸡,即使我将默认5666端口转发到了1024,也未能幸免),那就只能另辟蹊径。于是,我开始在网上查阅各种资料,系统了解“异地组网”相关的技术方案,希望找到一种既稳定又省心的远程访问方式。
简单罗列一下的搜索到的远程访问方式:
- frps、frpc:这是一种比较常见的内网穿透方式,平时开发用的也多,常见于将本地需要高配置才能运行的服务穿透到公网服务器上给甲方访问。但是我们这里需要访问的端口不止一个,而且鉴于安全,直接开公网端口显然不适合,所以这种方式不适用。
- 基于WireGuard的方案:VPN的一种,其实很多路由器的互联Mesh也是一种WireGuard,网络这块深入的我了解不太多。
- WireGuard使用
- WireGuard 教程:WireGuard 的工作原理 - 知乎
- Tailscale + 使用云服务器自建中继Derper 的方案:
- Nebula
- WireGuard最大的问题,我是在回到学校后才发现的。这种
固定 UDP 端口、固定握手格式、包长度特征明显、协议特征稳定的协议很容易被识别为WireGuard流量,在学校实验室的内网环境下会出现无法使用WireGuard协议从TailScale客户端登录到TailScale官网/自建HeadScale的情况。伪装性上不如被VPN广泛采用的Vless、XUDP、Hysteria2和Torjan。(不过最近Torjan已经很少看见了,被时代抛弃了吗😭)。
- Zerotier
- 和TailScale一样的情况,无法在学校实验室的内网环境连接到Zerotier的Planet节点。
- Syncthing:这个是中心服务器无关的,但是只能部署文件的同步,适合拿来同步eagle。
最终,我选择的是 Tailscale + 云服务器自建 DERP 中继 的方案。
之所以做出这个选择,其实中间也经历了一些折腾。
一开始在学院实验室内网环境下使用 Tailscale 时,怎么都连不上,节点始终无法正常建立连接,折腾得我相当头大。但奇怪的是,在宿舍的学生内网环境下却可以正常使用。两个内网之间甚至还能互相 ping 通,甚至可以说本质上就是一个内网,可偏偏 Tailscale 就是在实验室环境下水土不服。
推测大概率是实验室网络的安全策略更严格,对 UDP 流量或打洞行为做了更细致的限制,而宿舍网络相对宽松。
后来我又尝试了自建 Headscale 作为控制服务器,但新的问题又出现了:最新版本的 Tailscale 客户端几乎强制要求通过 HTTPS(SSL)访问 Headscale 服务器。相关报错可以在 ProgramData/Local/Tailscale 的日志里清晰看到。
当时我是真的有点绷不住——原本只是想搭个轻量的控制器,结果还得额外折腾HTTPS。对于一个只是想打通内外网访问的人来说,复杂度明显开始上升。
不过,后来我发现了一个曲线救国的办法:先用手机热点连接到 Tailscale 官方控制服务器,完成 STUN 打洞,让节点之间建立直连;随后再切回实验室内网环境。神奇的是,只要洞已经打通,后续的直连流量并不会被实验室网络拦截,节点之间依然可以正常互访。
这下就简单了——既然已经能稳定打通,那就没必要继续深挖复杂部署了。与其在实验室网络环境里和各种策略,不如先在一个宽松环境下完成打洞,再切换回目标网络使用。于是我:直接采用官方控制服务器 + 自建 DERP 中继的组合,既保证稳定性,也保留一定程度的可控性。以后需要连接实验室网络时,先切手机流量打洞,再进内网,一切都简单得多。
参考 | 自建Derper服务器
- 关于自建Derper服务器中转:自建免备案防偷 Tailscale 国内中继(DERP)教程 - Sleepstars 的记录室
扩展 | 以后可以扩展实现的方案
- HeadScale配置Https:HeadScale如果配置好https应该也是能正常用的,只不过不想折腾了。
- TailScale早期客户端:TailScale早期的客户端可以直连http,不过tailscale早期版本在Github上只有Code没有Release安装包。在TailScale官网上找到的最早安装包也是在1.8.x,不支持http连接。