手头上有一台电脑,装的ubuntu18.04,配置还可以,而我的阿里云服务器内存较小,跑不了太多服务,于是便想到通过ngrok将本地主机的端口映射出去。
在配置内网映射前,首先我们要有一台云主机,如阿里云或者腾讯云,还要有一个属于自己的域名(最好是经过备案的)。
step1: dns泛域名解析
所谓泛域名解析,就是在正常的域名前加上*. 如下图中的 *.ngrok
setp2: 配置防火墙
ngrok默认使用4443端口, 在运行ngrok服务端时还需要一个监听监听端口,如8888, 在防火墙中要放开这两个端口。
setp3: 下载安装ngrok和go语言
ngrok需要go语言进行编译,首先安装go:
sudo apt install go
通过go version 查看go版本,如果版本小鱼1.7,可能会报错,这是要手动升级. 现将已有的go卸载,
apt purge golang-go
去官网下载最新的安装包 https://studygolang.com/dl, tar -xzvf *.tar.gz 命令解压 并通过 export PATH=$PATH: /*/go/bin 添加环境变量
接下来下载ngrok:
git clone https://github.com/inconshreveable/ngrok.git
生成自签名证书:
使用ngrok.com官方服务时,我们使用的是官方的SSL证书。自建ngrokd服务,如果不想买SSL证书,我们需要生成自己的自签名证书,并编译一个携带该证书的ngrok客户端。证书生成过程需要一个NGROK_BASE_DOMAIN。 以ngrok官方随机生成的地址693c358d.ngrok.com为例,其NGROK_BASE_DOMAIN就是“ngrok.com”,如果你要 提供服务的地址为“example.ngrok.xxx.com”,那NGROK_BASE_DOMAIN就应该 是“ngrok.xxx.com”。这里呢,我替换成自己的域名 “ngrok.xxx.fun”.
首先进入刚刚下载的ngrok目录
cd ngrok
NGROK_DOMAIN="ngrok.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
拷贝证书到指定位置:
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp server.key assets/server/tls/snakeoil.key
接下来进行编译:
make release-server release-client
编译完成后,会在bin目录下出现ngrok(客户端)和ngrokd(服务端)两个文件,代表编译成功。
step4 运行服务端:
./ngrokd -tlsKey="../assets/server/tls/snakeoil.key" -tlsCrt="../assets/server/tls/snakeoil.crt" -domain="ngrok.yourdomain.com" -httpAddr=":8888" -httpsAddr=":444"> /home/logs/ngrok.log &
tips:在运行命令的最后加上 & 可以让程序在后台运行
这时我们在浏览器访问ngrok.xxx.com:8888 访问,如果看到 Tunnel ngrok.xxx.com:8888 not found 说明服务端已经正常启动 了。
step5 启动客户端:
使用scp命令将阿里云上的ngrok客户端文件拷贝到本地主机
scp root@**.***.**.**:/*/ngrok/bin/ngrok /home/**/ngrok/
接下来进入与客户端同一级目录添加一个名为ngrok.cfg的配置文件, 并输入:
server_addr: ngrok.***.com:4443
trust_host_root_certs: false
tunnels:
tunnel1:
subdomain: test1 # 次一级域名
proto:
http: 80 #监听本地的80端口
tunnel2:
subdomain: test2
proto:
http: 8080
tips: yaml文件不可以使用tab,只能用空格,否则会报错
运行客户端:
./ngrok -config ngrok.cfg start tunnel1 tunnel2
现在,我们已经完成了内网的端口映射。
参考博文:https://my.oschina.net/djsoft/blog/1786635
https://blog.csdn.net/qq_34292044/article/details/78559128
https://free-e.net/112