0%

ngrok服务器搭建

一、环境准备

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

1、安装git

安装git

1
yum install -y git
2、安装配置go环境

下载并解压
下载go1.4.3源码包(低版本后面编译会失败,高版本安装又需要低版本,所以两个版本都要装)

1
2
wget https://studygolang.com/dl/golang/go1.4.3.linux-amd64.tar.gz
wget https://studygolang.com/dl/golang/go1.12.1.linux-amd64.tar.gz

解压

1
tar -zxf go1.4.3.linux-amd64.tar.gz

可从后面的链接中下载新的版本:https://studygolang.com/dl
添加环境变量

1
vi /etc/profile

在最后面添加:
添加下面两行代码

1
2
export GOROOT=/usr/local/go
export PATH=$GOROOT/bin:$PATH

保存并退出,使配置生效

1
source /etc/profile

查看go环境是否配置成功

1
go version

二、准备编译Ngrok

1、下载Ngrok源码包

下载ngrok源码包

1
git clone https://github.com/inconshreveable/ngrok.git
2、为Base域名生成自签名证书

ngrok需要一个域名作为base域名,ngrok会为客户端分配base域名的子域名。例如:ngrok的base域名为ngrok.yuanfusc.cn,客户端即可被分配子域名test.ngrok.yuanfusc.cn。
使用ngrok官方服务时,base域名是ngrok.com,并且使用默认的SSL证书。现在自建ngrok服务器,所以需要重新为自己的base域名生成证书。
为base域名ngrok.yuanfusc.cn生成证书(注意对应的base域名)

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

执行完上述命令,正常情况下,该目录会多出device.crt、device.csr、device.key、rootCA.key、rootCA.pem、rootCA.srl六个文件,用它们来替换默认的证书文件即可。默认的证书文件在“./assets/client/tls”和“./assets/server/tls/”目录中
替换默认的证书文件

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

自签名证书只能使用http,购买证书或使用自己的证书
首先去买一个ssl证书,或者申请一个免费的。然后把你的证书上传到ngork服务端所在的服务器。

1
./bin/ngrokd -domain="ngrok.yuanfusc.cn" -tlsKey="ngrok_key.key" -tlsCrt="ngrok_chain.crt" -log=stdout

其实就是在你原先的命令上加tlskey和tlscrt的路径,这两个就是你的证书所在路径.
客户端cfg文件里设置如下参数:

1
trust_host_root_certs: true

确认服务端的启动参数-domain以及客户端cfg文件中的server_addr和证书的域名是同一个,否则会报错误证书的错误。(可以在客户端加上参数-log=log.txt查看日志)

三、开始编译ngrok

1、编译服务器端ngrokd

ngrokd就是ngrok服务器端,默认编译为Linux的执行文件,我们的ECS本身就是Linux的,所以直接make编译就好。
编译ngrokd(服务器端)

1
make release-server

显示下面的内容则表示编译成功:

我们可以在bin目录中找到文件ngrokd。可以先运行测试一下。

运行ngrokd

1
./bin/ngrokd -domain="ngrok.yuanfusc.cn" -log=stdout

出现类似以下内容,则说明我们的服务器端ngrokd正常运行了。

之后Ctrl+C退出ngrokd,继续来编译ngrok客户端。

2、编译客户端ngrok

编译Linux客户端

1
make release-client

显示以下内容,没有任何报错的话,客户端ngrok就编译成功了,我们在./bin/目录下就可以找到执行文件ngrok。

1
2
3
4
5
6
7
8
9
10
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的安装目录

1
cd /usr/local/go/src

给Go编译器加上交叉编译windows/amd64程序的功能

1
GOOS=windows GOARCH=amd64 ./make.bash

切回到ngrok目录

1
cd /usr/local/ngrok

执行如下命令编译Windows 64位客户端

1
GOOS=windows GOARCH=amd64 make release-client

以上GOARCH=amd64指的是编译为64位版本,如需32位改成GOARCH=386即可
没有错误的话,Windows客户端ngrok就编译成功了,我们可以在/bin/windows_amd64/目录下找到执行文件ngrok.exe。将其下载到Windows上。

mac的编译命令
切换到ngrok目录

1
cd /usr/local/ngrok

mac平台下的64位环境

1
GOOS=darwin GOARCH=amd64 make release-client

四、运行并测试

1、启动服务器端ngrokd

这个很简单,首先执行VPS上的服务器端ngrokd,这里的80指的是服务器启用80端口,就是说内网穿透后的域名为xxx.ngrok.yuanfusc.cn:80。如果我们VPS的80端口被占用了,但是我们还想用80端口作为服务端口,那么可以使用nginx做一个xxx.ngrok.yuanfusc.cn的反向代理。
执行ngrokd

1
./bin/ngrokd -domain="ngrok.yuanfusc.cn"
2、写客户端配置文件

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

1
2
server_addr: "ngrok.yuanfusc.cn:4443"
trust_host_root_certs: false
3、映射HTTP

之后打开Windows服务器,这里以80端口为例。打开命令提示符,切到ngrok.exe所在目录,并执行以下命令。
启动ngrok客户端

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

注意:如果不加参数-subdomain=test,将会随机自动分配子域名。
正常情况下,客户端上会显示以下内容,表示成功连接到服务器端。
客户端ngrok正常执行显示的内容

打开浏览器,分别在地址栏中输入http://localhosthttp://test.ngrok.yuanfusc.cn,如果后者正常显示并且和http://localhost显示的内容相同,则证明我们已经成功了。

五、后续定制及优化

通过以上操作,我们的ngrok服务器就已经成功搭建了,客户端也成功的跑了起来。但是,如果我们想要对ngrok进行一些定制和优化,可以参考这些后续定制及优化的方法。

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

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

1
vi /usr/local/ngrok/src/ngrok/client/model.go

找到第23行,将

1
defaultServerAddr = "ngrokd.ngrok.com:443"

修改为

1
defaultServerAddr = "ngrok.yuanfusc.cn:4443"

运行客户端后,我们会发现在客户端左上角会有一个蓝色字体的“ngrok”字样的文字logo,如果觉得不太喜欢,或者想修改一下的话,可以在编译客户端之前,作如下修改。
修改客户端蓝色文字logo

1
vi /usr/local/ngrok/src/ngrok/client/views/term/view.go

找到第100行,将

1
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")

修改为

1
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")
3、修改客户端帮助信息

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

1
vi /usr/local/ngrok/src/ngrok/client/client/cli.go

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

4、客户端程序加壳优化

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

5、服务端自启动
1
vi /usr/lib/systemd/system/ngrok.service

写入以下内容

1
2
3
4
5
6
7
[Unit]
Description=ngrok
[Service]
Type=simple
ExecStart=/usr/local/ngrok/bin/ngrokd -domain=ngrok.yuanfusc.cn -tlsKey=/usr/local/ngrok/ngrok_key.key -tlsCrt=/usr/local/ngrok/ngrok_chain.crt -log=stdout > /dev/null 2>&1 &
[Install]
WantedBy=multi-user.target

重载服务指令

1
systemctl daemon-reload

启动ngrok

1
systemctl start ngrok

查看日志

1
journalctl | grep -i ngrok

Windows客户端一键启动bat

1
ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=bwcx 80

说明 -config指向配置文件,-log存放日志文件位置,-subdomain为自定义的域名前缀。80为端口号。

-------------    本文结束  感谢您的阅读    -------------