内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

时间:2021-06-20 20:17:39

Ngrok为何物

  “ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。”这是百度百科上给Ngrok给出的定义。说俗点就是内网穿透,将自己电脑上的Web页面或API等穿透内网,发布到网络上。和国内有名的“花生壳”内网版相似。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

  调试API时,每次修改提交服务器会比较麻烦,而花生壳经常无缘无故丢我POST参数,稳定点的价格还不菲,无奈选择了Ngrok。但现在大陆地区,Ngrok的官方服务在非“*”的环境下,无法正常访问。好在Ngrok开源,可以下载编译后将服务端部署到自己的服务器上,比较便捷与稳定,同时由于Ngrok采用go语言开发,编译后可到对应的平台运行,具有跨平台的特性。由于需要生成openssl证书,所以接下去编译的演示基于mac os平台,liunx下基本是一模一样的,编译生成的exe程序基于win386运行。

需要准备什么

  1.一个域名  几级的无所谓,我解析了一个叫ngrok的二级域名给它,同时设置了这个二级域名下*.ngrok的泛解析。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】  2.一台主机  阿里云上或**云**云上的云主机都行。

  如果没有这两个,那就直接看文章最后吧。正好有一台没有用的云主机,搭建了一台自己的Ngrok服务器,可以分享给大家用于测试,但为了保证稳定,不可能分享很多,先到先得。

编译

  1.为mac安装go环境  这个简单,直接用homebrew安装,使用 ‘brew install go’一键安装,安装完后配置环境变量。

  2.在git下载Ngrok源码  懒得clone,直接去git上下载 https://github.com/inconshreveable/ngrok  下载完成后解压到工作目录。

  3.生成openssl证书  为了方便复制,先cd到刚刚的工作目录,运行下面的命令生成公钥私钥。

1
2
3
4
5
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.facebeek.cn" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=ngrok.facebeek.cn" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

  其中ngrok.facebeek.cn是我绑定的二级域名。务必替换成你自己的。

  生成完成后将对应的证书复制到assets文件夹下的对应目录,替换原有的证书。如不替换,域名与证书不一致,客户端与服务端是没法正常连接的。

1
2
3
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key

  4.修改log下的logger.go   go编译时会下载对应依赖项,如果依赖了code.google.com下的,你懂的。这里将ngrok/src/ngrok/log/logger.go中的第四行更改为“github.com/keepeye/log4go”,如果源码中已经是github的地址,那就不用更改了。

  5.编译服务端与客户端  由于go语言的特性,在编译时直接生成机器码,所以在运行过程中并不需要go的环境。在ngrok目录下,运行一下命令分别生成对应的客户端/服务端。

1
2
3
4
5
6
7
8
#win服务端
GOOS=windows GOARCH=386 make release-server
#win客户端
GOOS=windows GOARCH=386 make release-client
#linux服务端
GOOS=linux GOARCH=386 make release-server
#linux客户端
GOOS=linux GOARCH=386 make release-client

  生成完成后,在工作目录的bin文件夹下,产生对应的文件。以编译win平台为例,会产生“ngrok.exe”与“ngrokd.exe”这两个文件,前者客户端,后者需要运行在服务器上。

服务器端部署

  将ngrokd.exe复制到服务器上,偷懒写个bat

1
C:\ngrokd.exe -domain="ngrok.facebeek.cn" -httpAddr=":801" -httpsAddr=":802" -tunnelAddr=":4443"

  如上,将ngrokd.exe放至c盘根目录上,绑定的域名换成自己的域名,http使用801端口,https使用802端口,供客户端连接的管道端口设置为4443端口。

  运行bat,得到下图,说明运行正常。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

客户端连接

  将ngrok.exe复制至客户端,创建ngrok.cfg配置文件

1
2
server_addr: "ngrok.facebeek.cn:4443"
trust_host_root_certs: false

  将server_addr替换为对应的地址。

  偷懒再写个bat,其中指定配置文件,使用的域名前缀为test,映射本地的80端口。以我的配置为例,当用户访问test.ngrok.facebeek.cn域名时,将会显示本机80端口所显示的内容。

1
D:\ngrok\ngrok.exe -config=./ngrok.cfg -subdomain=test 80

  运行bat,得到下图,表示连接正常。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】  连接成功后,在浏览器中输入test.facebeek.cn:801,可以正常访问。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】  大体上Ngrok的服务已经可以开始使用了。

IIS的URL重写

  由于服务器上同时运行着IIS,故服务端Ngrok启动时无法使用80端口,所以在上面,我使用了801作为Ngrok服务器的http端口,但在上图中,我并没有在URL后添加801端口,因此在这里,我使用了IIS的代理功能。在调试开发微信等必须使用80端口的应用时,这一点很有必要。

  首先需要为IIS安装ARR,下载地址(http://www.iis.net/downloads/microsoft/application-request-routing)。

  安装完成后,开启ARR,如下图。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

  创建网站,绑定信息如下,由于IIS不支持*.XXX.XXX.cn这类格式,所以为了泛解析只能绑定*。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

  选择URL重写。

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

  添加规则,用正则表达式匹配URL,模式^(.*),表示匹配任意URL,在下方添加一条匹配条件,条件输入填写{HTTP_HOST},模式填写如下,表示后匹配“.ngrok.facebeek.cn”的域名。添加重写规则为http://{C:0}:801/{R:1}。如下图

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

内网穿透神器(ngrok)服务端部署【分享一台自己的ngrok服务器】【多平台】

  经过以上的操作,可以将80端口上的请求重写到801端口上,完成反向代理。

 最后分享台我部署好的Ngrok服务器

  未了保证原系统的稳定,暂时不分享新的Ngrok用户,见谅

 

转载请注明出处 huhuhuo的博客园

地址:http://www.cnblogs.com/linhan/p/5440790.html