前言:微信公众号,小程序、钉钉等开发需要内网穿透工具。
1、经过不断的摸索和调试,完成ngrok内网穿透的工具的搭建,对于微信公众号,小程序、钉钉等开发提供便利性。
2、搭建环境Linux centos8 备案域名 域名证书(Let’s encrypt免费证书)
3、搭建步骤
1)安装git 拉取ngrok源码
yum install -y gcc gcc-c++ git zlib-devel openssl-devel perl
2)安装go,因为ngrok是使用GO语言编写
wget https://storage.googleapis.com/golang/go1.8.linux-amd64.tar.gz tar -C /usr/local/ -zxvf go1.8.linux-amd64.tar.gz
3)配置环境变量
vi /etc/profile
#在最后添加
export GOROOT=/usr/local/go export PATH=$PATH:$GOROOT/bin
更新环境变量让配置生效
source /etc/profile
验证是否安装正确
go version
[root@localhost bin]# go version go version go1.16.12 linux/amd64
4)下载ngrok源码 有三种方式
a、使用git直接clone (可能存在版本更新)
cd /usr/local/ git clone https://github.com/inconshreveable/ngrok.git
b、前辈已经处理好的ngrok 和相关的依赖 https://github.com/haungjianli/ngrok
cd /usr/local/ git clone https://github.com/haungjianli/ngrok
c、因为ngrok可能存在更新,直接把本次源码下载并且提交资源:已上传的ngrok源码下载
执行解压操作
tar -xvf ./ngrok.tar.gz
5)创建证书 注意这里是为了安装创建的证书,正式使用必须使用正式发布的签名证书
#进入ngrok目录 cd /usr/local/ngrok #使用openssl创建证书 openssl genrsa -out rootCA.key 2048 openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=ngrok.yxt.cn" -days 5000 -out rootCA.pem openssl genrsa -out device.key 2048 openssl req -new -key device.key -subj "/CN=ngrok.yxt.cn" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000
当前目录下有创建好的证书
6)将证书移动到 sever 和 client 执行一下命令 提示是否覆盖?按 y 覆盖
cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
7)生成服务端(这里会很慢,GitHub拉取数据太慢,需要多试几次,抛出fatal: unable to access ‘https://github.com/keepeye/log4go/’: Empty reply from server错误,不用担心)
cd /usr/local/ngrok/ #这里GOOS后面是你的系统,我是linux,GOARCH 后面是系统,64位是amd64,32位是386 GOOS=linux GOARCH=amd64 make release-server
这里可能出现一个错误 【log4go 会提示访问不到,修改源码,将该包改为 github 上的地址】
GOOS=“” GOARCH=“” go get github.com/jteeuwen/go-bindata/go-bindata
go get: module github.com/jteeuwen/go-bindata/go-bindata: Get “https://proxy.golang.org/github.com/jteeuwen/go-bindata/go-bindata/@v/list”: dial tcp 142.251.43.17:443: i/o timeout
make: *** [Makefile:22: bin/go-bindata] Error 1
解决:
#进入到log目录 cd /usr/local/ngrok/src/ngrok/log #修改参数值 #将原来的 log "github.com/alecthomae/log4go" 改为 log "github.com/keepeye/log4go" vi ./logger.go
将原来的 log “github.com/alecthomae/log4go” 改为 log “github.com/keepeye/log4go”
再次执行生成服务端
cd /usr/local/ngrok/ #这里GOOS后面是你的系统,我是linux,GOARCH 后面是系统,64位是amd64,32位是386 GOOS=linux GOARCH=amd64 make release
可能再次出现错误:
go get ngrok/…: malformed module path “ngrok”: missing dot in first path element
make: *** [Makefile:8: deps] Error 1
解决:
#处理异常 go env -w GO111MODULE=off
再次执行生成服务端
cd /usr/local/ngrok/ #这里GOOS后面是你的系统,我是linux,GOARCH 后面是系统,64位是amd64,32位是386 GOOS=linux GOARCH=amd64 make release
未报错即为成功
8)生成客户端 自己按照客户端系统来选 我是windows 64位
cd /usr/local/ngrok/ #windows 64位 GOOS=windows GOARCH=amd64 make release-client #windows 32位 GOOS=windows GOARCH=amd64 make release-client #Mac OS 32位 GOOS=darwin GOARCH=386 make release-client #Mac OS 64位 GOOS=darwin GOARCH=amd64 make release-client #Linux 64位 GOOS=linux GOARCH=amd64 make release-client #ARM 平台 GOOS=linux GOARCH=arm make release-client
9)执行完之后 /usr/local/ngrok/bin 会自动生成两个文件
a、windows_amd64 -> ngrok.exe(将其下载下来,本地PC需要其建立映射通道)
b、ngrokd (启动ngrok服务执行程序)
10)启动服务端
cd /usr/local/ngrok/bin #执行命令 注意 开放端口 80 443 4443 域名和证书保持一致 ngrokd -domain="ngrok.yxt.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
成功输出日志
-domain 域名和证书保持一致
-httpAddr http端口
-httpsAddr https 端口
-tunnerlAddr 客户端ngrok.exe连接端口
服务器后台保持运行
cd /usr/local/ngrok/bin #执行命令 注意 开放端口 80 443 4443 域名和证书保持一致 nohup ngrokd -domain="ngrok.yxt.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" &
本地PC电脑接入
将/usr/local/ngrok/bin下的windows_adm64下的 ngrok.exe 下载到PC电脑上,并创建ngrok.cfg文件和start.bat文件
配置连接信息
a、修改ngrok.cfg
server_addr: "ngrok.yxt.top:4443" trust_host_root_certs: false
b、修改start.bat
ngrok -config ngrok.cfg -subdomain yangdouya 127.0.0.1:8080
点击start.bat开启连接 连接失败
服务器日志抛出异常 因为我们使用的是自己创建的安全证书,计算机会认为是不安全 导致连接失败
remote error: tls: bad certificate
这里要先修改ngrok的文件 默认配置文件域名和我们使用域名不一样
#修改配置文件 cd /usr/local/ngrok/ngrok/src/ngrok/client #修改参数 vi ./model.go
解决办法 使用正式签名证书 这里我是使用免费的证书 (Let’s encrypt免费证书)
配置方法为:
a、使用Let’s encrypt生成的证书有以下的pem
cert.pem
chain.pem
fullchain.pem
privkey.pem
将这些pem证书文件上传到服务器后进行操作:
a、privkey.pem重命名为snakeoil.key,fullchain.pem的重命名为snakeoil.crt ,生成的snakeoil.crt 复制命名为 ngrokroot.crt
cp ./privkey.pem ./snakeoil.key cp ./fullchain.pem snakeoil.crt cp ./snakeoil.crt ./ngrokroot.crt
b、复制并且覆盖掉ngrok现有证书 提示后 按 y 确认覆盖
cp ./ngrokroot.crt /usr/local/ngrok/assets/client/tls/ngrokroot.crt cp ./snakeoil.crt /usr/local/ngrok/assets/server/tls/snakeoil.crt cp ./snakeoil.key /usr/local/ngrok/assets/server/tls/snakeoil.key
重新编译生成服务端和客户端
cd /usr/local/ngrok/ #编译生成服务端 GOOS=linux GOARCH=amd64 make release-server #编译生成客户端 GOOS=windows GOARCH=amd64 make release-client
开启服务端
cd /usr/local/ngrok/bin #执行命令 注意 开放端口 80 443 4443 域名和证书保持一致 nohup ngrokd -domain="ngrok.yxt.cn" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" &
使用ngrok客户端进行连接即可
搭建遇到很多坑,欢迎大家一起讨论



