文档章节

Ngrok搭建服务器

dingdayu
 dingdayu
发布于 2016/08/23 23:46
字数 3158
阅读 8721
收藏 15

一、ngrok简介及作用

ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。

这些看上去很麻烦,我们更需要的是了解ngrok的用途。

  • 完美代替“花生壳”软件。

“花生壳”是一款老牌的内网穿透软件,一年的内网版服务要两百多块钱,都快可以买一年垃圾点的VPS服务器了。而免费版的“花生壳”稳定性较差,隔三差五的不能访问,每个月只有1G流量,以前做项目没少被坑。ngrok是一款免费开源的软件,稳定性极强,我曾做过测试,将ngrok客户端所在计算机的网络断开一阵子,再连接另一个网络,ngrok很快会自动重连,几乎不受影响。

  • 用于对处在内网环境中,无外网IP的计算机的远程连接。

ngrok可以做TCP端口转发,对于Linux可以将其映射到22端口进行SSH连接。Windows的远程桌面可以将其映射到3389端口来实现。同理,如果要做MySQL的远程连接,只需映射3306端口即可。

  • 用作临时搭建网站并分配二级域名,可用作微信二次开发的本地调试。

微信公众平台二次开发时,服务器必须要能通过外网访问,而且必须是80接口。我们一般会在自己的电脑上写代码,但是由于电信运营商将80端口屏蔽了,甚至很多人通过无线路由器上网,根本就没有公网ip。在这种情况下,我们每次都要上传代码到服务器对微信公众平台进行接口调试,十分的不方便。而ngro可以将内网映射到一个公网地址,这样就完美的解决了我们的问题。

ngrok官方为我们免费提供了一个服务器,我们只需要下载ngrok客户端即可正常使用,但是后来官方的服务越来越慢,直到ngrok官网被完全屏蔽。现在我们已经无法使用ngrok官方的服务器了。所以,接下来我们自行搭建属于自己的ngrok服务器,为自己提供方便快捷又稳定的服务,一劳永逸。

二、环境准备

VPS:这里以阿里云ECS为例,操作系统为CentOS7(64位)。
域名:将一个域名或二级域名泛解析到VPS服务器上。例如将*.tunnel.mydomain.com解析到VPS的IP。要注意,此时还需要将tunnel.mydomain.com的A记录设置为VPS的IP。

1、安装git

#安装git
yum install git
#注意git版本应大于1.7.9.5

源码编译安装请参考:http://my.oschina.net/dingdayu/blog/657538

2、配置go环境

下载并解压

#下载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/

添加环境变量

#打开/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

1、下载Ngrok源码包

#下载ngrok源码包
cd ~
git clone https://github.com/inconshreveable/ngrok.git
cd ngrok/

2、为Base域名生成自签名证书

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

查看截图

四、开始编译ngrok

1、编译服务器端ngrokd

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客户端。

2、编译客户端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

五、运行并测试

1、启动服务器端ngrokd

这个很简单,首先执行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"

2、写客户端配置文件

在ngrok.exe所在目录下建立文件ngrok.cfg,用记事本等文本编辑器写入以下内容并保存。

#配置文件ngrok.cfg的内容
#
server_addr: "ngrok.dingdayu.com:4443"
trust_host_root_certs: false

3、映射HTTP

之后打开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显示的内容相同,则证明我们已经成功了。

4、映射TCP

#这里以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进行一些定制和优化,可以参考这些后续定制及优化的方法。

1、修改客户端ngrok默认服务地址

客户端每次还需要加载配置文件,这样显得有些麻烦。能不能像官方服务那样直接执行命令ngrok 80就能使用呢?我们只需要在编译客户端之前,稍作修改即可。同样,如果需要指定域名可以执行命令ngrok -subdomain=test 80来运行客户端。

#修改默认服务地址
vim ./src/ngrok/client/model.go
#找到第23行,将
defaultServerAddr = "ngrokd.ngrok.com:443"
#修改为defaultServerAddr = "ngrok.dingdayu.com:4443" 即可

2、修改客户端ngrok左上角蓝色文字logo

运行客户端后,我们会发现在客户端左上角会有一个蓝色字体的“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")

3、修改客户端帮助信息

ngrok客户端默认的帮助信息很少,我们可以在编译客户端之前,自己定制帮助内容。

#修改客户端默认帮助信息
vim ./src/ngrok/client/client/cli.go

找到第14行,修改const usage2 string的值即可。

4、客户端程序加壳优化

编译好的Windows客户端ngrok.exe大小为10MB,有点大,这样加载到内存中,需要读取硬盘的内容也相对较多,影响速度。所以,我们还可以给客户端程序加个压缩壳,对程序进行压缩。

© 著作权归作者所有

dingdayu

dingdayu

粉丝 34
博文 119
码字总数 59439
作品 3
海淀
后端工程师
私信 提问
加载中

评论(10)

dingdayu
dingdayu

引用来自“sany-1”的评论

[2018/07/16 18:49:48 CST] [EROR] (ngrok/log.Error:120) control recovering from failure dial tcp 123.207.20.104:8083: getsockopt: connection timed out
没连上代理服务器连接超时
检查下是否端口被占用,或者更换个端口试试。

