一、环境要求:
1、有公网ip(云服务器)
2、有域名
二、搭建golang环境
wget https://studygolang.com/dl/golang/go1.13.4.linux-amd64.tar.gz
tar -C /usr/local/ -zxvf go1.13.4.linux-amd64.tar.gz
#配置系统变量
echo 'export PATH=$PATH:/usr/local/go/bin'>>/etc/profile
source /etc/profile
go version
//修改go代理环境
go env -w GOPROXY=https://goproxy.cn
必须下载13版本golang,否则报错:
go get ngrok/...: malformed module path "ngrok": missing dot in first path element
三、搭建git环境
# 卸载自带的git,重新编译安装2.17版git
yum remove git
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker
wget https://github.com/git/git/archive/v2.17.0.tar.gz
tar -zxvf git-2.17.0.tar.gz
cd git-2.17.0
make prefix=/usr/local/git all
make prefix=/usr/local/git install
echo "export PATH=$PATH:/usr/local/git/bin" >> ~/.bashrc
source ~/.bashrc
git --version
四、生成ssl证书
为域名sumengnan.com生成证书
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=sumengnan.com" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=sumengnan.com" -out server.csr openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
此时目录下生成几个文件
server.crt(之后会用)、server.csr、server.key(之后会用)、rootCA.key、rootCA.pem(之后会用)、rootCA.srl
五、下载ngrok
git clone https://github.com/inconshreveable/ngrok.git
如果拉不下来直接下载解压也行
https://github.com/inconshreveable/ngrok/archive/refs/tags/1.7.1.tar.gz
替换密钥:把上一步生成的ssl证书和密钥替换原有ngrok的
cp rootCA.pem ngrok/assets/client/tls/ngrokroot.crt
cp server.crt ngrok/assets/server/tls/snakeoil.crt
cp server.key ngrok/assets/server/tls/snakeoil.key
六、生成ngrokd服务端和ngrok客户端
编译前说明:如果生成过程中存在git下载不下来,你有两种方法:
1、切换golang代理:
go env -w GOPROXY=https://goproxy.io,direct
下载可能会失败多次,多试几次也能拉下来
2、可以先下载到本地,然后上传到对应的报错的目录下
如:src/http://github.com
附网盘链接: https://pan.baidu.com/s/1nHtjnbO3UslYhNzxvm5cCg?pwd=oijv 提取码: oijv(解压替换整个src文件夹即可)
自己操作系统对应哪个,就执行如下的哪条命令(在ngrok文件夹下,此文件夹下必须有Makefile)。
386表示32位系统
amd64表示64位系统
cd ngrok
#linux服务端
GOOS=linux GOARCH=386 make release-server (32位)
GOOS=linux GOARCH=amd64 make release-server(64位)
#linux客户端
GOOS=linux GOARCH=386 make release-client (32位)
GOOS=linux GOARCH=amd64 make release-client(64位)
Mac OS服务端
GOOS=darwin GOARCH=386 make release-server
GOOS=darwin GOARCH=amd64 make release-server
#Mac OS客户端
GOOS=darwin GOARCH=386 make release-client
GOOS=darwin GOARCH=amd64 make release-client
#windows服务端
GOOS=windows GOARCH=386 make release-server
GOOS=windows GOARCH=amd64 make release-server
#windows客户端
GOOS=windows GOARCH=386 make release-client
GOOS=windows GOARCH=amd64 make release-client
生成成功后就可以在bin目录下发现生成的程序
[root@localhost bin]# ls
go-bindata ngrok ngrokd
ngrokd为服务端(云端)程序
ngrok为客户端程序
七、服务器(云端)启动
可以把ngrokd放到/usr/local/bin下,就可以直接使用ngrokd命令了
- 把server.key放到/etc/ssl/keys下:cp -rf servcer.key /etc/ssl/certsngrok-server.key
- 把servcer.crt放到/etc/ssl/certs下:cp -rf servcer.crt /etc/ssl/certsngrok-server.crt
ngrokd -tlsKey=/etc/ssl/keys/ngrok-server.key -tlsCrt=/etc/ssl/certs/ngrok-server.crt -domain="sumengnan.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
参数解释:
- #-domain 为主域名
- #-httpAddr 监听http请求的端口,再把请求转发到客户端
- #-httpsAddr 监听https 请求的端口 ,再把请求转发到客户端
- #-tunnerlAddr 客户端连接的端口,默认4443
- #-tlsKey 服务端私钥文件
- #-tlsCrt 服务端证书文件
最好把服务端(云端)制作成linux服务(方便守护ngrokd进程及开机自启),方法为:
1、把下面命令放到脚本中:vim /usr/local/bin/ngrok_start
#!/bin/bash
ngrokd -tlsKey=/etc/ssl/keys/ngrok-server.key -tlsCrt=/etc/ssl/certs/ngrok-server.crt -domain="sumengnan.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443" -log=/var/log/ngrok.log -log-level=DEBUG
chmod 777 /usr/local/bin/ngrok_start
2、编辑服务文件:vim /lib/systemd/system/ngrokd.service
[Unit]
Description=ngrokd service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/ngrokd_start
RestartSec=1s
Restart=always
[Install]
Alias=ngrokd
WantedBy=multi-user.target
3、启动服务
systemctl daemon-reload 重新加载unit配置
systemctl start ngrokd 启动服务
ctrl+c
ps -ef|grep ngrokd 查看一下是否有进程
systemctl enable ngrokd 设置开机自启
八、客户端启动
1、把ngrok文件传到客户端的/usr/local/bin下
2、在客户端新建ngrok配置文件
vim /etc/ngrok.cfg
server_addr: sumengnan.com:4443
trust_host_root_certs: false
tunnels:
weixin:
subdomain: weixin
proto:
http: 8002
mysql:
remote_port: 3306
proto:
tcp: 3306
ssh:
remote_port: 222
proto:
tcp: 22
配置说明:
server_addr为ngrok服务端的地址,4443对应服务端的-tunnerlAddr参数
trust_host_root_certs
tunnels表示要穿透的隧道,有3个名称分别为weixin、mysql、ssh
- weixin表示当http访问weixin.sumengnan.com时,服务端会把请求转发到客户端的8002端口上。
- mysql表示在服务端监听3306端口,并把tcp请求转发到客户端的3306端口上
- ssh表示在服务端监听222端口,并把tcp请求转发到客户端的22端口上
3、两种启动方式(前台启动):
- ngrok -config /etc/ngrok.cfg start weixin #可以启动特定转发,如weixin
- ngrok -config /etc/ngrok.cfg start-all 启动所有转发
服务端注意把防火墙端口打开,如果使用了http,注意添加域名解析
4、后台启动
由于ngrok客户端不能后台运行,所以需要安装screen
yum install screen
添加启动脚本
vim /usr/local/bin/ngrok_start
#!/bin/bash
screen -dmS ngrok
screen -x -S ngrok -p 0 -X stuff "ngrok -config=/etc/ngrok.cfg -log=/var/log/ngrok.log start-all"
screen -x -S ngrok -p 0 -X stuff $'\n'
chmod 777 /usr/local/bin/ngrok_start
5、添加开机启动
(1)、脚本添加开机启动文件中
vim /etc/rc.d/rc.local
# 文件尾增加一行
/usr/local/bin/ngrok_start
chmod +x /etc/rc.d/rc.local
重启客户端机器试下
(2)、做成linux服务(推荐)
vim /lib/systemd/system/ngrok.service
[Unit]
Description=ngrok service
After=network.target
[Service]
#Type=forking
ExecStart=/usr/local/bin/ngrok_start
RestartSec=10s
Restart=always
Group=root
User=root
[Install]
Alias=ngrok
WantedBy=multi-user.target
systemctl daemon-reload 重新加载unit配置
systemctl start ngrok 启动服务
systemctl enable ngrok 设置开机自启