Ngrok使用指南

Ngrok 是一款内部端口转发,对于微信类似的开发很有用的😆
可参照墙内(花生壳 or nat123)

概述

编译环境:
Go 1.4.1 强烈建议
根域名: web.hocg.in,即生成的域名为*.web.hocg.in
文件结构:
ngrok
├── bin
│ └── ngrok.cfg
├── client.sh
├── code.sh
└── server.sh
部署环境:
服务器OS: Ubuntu-15
客户端OS: Ubuntu-16

安装

环境依赖及源码下载

以下命令根目录统一在/opt

1
2
3
4
5
# 环境依赖
sudo apt-get install build-essential golang mercurial git
# 获取 ngrok 源码
git clone https://github.com/tutumcloud/ngrok.git ngrok
cd ngrok

生成证书 && 编译

以下命令根目录统一在/opt/ngrok

code.sh文件

生成证书 && 编译服务端
DOMAIN 为配置的根域名, 用于签名.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
echo "开始清除.."
rm -rf assets/client/tls/ngrokroot.crt
rm -rf assets/server/tls/snakeoil.crt
rm -rf assets/server/tls/snakeoil.key
rm -rf device.*
rm -rf rootCA.*
DOMAIN=web.hocg.in
echo "设置域名为[*.$DOMAIN]"
echo "开始生成秘钥.."
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=$DOMAIN" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

echo "开始迁移秘钥.."
cp -rf rootCA.pem assets/client/tls/ngrokroot.crt
cp -rf device.crt assets/server/tls/snakeoil.crt
cp -rf device.key assets/server/tls/snakeoil.key

echo "开始编译.."
make release-server

客户端

前置条件: Go需先增加对这些平台交叉编译的支持

  • Windows
    go的src目录
    1
    GOOS=windows GOARCH=amd64 ./make.bash

nginx目录,编译

1
GOOS=windows GOARCH=amd64 make release-client

  • macOS
    go的src目录
    1
    GOOS=darwin GOARCH=amd64 ./make.bash

nginx目录,编译

1
GOOS=darwin GOARCH=amd64 make release-client

  • Linux
    nginx目录,编译
    1
    make release-client

配置文件

ngrok.cfg文件

server_addr 为配置的根域名4443为默认端口

1
2
server_addr: web.hocg.in:4443
trust_host_root_certs: false

运行文件

server.sh文件

服务器运行
DOMAIN 为配置的根域名.
注释的那一句用于后台运行

1
2
3
4
5
6
7
#!/bin/bash
# $1 HTTP
# $2 HTTPS
killall ngrokd
DOMAIN=web.hocg.in
# nohup ./bin/ngrokd -domain="$DOMAIN" -httpAddr=":$1" -httpsAddr=":$2" >/tmp/ngrok.log 2>&1 &
./bin/ngrokd -domain="$DOMAIN" -httpAddr=":$1" -httpsAddr=":$2"

client.sh文件

客户端运行, default:linux
具体环境修改具体内容

1
2
3
4
#!/bin/bash
# $1 Port
# $2 domain
./bin/ngrok -subdomain $2 -proto=http -config=./bin/ngrok.cfg $1

使用

若需变更域名, 需修改code.shDOMAINserver.shDOMAIN./bin/ngrok.cfgserver_addr

编译

1
sh code.sh

成功 检查ngrok/bin文件夹是否存在ngrok and ngrokd

服务端

1
sh server.sh 8888 9999

客户端

1
sh client.sh 8080 dm

检验

访问:http://dm.web.hocg.in:8888
image

重要

关于域名解析

eg. *.web.hocg.in
路径解析需配置*.web and web 两个A记录

关于签名

最好在同一环境进行服务端客户端的编译

小技巧

  • 如何让服务端的ngrok后台运行

    正常的nohup&是无法使ngrok后台运行的
    需使用screen

    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 安装
    \# apt-get install screen
    # 使用
    screen -S [命名] [需放入后台的命令]
    # 使用 ctrl+A+D 让其运行在后台
    # 查看screen 后台进程
    screen -ls
    # 重新连接后台进程
    screen -r [进程id]

可能遇到的异常

  • Go-1.2.1语言版本不支持go version
    1
    2
    3
    4
    5
    # github.com/gorilla/websocket
    src/github.com/gorilla/websocket/client.go:361: unknown tls.Config field 'GetCertificate' in struct literal
    src/github.com/gorilla/websocket/client.go:370: unknown tls.Config field 'ClientSessionCache' in struct literal
    src/github.com/gorilla/websocket/client.go:373: unknown tls.Config field 'CurvePreferences' in struct literal
    make: *** [client] Error 2

官方Go-64的安装

  • Go编译器找不到go-bindata
    1
    2
    3
    GOOS="" GOARCH="" go get github.com/jteeuwen/go-bindata/go-bindata
    /bin/sh: 1: go: not found
    make: *** [bin/go-bindata] Error 127
  1. 请注意配置好GOROOTGOPATH

    GOROOT为安装GO的目录
    GOPATH自定义一个GO插件下载目录

  2. 执行以下shell下载插件

    1
    go get -u github.com/jteeuwen/go-bindata/...

END:)

分享到