Contents
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镜像可以设置了两个变量CERT和DOMAIN。
- DOMAIN:用于签发证书,必须有,根据应用地址命名原则设置,如ngrokd.t2.daoapp.io。或者先填任意地址,后面部署完成显示地址后,再修改变量重启。对于其他“不会重启”的Docker Hosting,只需要设置DOMAIN,无需设置CERT。
- CERT:用于下载证书。Ngrok客户端和服务端的编译需要域名相关证书文件,而DaoCloud的资源限制,需要定时重启,不能每次重启都生成新的证书,这样每次编译出来的Ngrok(d)都不一样,以此设置CERT,来下载事先签发好的证书相关文件,保证每次重启编译的Ngrok(d)都一样。
使用具体应用地址签发证书,貌似不能设置泛域名(*.t2.daoapp.io)或IP格式
12345openssl genrsa -out base.key 2048openssl req -new -x509 -nodes -key base.key -days 10000 -subj "/CN=app名.t2.daoapp.io" -out base.pemopenssl genrsa -out device.key 2048openssl req -new -key device.key -subj "/CN=app名.t2.daoapp.io" -out device.csropenssl x509 -req -in device.csr -CA base.pem -CAkey base.key -CAcreateserial -days 10000 -out device.crt
将生成的六个文件(base.key、base.key、device.key、device.key、device.csr和base.srl)打包成ZIP格式。
上传至能够直链下载的网站上,比如Github。最后获取CERT变量值,即六个证书压缩ZIP文件的直链下载地址。
1https://github.com/yulahuyed/docker-ngrok/raw/test/ngrokd.t2.daoapp.io.zip
设置完变量,就可以部署了。
查看外部连接
等部署状态变成running,就可以看到外部连接了。如果没有出现,可以更改一下端口,如端口范围从“外部服务”改成“全部”,使得应用重启,一般重启三次以内就能看到外部连接了。
获取客户端
在运行日志中,出现下面信息,说明Ngrok(d)已经编译完成,并且服务端Ngrokd正在运行。
1 |
(ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting: {"bytesIn.count":0,"bytesOut.count":0,"connMeter.count":0,"connMeter.m1":0,"httpTunnelMeter.count":0,"linux":0,"osx":0,"other":0,"tcpTunnelMeter.count":0,"tunnelMeter.count":0,"tunnelMeter.m1":0,"windows":0} |
部署完成后,默认Linux amd64客户端上传至https://transfer.sh。具体的下载地址可以在运行日志中看到。
如需其他系统客户端,可以进入应用详情页右上角–>打开控制台,进入容器内终端操作。
1 2 |
cd /ngrok/bin curl --upload-file /ngrok/bin/****/ngrok https://transfer.sh/ngrok |
使用curl将所需系统Ngrok客户端上传至https://transfer.sh,或其他网站。
使用
这里以Linux系统为例,讲解客户端的使用。
下载客户端
1 |
curl -o ngrok https://transfer.sh/TNk7r/ngrok |
授予运行权限
1 |
chmod +x ngrok |
新建配置文件
Ngrok 1.x只能通过配置文件指定远程端口。
将下列内容复制,保存成ng.cfg文件。
1 2 3 4 5 6 7 |
server_addr: "ngrokd.t2.daoapp.io:*****" trust_host_root_certs: false tunnels: test: remote_port: 3600 proto: tcp: 3600 |
- server_addr替换成自己创建应用的4443端口对应的外部连接端口。
- test为隧道名,自定义。
- remote_port表示远程端口,proto表示本地监听端口。
remote_port要设置成容器内Ngrokd监听的端口,也就是前面设置的3600、4500;而不是外部连接ngrokd.t2.daoapp.io:*****的*****端口。否则容器内Ngrokd会监听容器内的*****端口,而容器内的*****端口没有指向可用的外部连接端口,导致无法使用。
运行客户端
1 |
./ngrok -config=ng.cfg start test |
最后使用的是容器内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”中可见。
相当于:
1 |
curl -X POST "https://openapi.daocloud.io/v1/apps/<app_id>/actions/restart" -H "Authorization: <my token>" |
Tips:
- 使用Alpine系统编译出的Linux amd64客户端,Ubuntu中无法使用,会提示not found;