ubuntu搭建ngrok服务器,尽享内网穿透技术带来的福利
如果你做微信开发,一次又一次的发布、发现错误、调试、发布、发现错误、调试…的循环一定让你个人或是团队感到厌倦;
如果你接外包项目,在开发过程中,客户想要看一看开发中的进展,你一定为还没有可预览环境或者搭建环境产生的消耗而苦恼。
…
这一切的原因仅仅是因为你深处复杂的内网环境,被一个局域网阻断了与外部的直接联系。你一定希望有一样东西,能够冲破这层阻隔,为你的工作提高效率。
这篇文章我们介绍 ngrok,一个开源软件,可以用于提供内网穿透。
以下我记录下ngrok服务的搭建过程。
一、准备工作
- 需要一个有公网IP的VPS
- 需要一个能够自由解析的域名
二、解析域名
使用自己的域名,把域名解析到 VPS 的地址,解析方式如下:
1
2
|
ngrok.uprogrammer.cn ———-> A记录到你的 VPS IP
*.ngrok.uprogrammer.cn ———-> CNAME到ngrok.uprogrammer.cn
|
三、VPS 服务端安装 go 环境
因为 ngrok 是由 go 语言开发的,所以需要安装 go 环境。
1. 从 go 官网下载最新的 go 版本,并解压到 /usr/local
目录下。
1
2
|
wget -c https://storage.googleapis.com/golang/go1.7.4.linux-amd64.tar.gz
tar -C /usr/local -zxvf go1.7.4.linux-amd64.tar.gz
|
2. 设置相关环境变量
1
2
3
4
5
6
|
# 可以根据自己需要调整路径
echo ‘export GOROOT=/usr/local/go’ >> /etc/profile
echo ‘export PATH=$PATH:$GOROOT/bin’ >> /etc/profile
echo ‘export GOPATH=$HOME/go’ >> /etc/profile
echo ‘export GOROOT_BOOTSTRAP=/usr/local/go’ >> /etc/profile
source /etc/profile
|
3. 检查是否安装成功
1
|
go version
|
四、安装 Git 环境
由于我们通过 github 上的源码来安装 ngrok,所以需要先安装下 git。如果已经有 git环境,则直接跳过。
ubuntu 上可以直接通过 apt-get install git
来安装 git。完成以后,做相应的 git 配置,此处略过。
五、Ubuntu 安装 ngrok
1. 下载 ngrok,并修改参数
1
2
3
4
5
|
cd /usr/local/
git clone http://github.com/inconshreveable/ngrok.git
export GOPATH=/usr/local/ngrok/
export NGROK_DOMAIN=“ngrok.uprogrammer.cn”
cd ngrok
|
2. 生成证书(必须)
1
2
3
4
5
|
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj “/CN=$NGROK_DOMAIN” -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj “/CN=$NGROK_DOMAIN” -out server.csr
openssl x509 -req –in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
|
3. 将源代码目录下生成的证书文件复制到指定的位置
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. 如果是在国内的服务器,需要执行下面的修改,否则会由于网络原因产生库的依赖问题。香港或者国外的服务器就不需要了。
1
2
|
vim /usr/local/ngrok/src/ngrok/log/logger.go
log “github.com/keepeye/log4go”
|
5. 编译服务器,这里也同时编译了一个 linux 下的客户端。64位系统使用 amd64,如果是32位,需要修改成 amd386。
编译的时候,这里可能会遇到一个坑,后面会讲到。
1
2
3
4
|
cd /usr/local/go/src
GOOS=linux GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=linux GOARCH=amd64 make release-server release-client
|
编译 Mac 64 位客户端
1
2
3
4
|
cd /usr/local/go/src
GOOS=darwin GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=darwin GOARCH=amd64 make release-client
|
编译 Windows 64位客户端
1
2
3
4
|
cd /usr/local/go/src
GOOS=windows GOARCH=amd64 ./make.bash
cd /usr/local/ngrok/
GOOS=windows GOARCH=amd64 make release-client
|
六、服务端运行与使用
1. 进入服务端目录,服务端程序文件名为 ngrokd,并执行相应命令
1
2
|
cd /usr/local/ngrok/bin
./ngrokd -domain=“$NGROK_DOMAIN“ -httpAddr=“:80”
|
2. 返回类似如下的结果,则说明服务端运行成功
1
2
3
4
5
|
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.Info:112) Listening for public http connections on [::]:80
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.Info:112) Listening for public https connections on [::]:443
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on [::]:4443
[08:09:41 UTC 2016/12/19] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds
|
七、客户端的运行与使用
1. 把刚刚从 VPS 服务器上生成的客户端服务器下载到本机,可以通过 scp
命令
1
|
scp username@servername:/path/filename /var/www/local_dir(本地目录)
|
mac 客户端的位置:
1
|
/usr/local/ngrok/bin/darwin_amd64/ngrok
|
windows 客户端的位置:
1
|
/usr/local/ngrok/bin/windows_amd64/ngrok.exe
|
linux 客户端的位置:
1
|
/usr/local/ngrok/bin/ngrok
|
2. 客户端程序下载到本地以后,在本地同一目录下新建名为 ngrok.cfg
的文件,文件内容如下:
1
2
|
server_addr: “ngrok.uprogrammer.cn:4443”
trust_host_root_certs: false
|
3. 运行客户端
1
2
3
4
|
./ngrok -config=./ngrok.cfg -subdomain=test 8080
|
4. 返回类似如下的结果,则说明客户端运行成功
1
2
3
4
5
6
7
|
Tunnel Status online
Version 1.7/1.7
Forwarding http://test.ngrok.uprogrammer.cn -> 127.0 :8080
Forwarding http://test.ngrok.uprogrammer.cn -> 127.0 :8080
Web Interface 127.0 :4040
# Conn 0
Avg Conn Time 0.00ms
|
接下来,你就可以运行本地 8080 端口的程序,看一看是不是通过 test.uprogrammer.cn
就可以访问啦,也可以发给局域网之外的人来访问^ ^
八、可能遇到的坑
1. 出现以下错误提示:$GOROOT_BOOTSTRAP must not be set to $GOROOT
1
2
3
4
|
##### Building Go bootstrap tool.
cmd/dist
ERROR: $GOROOT_BOOTSTRAP must not be set to $GOROOT
Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.
|
配置的 $GOROOT_BOOTSTRAP
和 $GOROOT
一致导致。可以复制一份 go 的源码到另外的路径,如 /usr/local/go-copy
,同时 export GOROOT_BOOTSTRAP=/usr/local/go-copy
2. 客户端可以连上,但域名不完全,显示如下:
1
2
3
4
5
6
7
|
Tunnel Status online
Version 1.7/1.7
Forwarding http://test. -> 127.0 :8080
Forwarding http://test. -> 127.0 :8080
Web Interface 127.0 :4040
# Conn 0
Avg Conn Time 0.00ms
|
这种错误是由于服务端运行时环境变量没有正确配置导致的,可以显示设置域名:
1
|
./ngrokd –domain=“ngrok.uprogrammer.cn” -httpAddr=“:80”
|
3. 如果你对 VPS 服务器已经有其他程序占用 80 端口,而还需要 ngrok 通过80端口做内网穿透的话,可以通过 nginx 来做反向代理。