Ngr ok穿透服务安装

什么是ngrok呢?ngrok是一个反向代理,它能够让你本地的web服务或tcp服务通过公共的端口和外部建立一个安全的通道,使得外网可以访问本地的计算机服务。

也就是说,我们提供的服务(比如web站点)无需搭建在外部服务器,只要通过ngrok把站点映射出去,别人即可直接访问到我们的服务。

有做过微信公众号开发的人,对它应该不陌生。在微信公众号开发中,因为用户跟微信公众号产生的交互行为,微信会把用户的相关信息推送到我们自己的服务器,而这个推送的前提是微信能够访问到我们的服务,如果服务在本地,那微信当然无法推送给我们,这使得开发功能的时候调试相当麻烦。幸好有ngrok这个工具,我们可以使用ngrok把本地站点映射出去,解决微信推送给我们的用户信息等消息进行实时本地调试。

很不巧的是,目前国内访问该网站提供的服务相当不稳定,经常连接不上,出于什么原因,你懂得。虽然国内有不少第三方的ngrok服务提供,如natapp、花生壳,但不敢确定它们的稳定性。而QQ浏览器其实也有提供这样的服务专门用于开发微信公众号,不过太过局限,只能用于微信开发,想要做其他用途就不行了。

好在ngrok是开源的,我们可以去Github上下载它的源码,在自己的外网服务器上搭建这样一个服务。

源码地址:https://github.com/inconshreveable/ngrok

下面,我们开始搭建ngrok服务。

一、准备工作

搭建ngrok服务需要有一天外网服务器及一个域名解析到外网服务器上。
本文基于外网的一台VPS,系统版本为CentOS的linux服务器搭建ngrok服务。
域名建立两个A记录,把域名解析到服务器上,用来关联ngrok服务。

二、搭建服务

1. 安装go语言环境

ngrok是基于go语言开发的,所以需要先安装go语言开发环境

  • CentOS可以使用yum安装
$ sudo yum install golang
  • 或者使用go安装包安装
# 下载go软件包
$ wget https://golangtc.com/static/go/1.8.5/go1.8.5.linux-amd64.tar.gz
# 解压软件包
$ tar zxvf go1.8.5.linux-amd64.tar.gz
# 移动软件包到/usr/local路径下
$ mv go /usr/local

安装完成之后,执行 go version 看到如下信息,证明安装成功:

go version go1.8.5 linux/amd64

2. 安装git

# 安装
$ yum install -y git
# 检查是否安装成功
$ git --version

3. 下载ngrok源码

# 进入/usr/local路径
$ cd /usr/local
# clone ngrok源码
$ git clone https://github.com/inconshreveable/ngrok.git
# 设置环境变量
$ export GOPATH=/usr/local/ngrok/
$ export NGROK_DOMAIN="ngrok.xxxxx.com"
# 进入ngrok目录
$ cd ngrok

4. 生成自签名证书

使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自己建立ngrok服务,需要我们生成自己的证书,并提供携带该证书的ngrok客户端。

证书生成过程需要有自己的一个基础域名,官网随机生成的地址,如:693c358d.ngrok.com,基础域名就是ngrok.com。而在上文中提到的二级域名 proxy.chhweb.com 就是用来作为这次要提供的基础域名。如果你的域名是 abc.com,那么域名基础域名可以设置为 ngrok.abc.com。

以我的基础域名为例(注意替换成自己的域名),生成证书过程如下:

$ openssl genrsa -out rootCA.key 2048
$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.xxxxx.com" -days 5000 -out rootCA.pem
$ openssl genrsa -out device.key 2048
$ openssl req -new -key device.key -subj "/CN=ngrok.xxxxx.com" -out device.csr
$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

我们在编译可执行文件之前,需要把生成的证书分别替换到 assets/client/tls和assets/server/tls中,这两个目录分别存放着ngrok和ngrokd的默认证书。

# 如文件已存在,则直接覆盖
$ cp rootCA.pem assets/client/tls/ngrokroot.crt
$ cp device.crt assets/server/tls/snakeoil.crt
$ cp device.key assets/server/tls/snakeoil.key

5. 编译ngrok

首先需要知道,ngrokd 为服务端的执行文件,ngrok为客户端的执行文件。
接下来我们来编译ngrokd,在ngrok目录下,执行如下命令:

$ make release-server release-client

编译过程需要等待一会,因为需要通过git安装相关依赖包。如果提示没有权限,使用 sudo 命令来安装。

由于客户端的平台版本较多,我们需要交叉编译来选择生成的平台。
以windows、arm、linux版本编译,如下:

$ GOOS=linux GOARCH=amd64 make release-server release-client
$ GOOS=windows GOARCH=amd64 make release-server release-client
$ GOOS=linux GOARCH=arm make release-server release-client

不同平台使用不同的 GOOS 和 GOARCH,GOOS为go编译出来的操作系统 (windows,linux,darwin),GOARCH, 对应的构架 (386,amd64,arm)

Linux 平台 32 位系统:GOOS=linux GOARCH=386
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
  
Windows 平台 32 位系统:GOOS=windows GOARCH=386
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
  
MAC 平台 32 位系统:GOOS=darwin GOARCH=386
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64

ARM 平台:GOOS=linux GOARCH=arm

通过上面的步骤,将生成所有客户端文件,客户端文件放在对于的文件夹中,如windows 64位的为:windows_amd64,linux客户端在bin目录下的ngrok文件。

6. 启动ngrok服务器

请将 bin/ngrokd 放入环境变量中,启动命令:

$ ngrokd -domain="ngrok.xxxxx.com" -tunnelAddr=":8680" -httpAddr=":8681" -httpsAddr=":8682"

其中,-domain为你的ngrok服务域名,-httpAddr为http服务端口地址,访问形式为:xxx.ngrok.xxxxx.com:8088,也可设置为80默认端口,-httpsAddr为https服务,同上。

ngrokd启动后,退出命令行即关闭服务。如果想要在后台运行,则执行:

$ nohup ngrokd -domain="ngrok.xxxxx.com" -tunnelAddr=":8680" -httpAddr=":8681" -httpsAddr=":8682" &

注意末尾需要有 & 号,详细搜索 nohup 了解。

关闭服务只需通过:

$ ps -A   # 找到PID,执行关闭
$ kill xxxid

7. 启动ngrok客户端

由于在准备工作中,已经把 ngrok.xxxxx.com 的域名解析到服务器上,接下启动客户端测试是否可用。

  • 建立ngrok配置文件:ngrok.cfg
# 端口号为tunnelAddr端口
server_addr: "ngrok.xxxxx.com:8680"
trust_host_root_certs: false
  • 运行客户端,暴露本地4000端口站点
$ ngrok -subdomain test -config=./config.cfg 4000

回车后,看到online界面,说明启动成功。

浏览器输入:127.0.0.1:4040 查看页面请求情况。

posted @ 2017-03-05 15:15  雪域熊猫  阅读(427)  评论(0编辑  收藏  举报