### 1. 部署条件

* 域名
* 独立IP的VPS/云主机

编译Ngrok客户端时会使用openssl生成证书来加密通讯,保证了安全性,使用时必须和签署证书时的域名吻合。

一个拥有独立IP的VPS或云主机,地区的话推荐选择 香港或 国外的,配置可以参考 搭建ss服务的标准,其对 延迟, 带宽和 速度的要求高于内存和CPU。(这里我用的只是hosthatch的vps,当然这个配置还不是最低价的)

使用国内云主机的话第一个是要考虑域名备案,因为一般反向代理网页时使用了服务器的80端口。第二个是国内符合配置条件的vps比较少,因为没人直接拿国内的服务器番茄,市场的需求催生了国外VPS低内存高带宽而且非常优惠的配置。

** 部署环境 ** :香港VPS CentOS 7.2+Raspberry raspbian

也可以选择在本地编译好客户端然后部署在服务器上

### 2. 编译Ngrok

记得配置一个科学的上网环境(香港或国外主机不用)

由于编译过程中会导入包的网址,而这些网址基本都被墙了。

方法不用多说了

### 3. 安装Go环境

#### 3.1 安装依赖包

```
yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ build-essential mercurial
```

由于Go官方地址也被墙了,国内主机或者VPS的请找国内资源下载,由于我使用的香港的VPS,这里直接下载的Go官方的。

#### 3.2 下载Go安装包
```
wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz
```

#### 3.3 安装Go安装包

** 解压 **

```
tar -zxvf go1.8.1.linux-amd64.tar.gz
```

** 移动目录 **

```
mv go /usr/local/
```

** 软链到/usr/bin **

```
ln -s /usr/local/go/bin/* /usr/bin/
```

安装成功后查看可Go编译环境
```
go env
```

### 4. 升级Git版本

Go编译过程中要求高版本的git,而yum源里面默认只有1.8版本。

#### 4.1 安装Git

安装2.9.4版本的git

```
#下载
wget https://www.kernel.org/pub/software/scm/git/git-2.9.4.tar.gz

#解压
tar zxvf git-2.9.4.tar.gz cd git-2.9.4

#配置并编译
./configure --prefix=/usr/local/git-2.9.4
make
make install
```

取代yum安装的低版本git,然后软链接到/usr/bin

```
yum remove git*
ln -s /usr/local/git-2.9.4/bin/* /usr/bin/
```

#### 4.2 检查版本

检查git版本是否为2.9.4

```
git --version
```
### 5. 源码配置

声明编译的路径和必要的域名(域名改成你自己的)

#### 5.1 生成证书
```
cd /usr/local/

git clone https://github.com/inconshreveable/ngrok.git

export GOPATH=/usr/local/ngrok/

export NGROK_DOMAIN="ngrok.hibai.cn"

cd ngrok
```

生成证书,Ngrok会使用此证书加密通讯
```
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
```

#### 5.2 安装证书

将证书文件复制到指定位置
```
cp rootCA.pem assets/client/tls/ngrokroot.crt

cp server.crt assets/server/tls/snakeoil.crt

cp server.key assets/server/tls/snakeoil.key
```

### 6. 编译

分别编译服务器端与客户端

#### 6.1 编译服务端

因为我的服务器端版本为linux64位,此处GOARCH=amd64
```
cd /usr/local/go/src

GOOS=linux GOARCH=amd64 ./make.bash

cd /usr/local/ngrok/

GOOS=linux GOARCH=amd64 make release-server
```

编译完成过后ngrok/main/ngrokd即为服务端运行文件

#### 6.2 编译客户端

树莓派为linux-arm架构,重新声明go env里的变量
```
cd /usr/local/go/src

GOOS=linux GOARCH=arm ./make.bash

cd /usr/local/ngrok/

GOOS=linux GOARCH=arm make release-client
```

编译完成过后/ngrok/bin/linux_arm/ngrok即为树莓派客户端运行文件

注:这里测试时只编译了amd64的服务器端和arm的客户端,实际上可以通过改变GOOS与GOARCH来获取各个平台的客户端与服务端,GOOS可以指定为windows、linux 、 freebsd 、darwin (Mac OS X 10.5 or 10.6) 和 nacl (Chrome 的Native Client 接口) ,GOARCH可以指定为amd64 (64-bit x86) 、386 (32-bit x86) 、 和arm (32-bit ARM),可见Go语言的跨平台能力相当彪悍。

### 7. 部署Ngrok

#### 7.1 绑定域名

在编译配置时的域名ngrok.hibai.cn解析到服务器IP
注意:指定A记录时ngrok与*.ngrok都要填上,这样能方便地使用不同子域转发不同的本地服务。

####服务器端部署
为ngrokd单独开一个screen
```
yum install -y screen

screen -S ngrokd
```

运行ngrokd
```
/usr/local/ngrok/bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80"
```

屏幕会输出一连串日志信息,ttpAddr、httpsAddr 分别是 ngrok 用来转发 http、https 服务的端口,ngrokd 还会开一个 4443 端口用来跟客户端通讯,注意设置防火墙使端口开放。

#### 7.2 客户端部署

将/ngrok/bin/linux_arm/ngrok移至树莓派下
新建配置文件ngrok.cfg

```
server_addr: "ngrok.hibai.cn:4443"
trust_host_root_certs: false
```

运行客户端
PS:在执行前务必给ngrok和ngrok.cfg执行权限

```
chmod +x ngrok
chmod +x ngrok.cfg
./ngrok -config=./ngrok.cfg -subdomain="www.hibai.cn" 80
```

看见** Tunnel Status ** 变为 ** online **说明成功连接服务器端

### 8. 访问测试

浏览器地址栏输入www.hibai.cn查看是否能打开 256M内存的香港VPS测试成功

### 9. 设置开机启动ngrok穿透

创建启动脚本start.sh
```
#!/bin/sh
./ngrok/ngrok -config=./ngrok/ngrok.cfg start tunnel1 tunnel2
```

然后加入开机启动中,修改/etc/rc.local
```
cd /root
./start.sh
# 切记最后要有一句 exit 0
```

### 10. 总结

从Ngrok强大的反向代理功能可以看出Go语言独特魅力,除了glibc的版本有一定要求,其跨平台编译为部署省去了不少时间,当然Go还有更多的优点,本文提到的也只是Ngrok的冰山一角,利用其TCP转发也可以远程SSH树莓派,更多玩法就自行百度了。

> 文章内容结合以下文章:
> http://www.jianshu.com/p/91f01e30a9b0
> http://www.sunnyos.com/article-show-48.html

最后修改:2021 年 05 月 29 日
如果觉得我的文章对你有用,请随意赞赏