译:追忆当年的局域网文化

译者前言:这篇文章是 Tailscale 的另一个创始人 David Crawshaw 在 2020 年时发布的。他在 2019 至 2024 年间担任 CTO。
本文描述了原作者眼中 Tailscale 的设计动机:在现代互联网上,创建一个安全、易用的“虚拟局域网”,以此复原九十年代的局域网体验:受信任的网络环境,扁平联通的网络结构,以及随时能根据自己的需要写出有趣、实用的自用网络服务。
所谓局域网(LAN),并不是和后来找补的个人局域网(PAN)、园区网(CAN)、城域网(MAN)、区域网(RAN)此类空泛名词一样,仅指代网络的规模。 之前翻译的关于 IPv6 的博文也提到过,局域网和广域网其实是各自独立起源、技术传统迥异的两套技术。因为规模有限,当年百花齐放的各类局域网技术无一不是机制简单粗暴,突出一个 it works:没有地址分配,没有复杂的协议栈,没有路由,没有 NAT,没有防火墙;只要把机器全插上,就能让这些机器开始互相传输数据,甚至开始写一些有意思的网络应用了。两者最终合流了,成为了今天的互联网架构,顺便留下了很多令不了解这段历史的人匪夷所思的历史遗留)。
译者童年的经历可以说是和原作者反过来的,成长在极度敌意的网络环境下:QoS 丢包、路由黑洞、多层严格 NAT,层层设限,步步为难。印象中,小时候总是对网络有各种新奇想法,但是无一例外都因此停留于纸上谈兵,只剩下自己痛苦地思考为什么这头不通、那头不可见。正因如此,当译者后来用上了 Tailscale,用笔记本 Ping 通了蜂窝网络上的手机,那种激动至今记忆犹新……可以说,今天的 Tailscale 做到了当年的愿景,而且做得很不错。
一个回忆和一个梦想。
当年
我于 1990 年代开始接触编程,那时我还住在家里开的诊所楼上。我们当时有 15 台计算机用于办公,还有一台归我用。当时个人计算机操作系统的事实标准还是 MS-DOS。一开始,我们这里的网络是跑在同轴电缆上的 IPX 协议,连接着一台 Novel Netware 服务器——这大概是我们曾拥有过的最酷的软件。IPX 这个协议比起 TCP/IP 简直是无比的简洁:没有 DHCP,没有地址分配的各种破事儿,它就是能用。
最终这些机器开始跑 Windows,文件共享服务改为基于 TCP/IP,被迁移到了一台 Windows NT 服务器上。我们的办公软件也跟着被原样迁移到这个环境里来了,只是多了一些运维开销。IP 地址是我们手工分配的。
我家在澳大利亚北部的一个小镇。那个时候,互联网对我来说是一个遥远的概念,而且比起其他地方,我们这村通网也是很晚的事情了。即使等到真的通网了,为了上到网,我们也得先拨个长途,然后争分夺秒地冲个几分钟的浪(那个时候幸福的美国人有 AOL 😭)。
在能这样体验互联网之前,我们能接触到的只有一些乏味的本地 BBS。不过,有一次我爸搞到了一个当地大学的账号(奇妙的是,我们家没有人是那个大学的学生或者员工),我们可以拨号连到一台 SUN 主机上,这让我第一次体验到了使用 Unix。这样的使用体验很受限,但是这总归是一台连接了互联网的主机。我没能收到大学的技术文化的过多熏陶,以至于我直到九十年代中期才知道有 Linux 这么个东西——当时在一次香港之行中,我们买了一盒 Slackware Linux 的光盘。当时的我从未搞清楚 Unix 那套东西究竟在搞什么飞机,直到我开始用 OpenBSD 并积累了一定经验,我才搞明白 Unix 这个生态是怎么一回事。
在接下来的十多年里,我从未能在一台 SUN 机器上碰到 root 权限,直到 2000 年代早期,我从伯克利捡了一车 UltraSPARK 垃圾(12 台一共一百大洋,对于当时的我算是一笔巨款了)。我从捡来的垃圾里拼凑出一台能用的机器,在上面写了一个给 sparc64 架构的 C 编译器后端。
童年膜法
局域网真是一个适合折腾计算机的好地方。除了能亲手拆装机器,我能做一些在现代互联网上想都不敢想的操作:没有权限设置的文件共享,折腾没有任何安全加固的实验性服务端,能遇到一个非法指令就直接把整个网络创飞的灵车网络软件。不过,即使我真的把整个房子的网络都创飞了,造成的破坏也仅限于这栋房子内。我知道该找谁道歉。
(二十年后我在谷歌上班的时候,当我的一个配置错误的 MapReduce 把 Borg 控制面节点全扬了的时候,我甚至不知道该写邮件给谁道歉。)
在我们的小局域网里,简单的事情做起来总是很简单,难的事情也不是完全无法完成。我们有高级解释性语言,人机界面很简洁;也有吓人的低层语言,能搞出很多魔法,发挥机器的真正潜力。
在当时,200 MHz 的奔腾 Pro 用起来简直快如闪电,32 兆字节的内存简直充裕到无所不能。我用上 OpenBSD 之后,我可以在几分钟内重新构建我魔改过的 Apache httpd。我现在戴的手表能构建得比这更快,前提是我还在用 GCC 2.95。
后来,我会扛着电脑去朋友家。我们会组一个临时的局域网来打星际争霸什么的。(CRT 显示器是真的重……)
译者注:译者小时候也有类似的回忆,不过游戏打的是红色警戒2。他来了他来了他扛着交换机来了。还好彼时( 2010s)我不再需要扛 CRT 显示器,已经有 清晰绚烂无比 的方形液晶显示器可以用了。不过,那个时候 TCP/IP 和以太网的组合早已鲨穿一切对手成为大家认知里的唯一选择,所以我还迷惑了半天:这个要安装补丁才能用的 IPX 协议是个啥?
在那时候,局域网是一个绝佳的教具,也是一种生活方式。
小生意膜法
我爸,一个全科医生,给这堆便宜的 286、386、486 电脑(以及三台昂贵的激光打印机)写了个病理管理软件自用。我们的诊所里好多人都在用它,包括十多个医生、一个护士,以及一个前台员工。实际上,你已经可以用一个基于文件的数据库软件(这里他用的是 Clipper)和没鼠标的 curses 界面做很多事情了。
这里有几件事儿挺神奇的。作为一个工程师,看到这么一个用 NetWare 文件锁、以及后来的 SMB 文件锁做出来的灵车小软件,能足够稳定地支持大约十五人同时在线,着实令人惊叹。我甚至怀疑,在今天,绝大多数专业程序员从来没真用过文件系统锁,更别说见过它正确工作了。
更令人惊讶的是:一个仅仅看了点书的非专业人士,能仅用业余时间,写出一套支撑自己的生意运转的软件!
在今天,一个专业程序员当然可以迅速学会如何构建一个支持增删查改的应用。但是如果让他们继续针对业务进行优化,让那个前台员工给病人挂号少按几个键,或者为了提高效率加入刷磁条卡的功能,又或者去适配那几台激光打印机,让他们能精准地在专用处方笺上打印东西(这些打印机是吃 PostScript 的,但是当时 MS-DOS 提供了一个简单的适配层),就显得有些强人锁男了。
于是乎,这样的一个九十年代的小诊所,能以现在看来相对其规模少得惊人的员工人数,搞定自己的所有业务。我们自己的软件大幅度提高了医生们的办公效率,这是别处采购的软件永远望尘莫及的。
其实,我爸当业余程序员优化业务赚来的钱,比他当医生赚的还多。
译者注:自己写小软件,自己长期用,还能保持很好的可维护性、可扩展性和数据持久性,也是译者一直以来一个小小的愿望。译者希望软件能像各种日常物件一样在生活中无处不在,不仅仅是用别人以重量级平台提供出来的软件,而是自己能随时掌控整个软件的各处细节。虽然我们总是说现在软件无处不在,译者觉得现在这件事仍然处于发展不完全的状态。现在这个披着博客壳子、实际上想成为知识库和工具平台的网站,就是这个愿望的产物之一。
如今
如果把我的童年从九十年代穿越到今天,我能干的事会大大拓宽。我可以轻易地用 JavaScript 绘制高质量的 CG,不过很难说这会比我当时用 BASIC 玩的游戏里,那些像素化的橡胶和大猩猩更有意思。(译者注:原作者玩的应该是 Gorillas,作为示例程序和 QBasic 一起以源码方式分发。一看到 BASIC 译者还以为是 Apple II 时代的那种 BASIC 专用机环境,用户自己从杂志上把游戏抄下来运行……不过都九十年代了,那种东西的确已经过时了。)我可以给我的手机写应用。呃,至少理论上可以。实际上,儿时的我可能没有耐心去等一个缓慢的编译器——我现在都忍不了,现代应用的开发环境慢得让我胃疼,所以这大概是不可行的。
我可能不再有机会自己写一个玩具网站,把自己课内外的各种玩意儿放在上面,因为我可以用 Facebook。
和朋友们联机打游戏倒是便容易了。我们不再需要要么选择扛着机箱和显示器去朋友家,要么选择学习如何把 TCP/IP 调对。我才有些人会认为这是一个进步:更多的享受,更少的干货。
现在的技术当然是更好的,可用的资源当然是更丰富的。但是如果我穿越到当下这个时代长大,我到底会不会走上编程这条路都难说。学习如何安全地存储用户密码,或者给你的玩具网站添加 OAuth2,可一点都不好玩。(译者注:救世啊!)今天的很多变成工作,要么成了极度繁琐的苦差事儿,要么成了和互联网上游荡的怪物打攻守博弈。在现在这个信息技术极大发展的时代,你能做大oouz哦很多以前做不到的事情;但是若要开始做个有意思的项目,比起以前实在前摇太长、门槛太高了。以至于,最后大家经常就放弃了,转而去用某个体验不尽人意的 SaaS。
译者注:回想起,译者在部署自己第一个上公网的自用服务的时候,焦虑得整晚整晚睡不着觉。译者咨询了是运维专家的朋友,到底怎么才算是安全加固到位了?朋友说:永远没有到位这一说,计算机安全总是充满了 trade-off。攻守博弈永远在进行。
呃,那我爸呢?
在现在这个年头,一个像我爸一样的业余程序员,还能给自己的业务写软件么?它还能想以前局域网时代一样,把这个软件做得又安全又有生产力么?也许吧……如果他非常小心,而且坚持用着九十年代的老机器,把它们和互联网物理隔离。但是如果你想写个手机应用来处理这些医疗记录,那这绝对不是纯靠业余时间就能整出来的活。这甚至可能是不合法的,因为这几乎无法符合医疗隐私保护的相关法规。
如果在今天,当我爸面临这个造还是买的抉择,我猜他肯定会选择买。或者,更有可能发生的是,不能买,而只能订阅。这个小诊所肯定不能像以前那样高效运转了。
全世界的程序员们联手建立了这个充满魔法的、美妙的互联网。我们现在有免费的跨洋视频电话,还有免费的“微型”虚拟云服务器,虽然它们的内存和处理器性能能吊打我刚开始变成的时候,能买到的任何机器。(译者注:救世啊!Oracle Cloud Infrastructure 提供的免费 ARM 实例实在太超模了,什么叫永久免费的 4 核心 24 GB 内存实例???)
在这一切美好的技术进步中,似乎有什么东西悄然被遗失了。如果说在 1990 年代的局域网里编程像是在乡下打理一个小花园,那现代的网络编程就像是在市中心大马路正中央打理一个种植箱。所有人都可以来欣赏你的作品,但是与此同时,也有成千上万的路人对你的园艺作品说三道四,其中甚至有人会不小心把它搞坏,因为他们溜的狗没训好……
一个梦想
有时,时代变化中的几条脉络,会在某一刻恰好交织在一起,造就某种特别的东西。许多这样的东西,都转瞬即逝,不会再次出现;它们最好的归宿,也不过是被人记住。然而,这种在小型的可信网络里,无忧无虑编程的每秒体验,不必仅仅是个回忆。这并不是遥不可及的:只要做一些工作,我们可以重塑现代的技术,来重现这样的魔力。
我们可以找回类似九十年代局域网环境的体验,不仅如此,我们还能同时拥有二十一世纪现代互联网体验里,最好的部分。我们能建立一个安全空间,其中只有我们信任的人;在其中,我们可以自由地编程,不用担心来自一个拥有数十亿用户的庞大互联网的各种威胁。那些到处游荡攻击的恶人,会被良好的身份服务和密码学挡在门外。
广义上的虚拟网络技术其实一直存在:虚拟专用网(VPN)。一些新出现的协议让 VPN 更好用了:比如说 WireGuard,它能在节点之间建立高性能隧道,配置也很简单。如果能将 VPN 和现代的密码学身份结合起来,而且让它能在所有地方运行,那你就可以在你的二十一世纪的现代设备上,重现一个虚拟的、九十年代风格的局域网。这样,互联网就成为了笨管道;根据网络另一头的人的身份,你的端点设备自行决定是否和对方通信。
按照这样的思路,我们可以得到一个新的架构,它能工作在现代互联网上,但是又保持着九十年代局域网环境的简洁和美好:
- 利用现代互联网的身份基础设施(自己选一个 Identity Provider,诸如 Login with Google、Login with GitHub 等等)来做身份验证(AuthN),然后在 IP 层面做基于密码学的授权(AuthZ)。
- 密钥自动生成并轮换,无须用户干预
- 自动将用户身份映射到无法伪造的 IP 地址
- 在自己的虚拟网络上运行任何服务器,只有同样在这个网络上的人能访问
- 因为访问权限于一个你自己的小团体,所以你的个人数据受到了更好的保护
我们能做出这样一个系统。
第一,我们得验证这样的设计,真的能营造一个能简化编程的环境。这意味着我们需要把它做成产品,分发到用户手中,让用户对这个体验满意。这是我们 Tailscale 当前的重心:做一个好产品,让用户开心。
第二,我们需要制订并发布我们用来构建这个网状 overlay 网络的协议,这样它就能在任何需要的地方运行。
第三,我需要帮助那些,从未在一个安全的环境下,体验过简单、快乐的编程的新程序员,重新体会到,编程是一件开心的事儿。你可以建立这样的一个环境,然后集中注意力在发挥创意上。给朋友们写一个 Web 服务来用不应该仿佛是一场战斗。你不应该为了这个,花几天几夜的时间操心诸如 XSS 攻击或者缓冲区溢出什么的。你应该专注于在一个省心的环境里整点什么有意思的东西,而不是总是在担心它的安全问题。
我们将用一个基于网状网络的体系,在今天的互联网的基础上,重建九十年代的局域网体验(以及 BBS 和 MUD)。
译后记:窜稀更新系列第一篇。自从上次发布新文章已经过了一年多了,攒了好多东西但是一直没时间整理出来发布。这篇文章其实在 25 年末就翻译得差不多了,但是一直拖了快半年才整理好发出来,所以说现在连年更都没做到了(悲)。
虽然一篇文章也没更,但是 25 年秋天到现在 26 年年中是我折腾技术的东西相当频繁的一段时间:从家里的网络,到机房里从头建立的 k8s,再到自己重新写博客并跑通整个 CI/CD 流程,终于算是有些可以拿得出手的经验了,积攒了一些自信。大概是受之前经历“数字黑暗时代”留下的阴影的影响,我总是害怕这些我花时间折腾过的东西,会哪天因为不可抗力的因素而全部打水漂。所以我经常被焦虑驱使,把我做的这些事情,事无巨细地记录下来。希望能顺利找到时间把积攒下来的碎碎念整理成博客吧。
🔏 Jack Wang @ Santa Cruz, CA, PST 2026/05/08