简介

ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道,ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放

Ngrok版本

v1.7

安装

环境搭建

1
2
3
4
5
# 安装Go环境
$ sudo yum install golang
$ go version
# 设置环境变量
$ vi ~/.bash_profile

.bash_profile 编辑内容如下:

1
2
3
# GO环境
export GOPATH=$HOME/go
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$GOPATH/bin

编辑内容后执行source生效

1
2
3
4
5
$ source ~/.bash_profile  
# 检查go环境是否安装成功
$ go env
# 检查go版本
$ go version

配置

编译ngrok源码安装

1
2
3
4
# 安装Git
$ yum install -y git
# 下载ngrok源码
$ git clone https://github.com/mamboer/ngrok.git

生成签名证书,假设使用域名为:domain.com

1
2
3
4
5
6
7
8
# 进入ngrok源码目录
$ cd ngrok
# 生成签名证书
$ openssl genrsa -out rootCA.key 2048
$ openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=domain.com" -days 5000 -out rootCA.pem
$ openssl genrsa -out device.key 2048
$ openssl req -new -key device.key -subj "/CN=domain.com" -out device.csr
$ openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000

查看当前目录文件

1
$ ll

包含6个证书相关文件

1
2
3
4
5
6
-rw-r--r-- 1 root root  981 Dec 29 18:37 device.crt
-rw-r--r-- 1 root root 895 Dec 29 18:37 device.csr
-rw-r--r-- 1 root root 1679 Dec 29 18:37 device.key
-rw-r--r-- 1 root root 1675 Dec 29 18:37 rootCA.key
-rw-r--r-- 1 root root 1099 Dec 29 18:37 rootCA.pem
-rw-r--r-- 1 root root 17 Dec 29 18:37 rootCA.srl

设置Ngrok默认证书

1
2
3
4
5
6
7
8
9
10
11
12
13
# 管理证书位置
cp rootCA.pem /root/ngrok/assets/client/tls/ngrokroot.crt
cp device.crt /root/ngrok/assets/server/tls/snakeoil.crt
cp device.key /root/ngrok/assets/server/tls/snakeoil.key
# 编译
## 编译服务端
$ make release-server
## 编译客户端
$ make release-client
## 编译所有
$ make release-all
## Window客户端编译
$ GOOS=windows GOARCH=386 make release-client

编译后可以在bin目录查看对应版本文件

1
2
3
4
-rwxr-xr-x 1 root root  2644407 Dec 28 22:26 go-bindata
-rwxr-xr-x 1 root root 11097051 Dec 29 19:03 ngrok
-rwxr-xr-x 1 root root 8618267 Dec 29 19:03 ngrokd
drwxr-xr-x 2 root root 4096 Dec 29 19:04 windows_386

alias 命令名=”命令内容”

使用

服务端

当前是不使用SSL连接方式场景

配置DNS

将*.domain.com 域名解析到运行Ngrok的服务器IP

设置Ngrok全局变量

注意:为了更方便调用ngrokd命令,可以为其定义别名,操作如下:

1
$ vi ~/.bash_profile

.bash_profile 文件内容格式如下:

1
$ alias ngrokd=/root/ngrok/bin/ngrokd

执行source进行生效

1
$ source ~/.bash_profile

运行Ngrok服务

ngrokd -tlsKey=”/root/ngrok/assets/server/tls/snakeoil.key” -tlsCrt=”/root/ngrok/assets/server/tls/snakeoil.crt” -domain=”domain.com”

正确运行显示内容:

1
2
3
4
5
[19:13:28 CST 2017/12/29] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [registry] [tun] No affinity cache specified
[19:13:28 CST 2017/12/29] [INFO] (ngrok/log.Info:112) Listening for public http connections on 0.0.0.0:80
[19:13:28 CST 2017/12/29] [INFO] (ngrok/log.Info:112) Listening for public https connections on 0.0.0.0:443
[19:13:28 CST 2017/12/29] [INFO] (ngrok/log.Info:112) Listening for control and proxy connections on 0.0.0.0:4443
[19:13:28 CST 2017/12/29] [INFO] (ngrok/log.(*PrefixLogger).Info:83) [metrics] Reporting every 30 seconds

客户端(Window)

将在服务器编译好的Window客户端(ngrok.exe)下载到本地,
创建ngrok.cfg配置文件

配置内容如下:

1
2
server_addr: "domain.com:4443"
trust_host_root_certs: false

打开cmd.exe运行本地ngrok.exe

1
2
3
4
$ cd ngrok.exe存放目录

# 运行window客户端,访问地址为:cotide.domain.com 对应本地的127.0.0.1:8080
$ ngrok.exe -proto=http -log=stdout -subdomain cotide -config=ngrok.cfg 8080

查看 http://127.0.0.1:4040 可以查看目前隧道情况

遇到的问题

问题1: /lib/lsb/init-functions: No such file or directory

解决方法:

1
$ yum install '/lib/lsb/init-functions'

问题2: Ngrok 后台运行

解决方法:

1
$ yum -y install screen

服务端后台运行

1
2
$ screen -S ngrokd
$ ./ngrokd -tlsKey="/root/ngrok/assets/server/tls/snakeoil.key" -tlsCrt="/root/ngrok/assets/server/tls/snakeoil.crt" -domain="domain.com"

客户端后台运行

1
2
$ screen -S ngrok
$ ./ngrok -subdomain code -config=/root/Ngrok/ngrok.cfg 80

问题3: TCP 穿透

解决方法:

1
2
3
4
# window系统
$ ngrok.exe -log=stdout -subdomain db -config=ngrok.cfg -proto=tcp 3306
# linux系统
$ ./ngrok -subdomain login -config=/root/ngrok/ngrok.cfg -proto=tcp 22

优化管理

1
2
# 定义start.sh脚本
$ vi start.sh

start.sh文件内容如下:

1
nohup /root/ngrok/bin/ngrokd -tlsKey="/root/ngrok/assets/server/tls/snakeoil.key" -tlsCrt="/root/ngrok/assets/server/tls/snakeoil.crt" -domain="domain.com" &

使用:

1
$ sh start.sh

参考