一、安装git
# 安装git
yum install git
二、安装GO语言环境,注意ngrok编译只支持1.15以下的版本
# 下载:golang安装包 golang官网下载地址: https://golang.google.cn/dl/
wget https://dl.google.com/go/go1.14.15.linux-amd64.tar.gz
# 解压:解压压缩包到/usr/local目录
tar -C /usr/local -xzf go1.14.15.linux-amd64.tar.gz
# 配置环境变量
vi /etc/profile
# 最后一行添加
export PATH=$PATH:/usr/local/go/bin
#让配置生效
source /etc/profile
# 查看版本
go version
#检查下go的env环境变量
go env
三、下载ngrok
# github.com 下载 ngrok源码
cd /usr/local/
git clone https://github.com/inconshreveable/ngrok.git
四、生成证书
# 域名xxx.com 换成自己的
cd /usr/local/ngrok
NGROK_DOMAIN="xxx.com"
openssl genrsa -out rootCA.key 2048
openssl req -x509 -new -nodes -key rootCA.key -subj "/CN=$NGROK_DOMAIN" -days 5000 -out rootCA.pem
openssl genrsa -out server.key 2048
openssl req -new -key server.key -subj "/CN=$NGROK_DOMAIN" -out server.csr
openssl x509 -req -in server.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out server.crt -days 5000
五、 拷贝证书强制性覆盖ngrok原来的证书
\cp -rf rootCA.pem assets/client/tls/ngrokroot.crt
\cp -rf server.crt assets/server/tls/snakeoil.crt
\cp -rf server.key assets/server/tls/snakeoil.key
六、编译生成服务端
# 在/usr/local/ngrok/ 目录中编译生成服务端
GOOS=linux GOARCH=amd64 make release-server
七、编译生成客户端
# 64位linux客户端:
GOOS=linux GOARCH=amd64 make release-client
#64位windows客户端:
GOOS=windows GOARCH=amd64 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
八、启动服务
cd /usr/local/ngrok/bin
./ngrokd -domain="xxx.com" -httpAddr=":800" -httpsAddr=":801" -tunnelAddr=":8443"
# 指定TLS证书和密钥
./ngrokd -tlsKey="/path/to/tls.key" -tlsCrt="/path/to/tls.crt" -domain="xxx.com" -httpAddr=":800" -httpsAddr=":801" -tunnelAddr=":8443"
九、客户端配置文件ngrok.yml
# 新建ngrok.yml
server_addr: xxx.com:8443
trust_host_root_certs: false
十、本地启动客户端
# 目录下打开命令行
# 然后使用以下任一命令运行ngrok:
ngrok -config ngrok.yml 8080
ngrok -config ngrok.yml -subdomain wx 8080 # 或者指定域名 wx.xxx.com
十一、 加入系统服务
1、使用 systemctl 创建 ngrok 服务
在/usr/lib/systemd/system目录添加 ngrok.service
ngrok.service
[Unit]
Description=ngrok
After=network.target
[Service]
Type=simple
Restart=always
RestartSec=1min
ExecStart=/usr/local/ngrok/bin/ngrokd -domain=xqzgg.cn -httpAddr=:800 -httpsAddr=:801 -tunnelAddr=:8443 %i
ExecStop=/usr/bin/killall ngrok
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2、重载系统服务
systemctl daemon-reload
3、启动服务
systemctl start ngrok.service
4、设置开机启动
systemctl enable ngrok.service
5、ngrok服务命令
# 启动服务
systemctl start ngrok.service
# 停止服务
systemctl stop ngrok.service
# 重启服务
systemctl reload ngrok.service
# 检查服务状态
systemctl status ngrok.service
6、nginx.conf 配置文件
- 因为我的80端口被nginx占用,所以我需要nginx转发ngrok的请求
# ngrok 穿透
server {
listen 80;
# 指定 *.xxx.com 泛型域名
server_name *.xxxx.com xxxx.com;
location / {
proxy_pass http://127.0.0.1:800;
proxy_redirect off;
proxy_set_header Host $http_host:800;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 5s;
}
}
额外篇
SSL证书
1、 申请域名证书
在阿里云申请免费的ssl,申请完成后等待签发,并下载证书Nginx
2、解析域名
xxxx.com 和 *.xxxx.com
3、替换证书
- xxxx.com.key
- xxxx.com.pem
# 服务端
xxxx.com.key 替换 assets/server/tls/snakeoil.key
xxxx.com.pem 替换 assets/server/tls/snakeoil.crt
# 客户端
xxxx.com.pem 替换 assets/client/tls/ngrokroot.crt
4、重新编译服务端及客户端
# 服务端
GOOS=linux GOARCH=amd64 make release-server
#64位windows客户端:
GOOS=windows GOARCH=amd64 make release-client
5、启动服务
ngrokd -tlsKey=/usr/local/ngrok/assets/server/tls/snakeoil.key -tlsCrt=/usr/local/ngrok/assets/server/tls/snakeoil.crt -domain=xxx.com -httpAddr=:800 -httpsAddr=:801 -tunnelAddr=:8443
6、更改nginx配置
- 因为我的80端口被nginx占用,所以我需要nginx转发ngrok的请求
# nginx.conf 配置,需要开启ssl
server
{
listen 80;
listen 443 ssl http2;
server_name *.xxxx.com xxxx.com;
root /www/wwwroot/ngrok;
gzip off;
#SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
#error_page 404/404.html;
# 这里应该是你的域名证书
ssl_certificate /www/server/panel/vhost/cert/ngrok.com/fullchain.pem;
ssl_certificate_key /www/server/panel/vhost/cert/ngrok.com/privkey.pem;
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
add_header Strict-Transport-Security "max-age=31536000";
error_page 497 https://$host$request_uri;
#SSL-END
#一键申请SSL证书验证目录相关设置
location ~ \.well-known{
allow all;
}
location / {
proxy_pass http://127.0.0.1:800;
proxy_redirect off;
proxy_set_header Host $http_host:800;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires 5s;
}
access_log /www/wwwlogs/ngrok.com.log;
error_log /www/wwwlogs/ngrok.com.error.log;
}
后续定制及优化
通过以上操作,我们的ngrok服务器就已经成功搭建了,客户端也成功的跑了起来。但是,如果我们想要对ngrok进行一些定制和优化,可以参考这些后续定制及优化的方法。
1、修改客户端ngrok默认服务地址
客户端每次还需要加载配置文件,这样显得有些麻烦。能不能像官方服务那样直接执行命令ngrok 80就能使用呢?我们只需要在编译客户端之前,稍作修改即可。同样,如果需要指定域名可以执行命令ngrok -subdomain=test 80来运行客户端。
#修改默认服务地址
vim ./src/ngrok/client/model.go
#找到第23行,将
defaultServerAddr = "ngrokd.ngrok.com:443"
#修改为defaultServerAddr = "ngrok.dingdayu.com:4443" 即可
2、修改客户端ngrok左上角蓝色文字logo
运行客户端后,我们会发现在客户端左上角会有一个蓝色字体的“ngrok”字样的文字logo,如果觉得不太喜欢,或者想修改一下的话,可以在编译客户端之前,作如下修改。
#修改客户端蓝色文字logo
Vim ./src/ngrok/client/views/term/view.go
找到第100行,将
v.APrin
tf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "ngrok")
# 修改为
v.APrintf(termbox.ColorBlue|termbox.AttrBold, 0, 0, "your logo")
3、修改客户端帮助信息
ngrok客户端默认的帮助信息很少,我们可以在编译客户端之前,自己定制帮助内容。
#修改客户端默认帮助信息
vim ./src/ngrok/client/client/cli.go
4、客户端程序加壳优化
编译好的Windows客户端ngrok.exe大小为10MB,有点大,这样加载到内存中,需要读取硬盘的内容也相对较多,影响速度。所以,我们还可以给客户端程序加个压缩壳,对程序进行压缩。
# upx 官网地址
https://upx.github.io
# UPX (the Ultimate Packer for eXecutables)是一款先进的可运行程序文件压缩器。压缩过的可运行文件体积缩小50%-70% ,这样降低了磁盘占用空间、网络上传下载的时间和其他分布以及存储费用。