原创

【环境部署系列】十分钟建自己的ngrok服务器,文末附免费ngrok客户端资源

一、必要条件

  1. 首先要有一台服务器,用来搭建ngrok的服务器
  2. 申请域名【如demo.com】(必须实名认证,才可以解析到你自己的公网ip)
  3. 首先域名解析到你的公网ip上,ngrok.demo.com--> **
  4. 再添加一条泛解析到你的公网ip上,*. ngrok.demo.com -->**

    ps:必须有公网ip,并且可以正常访问【本次测试使用的是CentOS 7 64位】
    ps:一般生效时间是10分钟,3和4都必须进行配置,后面的域名都要换成自己的


二、环境准备

2.1 安装git

# 安装git
yum install git

2.2 安装GO语言环境

# 安装Go语言环境
yum install golang

检查下go的env环境变量【如下信息显示环境安装成功】

# 检查Go语言环境
go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/root/.cache/go-build"
GOENV="/root/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/root/go"
...

三、配置ngrok

3.1 下载ngrok

# github.com 下载 ngrok源码
cd /usr/local/ 
git clone https://github.com/inconshreveable/ngrok.git

3.2 证书设置

3.2.1 生成证书

域名【ngrok.demo.com】换成自己的【注意一条一条执行】

# 生成证书
cd /usr/local/ngrok
openssl genrsa -out rootCA.key 2048  
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.demo.com" -days 5000 -out rootCA.pem  
openssl genrsa -out server.key 2048  
openssl req -new -key server.key -subj "/CN=ngrok.demo.com" -out server.csr 
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000

3.2.2 替换证书

过程会让你输入y 回车【注意一条一条执行】

# 替换证书
cp rootCA.pem assets/client/tls/ngrokroot.crt 
cp server.crt assets/server/tls/snakeoil.crt 
cp server.key assets/server/tls/snakeoil.key

3.3 生成客户端和服务端

3.3.1 编译生成服务端

cd /usr/local/ngrok/  
GOOS=linux GOARCH=amd64 make release-server

3.3.2 编译生成客户端

# 32位linux客户端: 
GOOS=linux GOARCH=386 make release-client

# 64位linux客户端: 
GOOS=linux GOARCH=amd64 make release-client

# 32位windows客户端: 
GOOS=windows GOARCH=386 make release-client

# 64位windows客户端: 
GOOS=windows GOARCH=amd64 make release-client

# 32位mac平台客户端:
GOOS=darwin GOARCH=386 make release-client

# 64位mac平台客户端:
GOOS=darwin GOARCH=amd64 make release-client

# ARM平台linux客户端: 
GOOS=linux GOARCH=arm make release-client

生成客户端文件位置

/usr/local/ngrok/bin

四、使用ngrok

4.1 启动服务器端

cd /usr/local/ngrok/bin
./ngrokd  -domain="ngrok.demo.com" -httpAddr=":8080" -httpsAddr=":8081" -tunnelAddr=":4443"
# -httpsAddr=":8081" -tunnelAddr=":4443" 都可以省略

此方法启动服务器,推出ssh客户端会停止ngrok服务,解决方案请往后看

4.2 客户端使用

4.2.1 下载客户端

cd /usr/local/ngrok/bin/windows_amd64
sz ngrok.exe

4.2.2 创建客户端配置文件ngrok.cfg

# 新建ngrok.cfg
server_addr: xxx.ngrok.demo.com:4443
trust_host_root_certs: false

4.2.3 新建startup.bat

# 新建startup.bat文件,文件内容:
ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=test1 8083
# 保存双击启动

4.3 配置ngrok后台运行

ngrok 加入系统服务及开机启动

4.3.1 创建ngrok.service文件

vi /usr/lib/systemd/system/ngrok.service

4.3.2 写入服务文件内容

# 在CentOS 7上利用systemctl添加自定义系统服务
[Unit]
Description=ngrok
After=network.target

