2016/5/14 技术探讨

什么是ngrok?我这么来形容吧,用过花生壳没?就是存在于各大路由器中的那个,是的,ngrok就是类似花生壳的玩意,他可以给我们提供类似花生壳动态DNS解析的功能(ngrok并不是动态DNS解析,而是反向代理功能),让我们可以通过一个预设的域名访问我们挂载在家里的电脑的网站或服务。

具体原理,我从网上找来了两个图:

他通过客户端ngrok和服务端ngrokd之间建立长连接通道,当来自公网的请求,请求我们预设的监听端口时,ngrokd将根据我们预设的转发规则(根据域名),自动转发到相应的ngrok中,ngrok响应的内容会回送到ngrokd,再由ngrokd响应给用户,完成整一套“请求-响应”过程。

好了,心动不如行动,我们现在就开始学习怎么搭建一个ngrok服务,具体的ngrok包各位读者可以通过以下途径获得:

  (1)、GITHUB中:https://github.com/inconshreveable/ngrok  (使用github版本的包还需要在服务器中安装git,安装过程中会出现多次的git fetch 操作)

  (2)、百度云中:http://pan.baidu.com/s/1eRGOCq2 [提取码:cc48](本教程将使用此包,此包已经将所有需要还原的组件还原好,服务器中无需再安装git了。SHA1: 03E381E7BD89B7ED7F2E90F6F1563E2F39B44687)

本教程使用的操作系统为CentOS,且假设让“ngrok.jhonge.net”作为供反向代理入口用的域名。


编译ngrok server:ngrokd

ngrok分为客户端(ngrok)和服务端(ngrokd)两个部分,我们先学习怎么搭建服务端(ngrokd)部分。

我们先在go中国中下载go的静态包,这里我们需要下载最新版本的go1.6.2和go1.4的两个版本。

然后连同我们的ngrok.tar.gz包一同上传到服务器中:

给我们的包解压并部署到/usr/local中

mkdir /usr/local/go
tar zxf go1.4.linux-amd64.tar.gz
mv go /usr/local/go/go1.4
tar zxf go1.6.2.linux-amd64.tar.gz
mv go /usr/local/go/go1.6.2
tar zxf ngrok.tar.gz
mv ngrok /usr/local/

切换到我们的ngrok目录,开始编译ngrokd,我们先要使用openssl生成证书(如果没有安装openssl,请先通过yum或其他途径进行安装) 

cd /usr/local/ngrok/
openssl genrsa
-out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.jhonge.net" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=ngrok.jhonge.net" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

这里需要注意的,各位读者请把第三行和第五行语句中的域名替换成您想要使用的实际域名,成功之后目录中会多出这几个文件

然后我们再把证书拷贝到asset目录中: 

\cp rootCA.pem assets/client/tls/ngrokroot.crt
\cp device.crt assets/server/tls/snakeoil.crt
\cp device.key assets/server/tls/snakeoil.key

 接着设置go的环境变量并开始编译ngrokd 

export PATH=$PATH:/usr/local/go/go1.6.2/bin/
export GOROOT=/usr/local/go/go1.6.2/
make release-server

如果各位读者是直接使用GITHUB上的那个版本,这里会还会出现多次的go fetch命令,分别从github和gopkg两个站中下载多份的依赖代码(下载失败概率很高)。

等他编辑完成后,在bin目录中将会出现ngrokd文件。

至此,ngrokd的编译已经完成。

 

编译ngrok client:ngrok

完成了ngrokd的编译后,我们开始编译ngrok。由于ngrok是客户端,因此我们可以分为三种平台来进行编译,他们分别是:linux、windows和unix。

先进行linux版本的编译,由于当前的go版本已经是linux版,因此我们在ngrok目录中进行编译:

cd /usr/local/ngrok/
make release-client

完成之后在bin目录会多出一个ngrok,此版本为Linux专用

接着,我们再编译一个windows版本的ngrok,由于当前的go版本是linux版,因此我们需要先切换到windows版。

cd /usr/local/go/go1.6.2/src/
export GOROOT_BOOTSTRAP=/usr/local/go/go1.4/
GOOS=windows GOARCH=amd64 ./make.bash

这时我们之前下载的go1.4就起作用了。同样的,完成编译后我们再进入到ngrok目录,做编译linux版本一样的操作:

cd /usr/local/ngrok/
GOOS=windows GOARCH=amd64 make release-client

完成之后,在bin中会出现一个新目录,里面包含了一个ngrok.exe

至于剩下的最后一个平台,我就不截图了,跟windows的一样:

cd /usr/local/go/go1.6.2/src/
export GOROOT_BOOTSTRAP=/usr/local/go/go1.4/
GOOS=darwin GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=darwin GOARCH=amd64 make release-client

这里最后在啰嗦一下,GODS表示编译的目标平台(linux、windows、darwin),GOARCH表示多少位系统(amd64、386),各位读者根据需要自己组合编译即可。

 

ngrok的使用方法

我们已经把ngrok和ngrokd都编译完成了,现在开始试水了。

我们先讲解ngrokd的使用,ngrokd作为server端,放在公网服务器上,使用以下的命令来启动它:

/usr/local/ngrok/bin/ngrokd -domain="ngrok.jhonge.net" -httpAddr=":8001" 

解析一下:-domain就是你之前生产证书用到的域名,-httpAddr是监听的端口,我这里监听了8001端口。

再把客户端拷贝到本地电脑中,在里面建一个“ngrok.cfg”的文件;

 

ngrok.cfg中填入: 

server_addr: "ngrok.jhonge.net:4443"
trust_host_root_certs: false

server_addr:反向代理的那个域名(跟证书一样),默认4443端口

trust_host_root_certs:是否使用证书(这里不使用啥安全协议,直接填了个false)

再然后通过命令启动它:

ngrok.exe -subdomain test -config=ngrok.cfg 80

这里最后解析一下,-subdomain就是最后一级域名了,当你填了xxx的时候,可以通过xxx.ngrok.jhonge.net:8001来进行访问,-config就是配置文件,不用多说,最后那个80是转发到本地的80端口。(还有一点注意的,shudomain不能填太长的域名,否则有几率会无法使用)。

然后我们访问“http://test.ngrok.jhonge.net:8001/”

成功转发进来!!!。


好了,啰哩八嗦的这篇教程就到这里了,剩下的就交给读者们自己体会好了。

  [ 反向代理 ]   [ ngrok ]
知识共享许可协议 本作品由小蝶惊鸿创作,采用知识共享署名 4.0 国际许可协议进行许可,转载时请保留本文署名及链接。