从每次远程开发像在“赌运气”,到现在打开电脑就能用,中间就差一个 P2P。
我不知道有多少人和我一样,在刚开始远程开发时有过这样的体验:盯着屏幕,却感觉自己不是在工作,而是在等待——等 SSH 连上、等 VPN 稳定、等文件传完……等到最后大脑放空,甚至忘了刚才要做什么。
这篇文章不会深入讲解太多技术细节,但也不会完全回避技术——因为有些概念只有稍微理解一点,才能明白为什么 Tailscale 对我来说是一种真正的解脱,而不只是“又一个网络工具”。
以前怎么过的
我之前的远程开发环境大致是这样的:服务器放在家里,我在外面用笔记本通过 通过 SSH 连接处理工作。听起来很正常,对吧?理论上确实如此。
但现实是,SSH 能不能连上、连得快不快,完全取决于服务器那有没有一个稳定的公网 IP,以及公网带宽够不够用。
公网 IP 这个东西,如果你租的是家用宽带,那基本上就是运气游戏,今天有、明天可能就没了,甚至有的运营商根本不给你公网 IP。
为了解决这个问题,我还需要额外做一层端口映射,把家里内网里的那台机器,硬生生地“暴露”到公网上,然后我再从外面连进去。这套方法有用吗?有用。好用吗?不好用。
整个连接路径是:我在外面的电脑,出去打到公网,再从公网打进家中路由入口,然后才能到达家里那台服务器。每一跳都有延迟,每一跳都有可能出问题。遇上家宽抽风、IP 收回,你就只能坐在那里,对着一个光标在屏幕上慢慢闪烁,思考人生。
最难受的不是慢,而是那种“我不知道是哪个环节出了问题”的无力感。是我家的网不好?还是运营商在搓大招?还是服务器爆炸了?没有人告诉你,你只能挨个排查,通常排查完了,问题自己好了,你也不知道因为什么。
有一次,我花了四十分钟排查为什么 SSH 连不上,最后发现是服务器 SSH 端口炸掉了,导致根本连不上。这种事,你没有任何提前预警,也没有任何方法从外部感知到,就只能干等。
P2P 到底解决了什么问题
在聊 Tailscale 之前,我想先说一下 P2P 这个概念,因为这是 Tailscale 的核心,也是它和传统 VPN 最根本的区别。
传统 VPN 的工作方式,本质上是“中心化转发”。所有的流量都要先发到一个中心服务器,再由那个服务器转发给目标机器。这个中心服务器,就是整个网络的咽喉要道,也是性能瓶颈所在。你的数据包从你的电脑出发,先跑到中心服务器,再折回目标服务器,物理路径可能绕了大半个城市,甚至能更远。(想象一下:你住在北京,想给三公里外的朋友说句话,但必须先打电话到上海的踪迹,再让总机转接过去。)
P2P 的思路完全不同。它的目标是让两台机器直接“看见”彼此,然后点对点地通信,不需要绕道任何中间服务器。流量只在两端自己走,不多走一步。
这带来的好处是非常直接的:
第一是延迟。延迟这个东西,和数据包走过的物理距离有密切关系。P2P 之下,数据包走的是最短路径——如果你和目标机器在同一栋楼,数据包就真的只在这栋楼里转一圈,延迟看只有几毫秒。传统 VPN 里,同样两台机器,数据包可能要绕出去再绕回来,延迟轻松翻几倍。
第二是稳定性。传统 VPN 有单点故障的问题——中心服务器一旦挂了,所有人连接一起寄。P2P 网络里,每队连接是独立的,一个节点出问题,不影响其它节点之间的通信。
第三,也是我认为最重要的一点——你不再需要一个公网 IP 来做“靶子”。传统方案里,你必须把某台机器暴露在公网上才能从外部访问它。P2P 的连接建立方式不一样:两台机器先各自连接到一个协调服务器(只用来打招呼、交换连接信息),然后利用 NAT 穿透技术,在两台机器之间直接建立连接通道。协调服务器完成它的使命之后就退出了,真正的数据流量走的是直接路径。(这个过程有点像你们两个人都不知道对方电话,但通过共同的朋友交换了号码,之后就直接打给对方,朋友再也不需要参与了。)
其实,并没有什么真正的‘中心’。所谓的协议、服务器、网关,不过是人们为了安全感而制造的幻觉。既然所有的灵魂在 The Wired 里都是相连的,那么两台机器之间,本就不该存在距离。
并不是我在连接你,而是我们原本就从未分开过。
—— Present Day, Present Time. AHAHAHA!!
Tailscale 是什么,为什么是它
Tailscale 是一个基于 WireGuard 的组网工具。WireGuard 是近几年声名大噪的下一代 VPN 协议,以代码简洁、加密强、性能好著称。(它的代码量大概只有 OpenVPN 的五分之一,但并不是因为偷工减料,而只是单纯的设计上更专注、更现代。)
但 WireGuard 本身只是协议,配置起来也有门槛。你需要手动管理密钥、手动配置路由、手动处理各种情况。Tailscale 做的事情,就是把这些麻烦事包起来,给你一个开箱即用的体验:装上客户端、登录账号,设备就自动加入你的私有网络域了。
就这样。没有你需要手动配的东西。
更省心的是 Tailscale 免费版对个人用户相当慷慨——可以接入 100 台设备。(都够我这辈子我能买的所有设备了...)
子网路由:连上一台,访问一片
光能连上办公室那台主力机,其实还不够。很多时候,你在局域网里还有别的东西:NAS、打印机、内网服务器、路由器管理页面……这些东西本身不会装 Tailscale 客户端,但你又想从家里访问它们。
Tailscale 有个功能叫做子网路由(Subnet Router),专门解决这个问题。
简单说你在办公室那台装了 Tailscale 的机器上,开启子网路由功能,把它所在的局域网网段(比如 192.168.1.0/24)"广播"出去。这样一来,你在电脑就可以通过 Tailscale 网络,就可以直接访问家里局域网里的任何设备,就好像你就坐在家里一样。
体验差距如何
有些人会觉得,这不就是换了一个 VPN 工具么,能有多大区别?其实用了就会明白,它变得更方便了。用了 Tailscale 之后会踏实很多。不是因为网速变快了多少,而是因为连接变得稳定和可预期了——P2P 直连,延迟基本固定在一个低水平,不再随着外部公网的状态波动。不需要再赌今天的网络怎么样了。
这种改变是微妙的,但微妙的东西有时候影响最大。远程开发什么的,很容易被各种小摩擦打断——等待,重连,排查问题……每一次都是一种对注意力的消耗。把这些东西消除掉,不一定会让你开发变得有多快,但会让你更顺利,这是不一样的。
配置有多简单
网络工具这种东西,你可能会觉得:听起来不错,但配置起来一定很麻烦吧?
说实话,比我预想的简单很多很多。整个流程大概是这样:
去 Tailscale 官网注册账号,然后在每台需要联网的机器上安装客户端——Windows、macOS、Linux、iOS、Android 都有原生客户端(吐槽一下 Windows 的客户端真丑),Linux 也可以直接执行脚本安装。安装完了,用同一个账号登录,设备就自动出现在你的"网络"里了。
子网路由的配置稍微多一步。在局域网选一台你想要当主机的机器上启用子网路由功能,然后在 Tailscale 的管理面板里审批一下,完成。你的电脑就可以访问家里的整个局域网了。
没有需要你手动配的密钥,没有需要你搞定的端口转发,没有需要你维护的 VPN 服务器。不然我们为什么不去用 OpenVPN 呢?
它不是万能的,但它解决了核心的问题
Tailscale 并不是没有限制。P2P 直连依赖 NAT 穿透,而 NAT 穿透在某些网络环境下(比如双重 NAT、运营商级 NAT,或者企业级防火墙)可能不是那么顺畅。在这种情况下,Tailscale 会自动退回到中继模式,通过它的 DERP 服务器转发流量。这时的延迟会比直连高,高特别特别多,波动还特别大,几乎用不了。
另外,Tailscale 的协调服务器是托管在境外的,如果你的网络环境比较复杂,初次建立连接需要花上一点时间。(当然,如果你实在不放心,Tailscale 也有开源的自托管方案叫 Headscale,可以自己搭协调服务器,但那就超出这篇文章的范围了。)
但这些都是边缘情况。在大多数正常的家庭宽带和公司网络环境什么的,Tailscale 的 P2P 连接都能正常建立,延迟表现也相当稳定。
最后碎碎念
我不是一个热衷于折腾这种工具的人。我喜欢的是工具就安静地待在那里,做它该做的事,不打扰我。Tailscale 是目前为数不多让我觉得它做到了这一点的工具。
远程开发最大的隐性成本不是网速慢,而是不确定。你永远不确定今天的网络是好是坏,永远要把"万一连不上怎么办"纳入计划。Tailscale 它真正的价值所在就是把这种不确定性大幅降低了。
如果你现在还在像我以前用传统的 SSH + VPN 方案吃苦,或者觉得远程连接这件事理应如此麻烦——不妨试试 Tailscale。不需要花多长时间的。
然后你可能会像我一样,有一种奇怪的感觉:哇奥,原来远程办开发来可以是这样的,之前那些年到底怎么熬过来的。(大概就是那种终于换了一张好床垫之后,回想以前的床垫怎么睡的那种感觉。)