Deploy Ngrok Server with Docker On DaoCloud


ngrok is a reverse proxy that creates a secure tunnel from a public endpoint to a locally running web service. ngrok captures and analyzes all traffic over the tunnel for later inspection and replay.


Update:
2017.11.29 16:10 请使用其他Docker Hosting,过程差不多
尊敬的 DaoCloud 用户,如之前通知,我们将于2017年11月30日23点(明晚11点)进行套餐升级变更,届时公有云平台将暂停服务,现有两点通知,请知晓:
1.为避免对您的使用造成影响,请提前做好准备。
2.此次变更将停止对个人用户提供“云端测试环境”,包括:应用托管、服务集成和volume。请您提前备份导出重要数据和配置
如有疑问请通过右下角与我们客服取得联系,感谢您一直以来对DaoCloud的支持与理解。


简介

Ngrok是个不错的内网穿透工具,目前开源至1.71版本,2.x版本闭源商业化。这里使用开源的1.71版本创建一个Docker Image,b1nitp7iw/docker-ngrok,并以DaoCloud为例进行讲解。

DaoCloud

  • 邮箱注册;
  • 免费账户可以创建三个Docker实例;
  • 每个实例只能开一个HTTP链接或三个TCP/UDP外部随机端口,端口重启不会变化;
  • 24小时自动休眠,支持通过API重启、查看实例;
  • 传出速度限制至200K/s
  • 应用地址命名原则:app名.t2.daoapp.io,比如ngrokd.t2.daoapp.io

部署

前面已经写过一篇DaoCloud部署使用的文章,详情见:

Browser Emulation Using PhantomJS

因此,这里只描述主要部分,其他细节可以看上文。

设置端口


b1nitp7iw/docker-ngrok镜像默认开了五个端口,各自用途:

  • 80:HTTP访问;
  • 443:HTTPS访问;
  • 4443:验证端口,必有;
  • 3600,4500:备用端口,用于TCP/UDP连接;

用于DaoCloud的限制,部署的Ngrok Server不能HTTP(S)访问,只能用于TCP/UDP访问,因此这里将4443、3600、4500设置为TCP。访问方位可以是“外部服务”或“全部”。

设置变量


b1nitp7iw/docker-ngrok镜像可以设置了两个变量CERTDOMAIN

  • DOMAIN:用于签发证书,必须有,根据应用地址命名原则设置,如ngrokd.t2.daoapp.io。或者先填任意地址,后面部署完成显示地址后,再修改变量重启。对于其他“不会重启”的Docker Hosting,只需要设置DOMAIN,无需设置CERT
  • CERT:用于下载证书。Ngrok客户端和服务端的编译需要域名相关证书文件,而DaoCloud的资源限制,需要定时重启,不能每次重启都生成新的证书,这样每次编译出来的Ngrok(d)都不一样,以此设置CERT,来下载事先签发好的证书相关文件,保证每次重启编译的Ngrok(d)都一样。
    使用具体应用地址签发证书,貌似不能设置泛域名(*.t2.daoapp.io)或IP格式

    将生成的六个文件(base.key、base.key、device.key、device.key、device.csr和base.srl)打包成ZIP格式。

    上传至能够直链下载的网站上,比如Github。最后获取CERT变量值,即六个证书压缩ZIP文件的直链下载地址。

设置完变量,就可以部署了。

查看外部连接

等部署状态变成running,就可以看到外部连接了。如果没有出现,可以更改一下端口,如端口范围从“外部服务”改成“全部”,使得应用重启,一般重启三次以内就能看到外部连接了。

获取客户端

在运行日志中,出现下面信息,说明Ngrok(d)已经编译完成,并且服务端Ngrokd正在运行。


部署完成后,默认Linux amd64客户端上传至https://transfer.sh。具体的下载地址可以在运行日志中看到。
如需其他系统客户端,可以进入应用详情页右上角–>打开控制台,进入容器内终端操作。

使用curl将所需系统Ngrok客户端上传至https://transfer.sh,或其他网站。

使用

这里以Linux系统为例,讲解客户端的使用。

下载客户端

授予运行权限

新建配置文件

Ngrok 1.x只能通过配置文件指定远程端口。
将下列内容复制,保存成ng.cfg文件。

  • server_addr替换成自己创建应用的4443端口对应的外部连接端口。
  • test为隧道名,自定义。
  • remote_port表示远程端口,proto表示本地监听端口。

remote_port要设置成容器内Ngrokd监听的端口,也就是前面设置的3600、4500;而不是外部连接ngrokd.t2.daoapp.io:*****的*****端口。否则容器内Ngrokd会监听容器内的*****端口,而容器内的*****端口没有指向可用的外部连接端口,导致无法使用。


运行客户端


最后使用的是容器内Ngrokd监听的remote_port对应的外部连接端口,而非3600。

防睡眠

利用一些Cron online服务,定时(建议在休息时间01:00-07:00)通过API对DaoCloud应用进行重启操作,这里以https://www.easycron.com为例。
需要先知道app_id和token。app_id进入应用详情页后,浏览器地址栏就能看到;token在“用户中心–>API–>API Token”中可见。


相当于:

Tips:

  • 使用Alpine系统编译出的Linux amd64客户端,Ubuntu中无法使用,会提示not found;

Leave a Reply

Your email address will not be published. Required fields are marked *