现在类似的开源软件已有国产,而且这款软件已旧不维护,可以试试国内的,一直有维护。
sany-1
sany-1
[2018/07/16 18:49:48 CST] [EROR] (ngrok/log.Error:120) control recovering from failure dial tcp 123.207.20.104:8083: getsockopt: connection timed out
没连上代理服务器连接超时
sany-1
sany-1
[2018/07/16 18:49:48 CST] [EROR] (ngrok/log.Error:120) control recovering from failure dial tcp 123.207.20.104:8083: getsockopt: connection timed out
z
zhubin0709
我在虚拟机上安装了centos7系统作为服务器,ngrok也照着博客安装,ngrok服务器端启动成功,也能生成windows客服端,但是客服端总是报:control recovering from failure dial tcp: GetAddrInfoW: This is usually a temporary error during hostname resolution and means that the local server did not receive a response from an authoritative server.
这种错,找了好多方法还是不能解决,求达
dingdayu
dingdayu

引用来自“晏霆”的评论

windows、Linux都可以搭建ngrok服务器。访问http://www.hongzaosoft.cn/downloadngrok.html(复制到浏览器中访问) ,云计算快速编译,就可以直接下载绿色免安装的ngrok程序,带安全证书验证,包括服务器端和客户端,启动脚本,配置文件。

类似的软件国内已经有相关的开源了,我也玩了一段golang,win和linux也就一条命令生成而已,脚本是固定的,证书文中也有生成方法,虽然你这收费不高,不过开源软件,这样做不是太好吧?
dingdayu
dingdayu
类似的软件国内已经有相关的开源了,我也玩了一段golang,win和linux也就一条命令生成而已,脚本是固定的,证书文中也有生成方法,虽然你这收费不高,不过开源软件,这样做不是太好吧?
焜爷帅呆了
焜爷帅呆了
Tunnel Status online
Version 1.7/1.7
Forwarding http://dev.kunye.goobull.com:8080 -> 127.0.0.1:8080
Forwarding https://dev.kunye.goobull.com:8080 -> 127.0.0.1:8080
Web Interface 127.0.0.1:4040
# Conn 0
Avg Conn Time 0.00ms

大神,客户端已经连接成功了,为啥还是访问不了http://dev.kunye.goobull.com:8080这个网址
dingdayu
dingdayu

引用来自“啦啦啦拉拉”的评论

Please build with the latest version of Go (1.7)

提示你编译新版本go啊。
啦啦啦拉拉
啦啦啦拉拉
Please build with the latest version of Go (1.7)
啦啦啦拉拉
啦啦啦拉拉
unknown tls.Config field 'GetCertificate' in struct literal
CentOS7搭建ngrok服务器

CentOS7搭建ngrok服务器 会飞的污熊2017-12-302 阅读 web ngrok是一个反向代理,它能够让你本地的web服务或tcp服务通过公共的端口和外部建立一个安全的通道,使得外网可以访问本地的计算机服...

会飞的污熊
2017/12/30
0
0
CentOS 搭建ngrok服务器(外网映射内网)

CentOS 7 搭建ngrok服务器(外网映射内网) 准备 一台云服务器(本文ECS),一个域名(二级域名也可以),并且域名正确解析到云服务器 安装环境 安装gcc和git(下载ngrok源码) yum install gcc -y...

独钓渔
03/18
0
0
Ngrok服务器搭建好,客户端连不上问题

你好:请教博客轮有个问题. 问题描述: 本地是外网地址请求服务器自己搭建的ngrok不通。 环境描述 :我的服务端在公网服务器上已经搭建好了。 我用本地 配置如下: server_addr: "***.cn:444...

吴志国
02/21
0
0
可用的内网映射外网工具ngrok

参见:http://www.ngrok.cc/ 包含了ngrok下载,使用教程。 ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便...

quantumcs
2015/12/17
229
0
关于Ngrok 服务端+客户端搭建操作手册

欢迎来到志国博客论坛: 今天给大家介绍一款Ngrok如何在公网服务器上搭建使用。 首先先介绍下什么是Ngrok: Ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全...

吴志国
02/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Feign Retryer的默认重试策略测试

1、Feign配置 @Configurationpublic class FeignConfig { @Value("${coupon_service.url:http://localhost:8081}") private String couponServiceUrl; @Bean publ......

moon888
21分钟前
1
0
关于不同域名下的session共享问题

如果登录,首页,分类,列表,产品都在不同的二级域名下,主域名不变,一定要保证里面的版本问题,不能为了更新而更新,这样哪个下面的session都访问不了。

dragon_tech
23分钟前
2
0
iOS 中文拼音互转(好东西记录一下)

PinYin4Objc

_____1____
31分钟前
1
0
fabric private data实战

Hyperledger Fabric private data是1.2版本引入的新特性,fabric private data是利用旁支数据库(SideDB)来保存若干个通道成员之间的私有数据,从而在通道之上又提供了一层更灵活的数据保护...

汇智网教程
31分钟前
1
0
es之聚合查询汇总

记录一下最近用到的es聚合查询,感觉常见的应该多遇上了,下午抽空更新

我真是小菜鸡
32分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部