localtunnel架构

不知道你有没有想到过,当我们在家里使用 Raspberry Pi Atlas 构建起 Web Atlas 或者 K3s - 轻量级Kubernetes ( Kubernetes Atlas 轻量级实现 ),但是仅仅因为家用网络没有Internet公网IP地址,无法对外提供服务或演示。那么我们有什么方法能够把这个NAT内部网络服务输出到外界,实现一个个人的 私有云计算构建 呢?

对于我个人的云计算实践,我想实现:

  • 构建 边缘云计算构建 ,采用 K3s - 轻量级Kubernetes 实现一个边缘云计算,并且将个人的开发和部署架构向外提供服务

  • 所有的数据和架构都由自己掌握,不依赖于公有云服务商(仅使用公有云提供代理入口)

我的思路

我最初考虑是使用 Linux VPN :

localtunnel

实际上早在十几年前(2010年),有一个开源工具 progrium/localtunnel 巧妙地实现了long-lived TCP tunnel方式,将NAT局域网中地服务器输出到因特网上。并且,这个开源项目实现了多个语言版本:

  • prototype版本 2010年早期,采用Python Twisted实现整个系统

  • v1版本 2010年中期,采用OpenSS包装方式,客户端使用Ruby,服务端使用Python Twisted

  • v2版本 2011年到2013年,尝试项目化和服务化,客户端和服务器端使用Python gevent并解决了v1版本很多问题

  • v3版本 使用 Go Atlas 重写了客户端和服务器端

localtunnel 现在已经不再开发,但是这个开源项目继续影响着世界,还有其他人开发了 Node.js Atlas 版本 localtunnel.me ( 输出本地Node.js应用到Internet ),并且产生了商业化公司 ngrok.com 提供快速简便的方法将个人无公网IP的服务器输出到因特网上。

ngrok

ngrok.com 是最流行的tunnel服务公司,使用Go开发,提供不同平台架构的客户端,可以快速把本地服务通过它的站点向外输出:

  • 通过 ngrok.com 的一个随机子域名(如 3gf892ks.ngrok.com )

  • 价格大约和VPS或者租用小型虚拟机差不多。

ngrok DEVELOPMENT.md 提供了较为详细的原理说明

localtunnel原理

参考

  • progrium/localtunnel 最早实现的开源解决方案,提供了python,go语言实现,并且启发了其他语言实现以及商业模式的形成