自建ngrok服务

基于CentOS的自建ngrok服务

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

安装ngrok服务之前需要先配置Go和Git环境

Install Go 1.5 On CentOS 6

下载编译好的二进制文件压缩包 go1.5.linux-amd64.tar.gz

1
2
3
4
5
cd /tmp
wget https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz

如果提示证书错误或者无法下载,用下面这个命令试一下:
wget -r -np -nd --accept=gz --no-check-certificate https://storage.googleapis.com/golang/go1.5.linux-amd64.tar.gz

解压下载的二进制压缩包到 /usr/local

1
tar -C /usr/local -xvzf /tmp/go1.5.linux-amd64.tar.gz

修改环境变量 /etc/profile

1
2
echo "export PATH=\$PATH:/usr/local/go/bin" >> /etc/profile
source /etc/profile

验证是否安装成功

1
2
go version
go version go1.5 linux/amd64 # 显示版本号 说明安装成功

Go1.5 安装结束


Install Git 2.5.0 On CentOS 6

安装依赖包

1
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel -y

下载源码包 git-2.5.0

1
2
3
4
5
cd /tmp
wget https://www.kernel.org/pub/software/scm/git/git-2.5.0.tar.gz

如果提示证书错误或者无法下载,用下面这个命令试一下:
wget -r -np -nd --accept=gz --no-check-certificate wget https://www.kernel.org/pub/software/scm/git/git-2.5.0.tar.gz

解压 编译 安装

1
2
3
4
5
tar xvzf /tmp/git-2.5.0.tar.gz
cd git-2.5.0
./configure --prefix=/usr/local/git
make
make install

配置环境变量并验证是否安装成功

1
2
3
4
5
echo "export PATH=\$PATH:/usr/local/git/bin" >> /etc/profile
source /etc/profile

git --version
git version 2.5.0 # 显示版本号 说明安装成功

Git2.5.0 安装结束


Install ngrok 2.x On CentOS 6

获取ngrok源码

1
2
cd /usr/ngrok       #这里改为自己的安装目录
git clone https://github.com/inconshreveable/ngrok.git

生成自签名ssl证书 “51ngrok.cn” 替换为你自己的域名

1
2
3
4
5
6
7
8
9
10
cd /tmp/ngrok

openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=51ngrok.cn" -days 5000 -out rootCA.pem
openssl genrsa -out device.key 2048
openssl req -new -key device.key -subj "/CN=51ngrok.cn" -out device.csr
openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key

设置变量并生成ngrok服务端和客户端

1
2
3
#如果是32位系统,这里 GOARCH=386
GOOS=linux GOARCH=amd64
make release-server release-client

编译之后,就会在ngrok源码的bin目录下生成两个可执行文件:ngrokd、ngrok。其中ngrokd就是ngrok的服务端程序,ngrok就是ngrok的客户端程序。由于现在生成的客户端ngrok只能在linux下运行,因此如果想要生成windows下的客户端程序,需要继续进行交叉编译。

交叉编译生成windows客户端
1
2
3
4
cd  /tmp/ngrok/

GOOS=windows GOARCH=amd64
make release-server release-client

ngrokd服务启动

1
2
3
4
cd  /usr/ngrok/bin

#因为服务器上还有其他网站,这里选择端口为8080与8081
./ngrokd -domain="51ngrok.cn" -httpAddr=":8080" -httpsAddr=":8081"

推荐使用screen一个新连接来执行,或者使用nohup / &后台运行。

设置nginx的端口转发

修改服务器nginx安装路径下,conf文件夹下的nginx.conf文件,添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name *.51ngrok.cn;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host:8080;
proxy_set_header X-Nginx-Proxy true;
proxy_set_header Connection "";
proxy_pass http://127.0.0.1:8080;
}
}

ngrok 客户端使用

客户端使用,拷贝刚刚生成的ngrok 或者 ngrok.exe文件到本地,创建ngrok.cfg配置文件,可以根据自己的实际情况进行配置

1
2
3
4
5
6
7
8
9
10
创建ngrok.cfg配置文件:
server_addr: "51ngrok.cn:4443"
trust_host_root_certs: false

启动ngrok客户端:
./ngrok -config=ngrok.cfg -subdomain test 8080

ngrok客户端启动参数说明:
"test" 是你自己定义的二级域名,不能与其他人重复
"8080" 是你本地服务的端口

现在可以在外网通过访问http://test.51ngrok.cn这个地址来访问本地8080端口服务了

坚持技术分享,您的支持将鼓励我继续创作!