ngrok 可捕获和分析全部通道上的流量,便于后期分析和重放。node
这些看上去很麻烦,咱们更须要的是了解ngrok的用途。linux
“花生壳”是一款老牌的内网穿透软件,一年的内网版服务要两百多块钱,都快能够买一年垃圾点的VPS服务器了。而免费版的“花生壳”稳定性较差,隔三差五的不能访问,每月只有1G流量,之前作项目没少被坑。ngrok是一款免费开源的软件,稳定性极强,我曾作过测试,将ngrok客户端所在计算机的网络断开一阵子,再链接另外一个网络,ngrok很快会自动重连,几乎不受影响。nginx
ngrok能够作TCP端口转发,对于Linux能够将其映射到22端口进行SSH链接。Windows的远程桌面能够将其映射到3389端口来实现。同理,若是要作MySQL的远程链接,只需映射3306端口便可。git
微信公众平台二次开发时,服务器必需要能经过外网访问,并且必须是80接口。咱们通常会在本身的电脑上写代码,可是因为电信运营商将80端口屏蔽了,甚至不少人经过无线路由器上网,根本就没有公网ip。在这种状况下,咱们每次都要上传代码到服务器对微信公众平台进行接口调试,十分的不方便。而ngro能够将内网映射到一个公网地址,这样就完美的解决了咱们的问题。github
ngrok官方为咱们免费提供了一个服务器,咱们只须要下载ngrok客户端便可正常使用,可是后来官方的服务愈来愈慢,直到ngrok官网被彻底屏蔽。如今咱们已经没法使用ngrok官方的服务器了。因此,接下来咱们自行搭建属于本身的ngrok服务器,为本身提供方便快捷又稳定的服务,一劳永逸。golang
VPS:这里以阿里云ECS为例,操做系统为CentOS7(64位)。 域名:将一个域名或二级域名泛解析到VPS服务器上。例如将*.tunnel.mydomain.com解析到VPS的IP。要注意,此时还须要将tunnel.mydomain.com的A记录设置为VPS的IP。
#安装git yum install git #注意git版本应大于1.7.9.5
源码编译安装请参考:http://my.oschina.net/dingdayu/blog/657538web
下载并解压vim
#下载go1.4.2源码包 wget https://storage.googleapis.com/golang/go1.7.linux-amd64.tar.gz #解压到/usr/local/ tar -C /usr/local/ -zxf go1.7.linux-amd64.tar.gz
可从后面的连接中下载新的版本:https://golang.org/dl/windows
添加环境变量api
#打开/etc/profile #配置profile vim /etc/profile
在最后面添加:
#添加下面两行代码 export GOROOT=/usr/local/go export PATH=$GOROOT/bin:$PATH
保存并退出,而后编译/etc/profile文件,使以前的配置生效
#编译profile source /etc/profile
查看go环境是否配置成功
#查看go环境是否配置成功 #显示go version go1.4.2 linux/amd64则说明go环境配成功 # go version
#下载ngrok源码包 cd ~ git clone https://github.com/inconshreveable/ngrok.git cd ngrok/
ngrok须要一个域名做为base域名,ngrok会为客户端分配base域名的子域名。例如:ngrok的base域名为tunnel.mydomain.com,客户端便可被分配子域名test.tunnel.mydomain.com。
使用ngrok官方服务时,base域名是ngrok.com,而且使用默认的SSL证书。如今自建ngrok服务器,因此须要从新为本身的base域名生成证书。
#为base域名tunnel.mydomain.com生成证书 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=tunnel.mydomain.com" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=tunnel.mydomain.com" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
必定要注意对应的base域名
执行完上述命令,正常状况下,该目录会多出device.crt、device.csr、device.key、rootCA.key、rootCA.pem、rootCA.srl六个文件,用它们来替换默认的证书文件便可。默认的证书文件在“./assets/client/tls”和“./assets/server/tls/”目录中
#替换默认的证书文件 cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
ngrokd就是ngrok服务器端,默认编译为Linux的执行文件,咱们的VPS自己就是Linux的,因此直接make编译就好。
#编译ngrokd(服务器端) make release-server
显示下面的内容则表示编译成功:
GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata bin/go-bindata -nomemcopy -pkg=assets -tags=release \ -debug=false \ -o=src/ngrok/client/assets/assets_release.go \ assets/client/... bin/go-bindata -nomemcopy -pkg=assets -tags=release \ -debug=false \ -o=src/ngrok/server/assets/assets_release.go \ assets/server/... go get -tags 'release' -d -v ngrok/... github.com/inconshreveable/mousetrap (download) github.com/rcrowley/go-metrics (download) Fetching https://gopkg.in/inconshreveable/go-update.v0?go-get=1 Parsing meta tags from https://gopkg.in/inconshreveable/go-update.v0?go-get=1 (status code 200) get "gopkg.in/inconshreveable/go-update.v0": found meta tag main.metaImport{Prefix:"gopkg.in/inconshreveable/go-update.v0", VCS:"git", RepoRoot:"https://gopkg.in/inconshreveable/go-update.v0"} at https://gopkg.in/inconshreveable/go-update.v0?go-get=1 gopkg.in/inconshreveable/go-update.v0 (download) github.com/kardianos/osext (download) github.com/kr/binarydist (download) Fetching https://gopkg.in/inconshreveable/go-update.v0/check?go-get=1 Parsing meta tags from https://gopkg.in/inconshreveable/go-update.v0/check?go-get=1 (status code 200) get "gopkg.in/inconshreveable/go-update.v0/check": found meta tag main.metaImport{Prefix:"gopkg.in/inconshreveable/go-update.v0", VCS:"git", RepoRoot:"https://gopkg.in/inconshreveable/go-update.v0"} at https://gopkg.in/inconshreveable/go-update.v0/check?go-get=1 get "gopkg.in/inconshreveable/go-update.v0/check": verifying non-authoritative meta tag Fetching https://gopkg.in/inconshreveable/go-update.v0?go-get=1 Parsing meta tags from https://gopkg.in/inconshreveable/go-update.v0?go-get=1 (status code 200) Fetching https://gopkg.in/yaml.v1?go-get=1 Parsing meta tags from https://gopkg.in/yaml.v1?go-get=1 (status code 200) get "gopkg.in/yaml.v1": found meta tag main.metaImport{Prefix:"gopkg.in/yaml.v1", VCS:"git", RepoRoot:"https://gopkg.in/yaml.v1"} at https://gopkg.in/yaml.v1?go-get=1 gopkg.in/yaml.v1 (download) github.com/inconshreveable/go-vhost (download) github.com/alecthomas/log4go (download) github.com/nsf/termbox-go (download) github.com/mattn/go-runewidth (download) github.com/gorilla/websocket (download) go install -tags 'release' ngrok/main/ngrokd
咱们能够在./bin/目录中找到文件ngrokd。能够先运行测试一下。
#执行ngrokd # ./bin/ngrokd -domain="tunnel.mydomain.com" -httpAddr=":8080"
出现相似如下内容,则说明咱们的服务器端ngrokd正常运行了。
[23:18:27 CST 2016/08/23] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified [23:18:27 CST 2016/08/23] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:8080 [23:18:27 CST 2016/08/23] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443 [23:18:27 CST 2016/08/23] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443 [23:18:27 CST 2016/08/23] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
以后Ctrl+C退出ngrokd,继续来编译ngrok客户端。
编译linux客户端很简单,一条命令就搞定
#编译Linux客户端 make release-client
显示如下内容,没有任何报错的话,客户端ngrok就编译成功了,咱们在./bin/目录下就能够找到执行文件ngrok。
bin/go-bindata -nomemcopy -pkg=assets -tags=release \ -debug=false \ -o=src/ngrok/client/assets/assets_release.go \ assets/client/... bin/go-bindata -nomemcopy -pkg=assets -tags=release \ -debug=false \ -o=src/ngrok/server/assets/assets_release.go \ assets/server/... go get -tags 'release' -d -v ngrok/... go install -tags 'release' ngrok/main/ngrok
是,咱们如今须要在windows下运行ngrok客户端。因此,重点是咱们须要编译Windows版的ngrok客户端。那么咱们难道要安装WIndows版的go环境,在Windows下编译吗?那太麻烦了,不用这样。go开发环境为咱们提供了强大的跨平台交叉编译功能,在Linux下便可完成Windows版的编译。
#切到go的安装目录 cd /usr/local/go/src #给Go编译器加上交叉编译windows/amd64程序的功能 GOOS=windows GOARCH=amd64 ./make.bash
若是这里提示错误
./make.bash: eval: line 135: syntax error near unexpected token `('
有多是以前使用yum安装过go,经过命令yum remove go 卸载当前的go并按照本文的方法从新安装。
#切回到ngrok目录 cd - #执行以下命令编译Windows 64位客户端 GOOS=windows GOARCH=amd64 make release-client #以上GOARCH=amd64指的是编译为64位版本,如需32位改为GOARCH=386便可
没有错误的话,Windows客户端ngrok就编译成功了,咱们能够在./bin/windows_amd64/目录下找到执行文件ngrok.exe。将其下载到Windows上。
mac的编译命令
#切换到ngrok目录 cd -; #mac平台下的64位环境 GOOS=darwin GOARCH=amd64 make release-client
这个很简单,首先执行VPS上的服务器端ngrokd,这里的8080指的是服务器启用8080端口,就是说内网穿透后的域名为xxx.tunnel,mydomain.com:8080。若是在80端口未做他用的状况下,也可将8080端口改成80,这样更方便些。而若是咱们VPS的80端口被占用了,可是咱们还想用80端口做为服务端口,那么可使用nginx作一个xxx.tunnel.mydomain.com的反向代理。
#执行ngrokd ./bin/ngrokd -domain="tunnel.mydomain.com" -httpAddr=":8080"
在ngrok.exe所在目录下创建文件ngrok.cfg,用记事本等文本编辑器写入如下内容并保存。
#配置文件ngrok.cfg的内容 # server_addr: "ngrok.dingdayu.com:4443" trust_host_root_certs: false
以后打开Windows服务器,这里以80端口为例。打开命令提示符,切到ngrok.exe所在目录,并执行如下命令。
#启动ngrok客户端 #注意:若是不加参数-subdomain=test,将会随机自动分配子域名。 # ngrok -config=ngrok.cfg -subdomain=test 80
正常状况下,客户端上会显示如下内容,表示成功链接到服务器端。
#客户端ngrok正常执行显示的内容 ngrok (Ctrl+C to quit) Tunnel Status online Version 1.7/1.7 Forwarding http://ngrok.dingdayu.com:8080 -> 127.0.0.1:80 Forwarding https://ngrok.dingdayu.com:8080 -> 127.0.0.1:80 Web Interface 127.0.0.1:4040 # Conn 0 Avg Conn Time 0.00ms
打开浏览器,分别在地址栏中输入http://localhost和http://test.tunnel.mydomain.com:8080,若是后者正常显示而且和http://localhost显示的内容相同,则证实咱们已经成功了。
#这里以SSH链接Linux时的22端口为例 ./ngrok -proto=tcp 22
映射成功的话,会显示以下内容:
#客户端ngrok正常执行显示的内容 ngrok (Ctrl+C to quit) Tunnel Status online Version 1.7/1.7 Forwarding tcp://ngrok.dingdayu.com:49805 -> 127.0.0.1:22 Web Interface 127.0.0.1:4040 # Conn 0 Avg Conn Time 0.00ms
如今,在putty等ssh工具中便可链接tunnel.mydomain.com。切记端口是号49805,是随机分配的一个端口号,而不是默认的22端口了。
Windows的远程桌面能够将其映射到3389端口来实现。同理,若是要作MySQL的远程链接,只需映射3306端口便可。FTP可映射21端口。
经过以上操做,咱们的ngrok服务器就已经成功搭建了,客户端也成功的跑了起来。可是,若是咱们想要对ngrok进行一些定制和优化,能够参考这些后续定制及优化的方法。
客户端每次还须要加载配置文件,这样显得有些麻烦。能不能像官方服务那样直接执行命令ngrok 80就能使用呢?咱们只须要在编译客户端以前,稍做修改便可。一样,若是须要指定域名能够执行命令ngrok -subdomain=test 80来运行客户端。
#修改默认服务地址 vim ./src/ngrok/client/model.go
#找到第23行,将 defaultServerAddr = "ngrokd.ngrok.com:443" #修改成defaultServerAddr = "ngrok.dingdayu.com:4443" 便可
运行客户端后,咱们会发如今客户端左上角会有一个蓝色字体的“ngrok”字样的文字logo,若是以为不太喜欢,或者想修改一下的话,能够在编译客户端以前,做以下修改。
#修改客户端蓝色文字logo Vim ./src/ngrok/client/views/term/view.go
找到第100行,将
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")
修改成
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")
ngrok客户端默认的帮助信息不多,咱们能够在编译客户端以前,本身定制帮助内容。
#修改客户端默认帮助信息 vim ./src/ngrok/client/client/cli.go
找到第14行,修改const usage2 string的值便可。
编译好的Windows客户端ngrok.exe大小为10MB,有点大,这样加载到内存中,须要读取硬盘的内容也相对较多,影响速度。因此,咱们还能够给客户端程序加个压缩壳,对程序进行压缩。