1. go版本管理工具

本次安装基于go1.4.2版本, 使用gvm可以更方便的管理go的版本
moovweb/gvm

#安装gvm
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

#安装go版本
gvm install go1.4.2
gvm use go1.4.2

2. 下载 ngrok

git clone https://github.com/inconshreveable/ngrok.git
export GOPATH=~/ngrok

3. 生成证书

此处可以使用购买的证书来保证https的安全性, 但是需要通配符证书.
下边使用自己生成的方式(需要替换自己的域名)

cd ngrok/
openssl genrsa -out insozCA.key 2048
openssl req -x509 -new -nodes -key insozCA.key -subj "/CN=t.insoz.com" -days 5000 -out insozCA.pem
openssl genrsa -out insoz.key 2048
openssl req -new -key insoz.key -subj "/CN=t.insoz.com" -out insoz.csr
openssl x509 -req -in insoz.csr -CA insozCA.pem -CAkey insozCA.key -CAcreateserial -out insoz.crt -days 5000

生成证书报错

# apt-get upgrde openssl , 升级openssl可解决
139940408391320:error:02001002:system library:fopen:No such file or directory:bss_file.c:398:fopen('insoz.srl','r')
139940408391320:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:400:

4.替换证书文件
将默认的证书替换为自己生成的

cp insozCA.pem assets/client/tls/ngrokroot.crt
cp insoz.crt assets/server/tls/snakeoil.crt
cp insoz.key assets/server/tls/snakeoil.key

5. 编译Server和Client

#服务端
make release-server
#客户端
make release-client

6.启动ngrokd
启动时需要指定域名, 这个域名必须要和生成证书的域名一致, 使用的两个端口要保证没有被占用.

./ngrokd -domain="t.insoz.com" -httpAddr=":8013" -httpsAddr=":8014"

客户端访问域名使用80访问
某些应用调试时不能使用带端口的域名访问, 所以即不想占用80端口又不想带端口访问, 需要在nginx中做如下设置.

通过nginx 拦截 *.t.inosz.com

添加proxy_set_header, 将Host重写为$http_host:8013

这样通过浏览器访问 http://test.t.insoz.com 就会重写为
http://test.t.insoz.com:8013 然后转发到ngrok, ngrok 也能正确识别.

server {
    listen 80;
    server_name *.t.insoz.com;

    proxy_set_header Host       $http_host:8013;
    proxy_redirect off;

    location / {
        proxy_pass http://127.0.0.1:8013;
    }

    access_log  logs/ngrok.log;
}

7.客户端链接

启动
ngrok -subdomain test -config=ngrok.cfg 80

#配置文件
server_addr: "t.insoz.com:4443"
trust_host_root_certs: false

8. 测试
curl 访问测试

▶ curl -I http://test.t.insoz.com
HTTP/1.1 403 Forbidden
Content-Length: 162
Date: Wed, 17 May 2017 05:18:48 GMT
Server: openresty/1.11.2.1
Content-Type: text/html
Age: 1
Connection: keep-alive

#因为我客户端代理的80访问默认是没有页面的, 所以会直接403, 但其实是访问成功的.

查看客户端链接情况, 发现接受到了请求, 搭建成功!

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://test.t.insoz.com:8013 -> 127.0.0.1:80
Forwarding                    https://test.t.insoz.com:8013 -> 127.0.0.1:80
Web Interface                 127.0.0.1:4040
# Conn                        2
Avg Conn Time                 8.66ms



HTTP Requests
-------------

GET /                         403 Forbidden

iapt.io-Leon