[Service]
Type=simple  
Restart=always
RestartSec=1min
ExecStart=/usr/local/ngrok/bin/ngrokd -domain=ngrok.demo.cn -httpAddr=:8080 -httpsAddr=:8081 -tunnelAddr=:4443 %i
ExecStop=/usr/bin/killall ngrok
PrivateTmp=true

[Install]
WantedBy=multi-user.target

4.3.3 启动服务

# 重载系统服务:
1. systemctl daemon-reload

# 设置开机启动
2. systemctl enable ngrok.service

# 启动服务
3. systemctl start ngrok.service

常用命令

# 重载系统服务:
systemctl daemon-reload

#设置开机启动:
systemctl enable ngrok.service

#启动服务:
systemctl start ngrok.service

#停止服务:
systemctl stop ngrok.service

4.4 ngnix配置

# ngrok
upstream ngrok {
    server 127.0.0.1:8080;
    keepalive 64;
}

# ngrok 穿透
server {
    listen       80;
    server_name  *.ngrok.demo.com;
    location / {
        proxy_pass http://ngrok;
        proxy_redirect off;
        proxy_set_header Host $http_host:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
        expires 5s;
    }
}

此时客户端显示被映射的域名会带端口号:8080,不影响正常使用

5 和Nginx公用80端口的解决方案

通过查询资料,我注意到了一个地方,就是我们的服务器大部分是有公网和内网之分的,所以网卡也就有了两个,所以可不可以让nginx监听公网80端口,ngrok监听内网80端口不就完美解决这个问题了吗?

5.1 查看自己服务器的网卡数量

ifconfig -a

 如上图所示:我只有一个内网的网卡,ip是 172.27.0.14  ,估计我的公网ip是别的服务器转发给我的,不过就算我只有一个网卡也是可以实现我刚才所说的方式

 5.2:只有一个网卡,再配置一个网卡

172.27.0.15(如果你有两个网卡请忽略这一步)

ifconfig eth0:0 172.27.0.15/24 up

然后在通过ifconfig -a 命令查看网卡

如上图:现在我有了  172.27.0.14 (内网,但实际我的公网ip是别的服务器直接转发给这个ip的,所以这个ip对于我这个服务器来说,我的外网请求都来自这个ip) ,172.27.0.15(内网,自己添加的)

5.3 修改ngrok.service(让他监听 内网的80端口)

  1. [Unit]
  2. Description=ngrok
  3. After=network.target
  4. [Service]
  5. ExecStart=/usr/local/src/ngrok/bin/ngrokd -tlsKey=/usr/local/src/ngrok/server.key -tlsCrt=/usr/local/src/ngrok/server.crt -domain=ngrok.luckylxh.top -httpAddr=172.27.0.15:80 -httpsAddr=172.27.0.15:443
  6. [Install]
  7. WantedBy=multi-user.target

保存然后重载,和启动

  1. systemctl daemon-reload
  2. systemctl start ngrok.service

5.4 修改nginx.conf(监听公网的80端口,并且对ngrok的请求转发给内网的80端口)

  1. server {
  2.         listen       172.27.0.14:80;
  3.         server_name  *.ngrok.sikacode.com;
  4.         location / {
  5.               proxy_pass  http://172.27.0.15:80;
  6.               proxy_redirect off;
  7.               proxy_set_header   Host $http_host;
  8.               proxy_set_header   X-Real-IP        $remote_addr;
  9.               #proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
  10.               proxy_connect_timeout 1;
  11.               proxy_send_timeout 120;
  12.               proxy_read_timeout 120;
  13.         }
  14.     }:

重启nginx,然后启动客户端

到此,给你分配的域名上也没有讨厌的81端口了,后面你就可以愉快的玩耍了!!!

最后再补充一点:

ifconfig eth0:0 172.27.0.15/24 up

这个命令添加的假的网卡,在服务器重启后会失效的,要再次添加。这个大致有两个方案解决

第一个: 修改ip有关的配置文件(对我这种linux仅仅是能用的人太难了),

第二个: 在服务启动后自动执行一个脚本文件,把假的网卡自动的添加上。


6. 提供免费ngrok代理【QQ群: 205260377进群可得客户端】


正文到此结束
本文目录