1. 准备好一台主机,带公网IP
2. 准备一个一级域名,做好泛解析(二级域名的没有配置成功,汗。。。) 切记 一定要做好域名泛解析
二、安装必备软件包
yum install gettext curl-devel perl-devel zlib-devel
解决git clone 报SSL错误,需要执行下面的命令
yum update -y nss curl libcurl
三、安装到/usr/local
cd /usr/local
从github上下载软件包
git clone https://github.com/inconshreveable/ngrok.git ngrok
三、安装go
cd /usr/local
yum -y install wget
wget https://dl.google.com/go/go1.11.linux-amd64.tar.gz
tar -zxvf go1.11.linux-amd64.tar.gz
环境变量(vim /etc/profile)
export GOROOT=/usr/local/go
export NGROK_DOMAIN="ec2-54-180-30-121.ap-northeast-2.compute.amazonaws.com"
export PATH=$GOROOT/bin:$PATH
生效
source /etc/profile
四、安装准备-证书
进入到第一步下载的ngrok源码根目录,执行以下命令,会在当前文件夹生成六个文件
cd /usr/local/ngrok
mkdir cert
cd cert
运行下面5条命令
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
五、证书覆盖
yes|cp rootCA.pem ..assets/client/tls/ngrokroot.crt
或者使用
yes|cp rootCA.pem ../assets/client/tls/ngrokroot.crt 直接覆盖 不提示
yes|cp server.crt ../assets/server/tls/snakeoil.crt
yes|cp server.key ../assets/server/tls/snakeoil.key
六、编译
在下载的ngrok根目录编译
cd /usr/local/ngrok
make release-server 或者使用 GOOS=linux GOARCH=amd64 make release-server , 只要和操作系统能对应即可
# Linux客户端
GOOS=linux GOARCH=amd64 make release-client
# win客户端
GOOS=windows GOARCH=amd64 make release-client
编译完成之后把bin目录下windows的启动工具下载下来
# MacOS
GOOS=darwin GOARCH=amd64 make release-client
七、启动
cd /usr/local/ngrok
(不用)./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083"
./bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083"
如果不指定tunnelAddr 端口默认是 4443
八、配置客户端启动
1. 编译对应平台的客户端软件地址在cd /usr/local/ngrok/bin 下面,可以使用 fileZilla 等软件连接到Linux系统进行下载接口
2. 编写ngrok.cfg配置文件(注意冒号后面的空格,其实是yaml文件)
server_addr: "ongis.cn:4443"
trust_host_root_certs: false
九、客户端启动
./ngrok -config=ngrok.cfg -subdomain=ngrok 8080
十、客户端ngrok.cfg 复杂配置
server_addr: "myngrok.com:8083"
trust_host_root_certs: false
tunnels:
http:
subdomain: "www"
proto:
http: "8081"
https:
subdomain: "www"
proto:
https: "8082"
web:
proto:
http: "8050"
tcp:
proto:
tcp: "8001"
remote_port: 5555
ssh:
remote_port: 2222
proto:
tcp: "22"
ngrok -config=ngrok.cfg start web #启动web服务
ngrok -config=ngrok.cfg start tcp #启动tcp服务
ngrok -config=ngrok.cfg start web tcp #同时启动两个服务
ngrok -config=ngrok.cfg start-all #启动所有服务
*****第二种启动方式
同级目录下新建一个启动脚本startup.bat
@echo on
cd %cd%
ngrok -config=ngrok.cfg -log=ngrok.log 8080
*****************3.使用 ip 做域名时,随机生成的子域名导致地址错误
ngrok 客户端会自动生成一个随机子域名或者用户自定义一个,总之无论如何都会有一个域名,这就会导致 ip 域名无效, 例如http://92832de0.1.1.1.1 -> localhost:80, 解决办法就是改源码,去掉随机生成的 subdomain
// src/ngrok/server/tunel.go #89 行
// Register for random URL
t.url, err = tunnelRegistry.RegisterRepeat(func() string {
return fmt.Sprintf("%s://%x.%s", protocol, rand.Int31(), vhost)
}, t)
删掉 %x. rand.Int31(), 以及该文件第一行引入的 math/rand,重新编译出服务端与客户端即可。这样不加 -subdomain 选项就不会有子域名
*****设置开机自启动(可以启动停止,但是不能自启动
设置启动:执行以下操作,可以了
systemctl enable ngrok
systemctl start ngrok
)
systemctl is-enabled iptables.service
systemctl is-enabled servicename.service #查询服务是否开机启动
systemctl enable *.service #开机运行服务
systemctl disable *.service #取消开机运行
systemctl start *.service #启动服务
systemctl stop *.service #停止服务
systemctl restart *.service #重启服务
systemctl reload *.service #重新加载服务配置文件
systemctl status *.service #查询服务运行状态
设置:
vim /usr/lib/systemd/system/ngrok.service
cd /etc/systemd/system/ngrok.service
systemctl daemon-reload
systemctl start ngrok.service
systemctl status ngrok.service
systemctl enable ngrok.service
ngrok.service脚本内容:
[Unit]
Description=Share local port(s) with ngrok
After=syslog.target network.target
[Service]
PrivateTmp=true
Type=simple
Restart=always
RestartSec=1min
StandardOutput=null
StandardError=null
ExecStart=/usr/local/ngrok/bin/ngrokd -domain=ec2-54-180-30-121.ap-northeast-2.compute.amazonaws.com -httpAddr=:80 -httpsAddr=:443
ExecStop=/usr/bin/killall ngrok
[Install]
WantedBy=multi-user.target
*****防火墙设置(打开指定端口,不然启动了也无法访问):
systemctl disable firewalld(永久关闭防火墙)
firewall-cmd --zone=public --add-port=80/tcp(永久生效再加上 --permanent)
firewall-cmd --zone=public --add-port=4443/tcp --permanent
设置完成后重新启动防火墙: firewall-cmd --reload
*********************,优化ngrok服务-设置开机启动(可以不用)
一,在ngrok程序目录下新建一个启动脚本,例如:
start.sh
path=/usr/local/ngrok
$path
./bin/ngrokd -domain="$NGROK_DOMAIN" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":8083"
path为当前目录的路径
启动脚本要写后台启动的脚本,后面的启动项目根据自己需要来写
二,把ngrok程序制作成系统服务
在 /etc/rc.d/init.d目录下新建一个服务项目(ngrok),如下:
[plain] view plain copy
#!/bin/sh:
#chkconfig:2345 70 30
#description:ngrok
ngrok_path=/usr/local/ngrok
case "$1" in
start)
echo "start ngrok service.."
sh ${ngrok_path}/start.sh
;;
*)
exit 1
;;
esac
给该文件赋权限755
chmod 755 ngrok
三,注册ngrok服务自启动
chkconfig --add ngrok
测试服务是否能启动成功
service ngrok start
检查自启动的服务
chkconfig
设置启动:
systemctl enable ngrok
systemctl start ngrok
reboot