本地跑了个网页服务,想让外面的朋友临时看一眼,通常要么买内网穿透服务要么装专用工具,两样都要钱或至少要注册。一位法国资深网络工程师十月初发了篇博客,用服务器上现成的两件套拼出了完全自托管的方案,不需要新增任何软件,技术社区五十多分。我把原文与讨论区都过了一遍,整理成这篇教学向的梳理。
方案是什么
三样现成的东西拼起来,不需要装任何新软件。反向隧道让本机端口借道服务器暴露出去,端口传零让服务端自动分配临时端口,不需要预先约定。通配符域名解析把任意五位数字子域名都指向服务器,配合免费的自动化证书搞定加密。服务端网关用一条正则从子域名里提取端口号,把请求转发到对应本地端口。效果是执行一条命令后拿到一个带签名与过期时间的临时网址,发给别人就能访问你本机跑的服务,过期自动失效,全程零新增软件零额外费用,已经有服务器的人边际成本就是零。
安全设计比想象中讲究。临时端口的随机性不够强,作者额外用网关的签名链接模块做了带过期时间的一次性令牌,令牌以基本认证的用户名形式放进网址,有效期到了返回过期响应。网关层还剥离了认证头再转发,支持长连接升级。作者自己提醒了核心风险,持有密钥的人理论上能访问本机所有监听端口,等于在防火墙上开了个门,用完及时关。
社区怎么说
讨论区技术含量很高。有人提出用分布式直连技术替代,无需公网服务器无需端口转发,公共中继只做信令然后打洞建立端到端加密,被另一位用户一语点破这就是视频通话那套网络技术在基础设施领域的翻版。有人在做完全无需中间人的方案,认为市面上的组网工具让自托管名不副实,这个立场有它的拥趸。也有人质疑这方案既然要自建服务器还算不算纯粹自托管,回答是你已经有服务器就用你自己的,没服务器的人本来就不是这个方案的目标用户。一条被顶起来的评价很有代表性,这就是我需要但一直不知道存在的东西,我们已有这些技术,直接拼起来用就好,这句话其实也是对整个自托管社区精神的注脚。
怎么用
前提是一台有公网地址的服务器与一个域名,云上最便宜的实例就够。第一步把通配符域名解析到服务器,申请通配符证书,通配符证书的验证方式走域名解析记录而非文件。第二步在服务端网关加一条正则虚拟主机配置,从子域名抓端口转发,配置就几行。第三步在客户端的连接配置里加一段自动执行脚本,连接后自动打印带签名的临时网址,拿到网址发给要访问的人就行。作者把完整脚本与服务端配置开源在个人仓库里,照着抄即可,动手能力半小时以内。没有服务器的人这条路不适用,继续用免费层商用服务更现实。
注意事项
密钥持有者可访问本机任意监听端口,用完立刻断开连接,别当常驻工具。临时网址有时效但端口在连接期间活着,离开电脑前记得断。脚本的代码仓库没有明确许可证文件,商用场景注意授权。方案作者的原博客以署名相同方式共享许可发布,转载注明出处。
总结
用两件最 boring 的软件拼出了最实用的一次性隧道,文章写得细,代码全开源,自托管玩家的参考样本,读一遍就能把反向隧道、通配符证书、网关签名链接这三个知识点吃透。有服务器的人当天就能搭一套,没服务器的人读一遍也值,网络知识不亏。
来源
- 原文博客 https://vincent.bernat.ch/en/blog/2026-http-over-ssh
- 配套脚本 https://github.com/vincentbernat/nixops-take1/blob/master/tags/http-over-ssh.sh
- HN 讨论 https://news.ycombinator.com/item?id=49958569