一个人的机房

自托管、造轮子,和关于软件的私人笔记

一条穿过防火墙的隧道

我常觉得,公网是一片喧闹的海,而家里、公司里那些藏在路由器背后的机器, 是一座座没有码头的孤岛。它们能望见海,能派船出去,却没有一个固定地址让别人靠岸。 我想做的,是在两座这样的孤岛之间,架一条别人看不见的桥。

难点从来不是「传数据」,而是「先接上」。两台机器都躲在 NAT 后面,谁也无法主动敲开对方的门。 通行的做法是在海中央立一根公网的桩——一个中继:孤岛主动向它连出去,把这条向外的连接 一直挂着不放;需要通信时,双方就借这根桩把消息转过去。听起来简单,真正磨人的是细节: 连接会毫无征兆地断,NAT 的映射会悄悄过期,运营商会掐掉太久没动静的空闲链路。

所以隧道里塞满了「维持生命」的琐碎逻辑。定时的心跳,让链路显得一直在用; 断线后的退避重连,别一股脑冲上去把中继压垮;给每个数据流编号、排队, 免得一个大文件把整条管子堵死,让别的请求全饿着。这些代码一点都不性感, 却是隧道能不能「一直在」的关键。

写网络程序教会我一件事:真正难的不是把包发出去,是让一条连接在漫长的时间里不死掉。

最有成就感的时刻特别安静。你在一头敲下一行命令,另一头——那台你物理上根本够不着、 地址都不知道的机器——毫无迟疑地回了话。中间隔着运营商、防火墙、几千公里的光纤, 可那个数据包就是稳稳地走到了。没有欢呼,只有终端里安静滚过的一行输出, 像隔着夜色,收到了远方一声「在的」。