Raymond's Notebook
日拱一卒无有尽,功不唐捐终入海
Ngrok.Space 简介
credit-card

一,什么是 ngrok
Ngrok 总的来说是一个反向代理工具,它创建从互联网到本地运行的Web服务的安全 tunnel,实现穿越防火墙的外网到内网的连接。
如果你本地启动了一个Web服务,想别人通过Internet从其他地方访问,那么使用 ngrok 做代理就可以轻松实现你的需求。
目前它主要还是开发人员的一个工具,更多是在开发阶段,用于调试第三方系统的API,Webhook调用等等;它可以实现的功能,归纳如下:

  • 穿越防火墙将内网的http服务暴露给互联网;
  • 穿越防火墙将内网的tcp服务暴露给互联网;该功能其实可以做ssh转发,这里有一篇文章有详细介绍,有了这个功能,你就可以在公司连上你家里的树莓派了,树莓派从此不再吃灰 :)
  • 检查通过 tunnel 传输的所有 http 请求和响应;
  • 重新发送通过 tunnel 传输的任何请求,可以用于测试 webhook;

二,重构ngrok项目的原因
Ngrok 最初是一个开源项目,后来因为商业化,项目不再维护,因此源代码整个组织结构存在很多问题,也不支持最新的 go mod ,对于项目后续升级带来诸多不便。由于早期作者并未细致考虑用户访问限制,因此用户访问授权和用户管理非常简陋,并没有具体实现。

三,做了那些改进和优化,新增了那些功能
基于这些问题,我做了如下改进和优化:

  • 使用Golang Project Layout重构项目结构(顺带说一句,目前该layout几乎是Golang项目结构的最佳实践了,如果正在写Golang项目,最好遵守该规则);
  • 通过 go mod 初始化这些模块并将 golang 升级到最新版本;
  • 创建用户系统并添加基于用户信息的服务器认证功能;
  • 添加一个新的自签名证书并创建一个新的 make 命令来自动生产相关文件;
  • 在Server端添加一个 Dockerfile 并让它可以在 docker 镜像中运行;
  • 创建一个新的 Makefile 来创建所有构建命令;
  • 修改客户端代码,添加一个gin web server,让用户自己决定是否默认启动一个客户端Server来提供静态网站服务;

四,接下来准备怎么做
可以说,该项目的可玩性还是很高的,比如你可以默认设置一个静态 web server,给那些不懂编程的人提供一个 host 在本机的静态网站,并且同时提供可在internet网上访问的地址,用户可以在世界任何地方,访问其他人电脑上的网站。 用户几乎0成本就拥有了一个自己的网站,他想关闭它时,只需要关闭自己的电脑即可。是不是很Cool?
不过,该项目还有很多不够完善的地方,我接下来准备慢慢完善它:

  • 优化用户授权系统;
  • 连接限流,可以精确到用户;
  • 可以对分配的域名做竞拍,用户可以申请更短的域名;
  • 。。。

五,开源的目的和意义
我优化了源代码,使得项目结构更加清晰,让搭建 ngrok 服务变得容易;提供了用户系统,让多用户使用便于管理;至此实际上为该项目商业化提供了支持,但是我仍然选择开源,主要就是为了回馈开源社区,因为在我的成长过程中,获得了开源社区太多的帮助,也许和很多大佬的项目比,还差的很远,但是希望我微小的一步,能够给社区增添一片色彩。

该项目重新优化后的源代码地址,可以点击这里 或者直接访问 ngrok.space