一般来说,外网要访问服务器,那么这个服务器必须绑定一个公网ip,现在可以购买的云服务器都是这样。比如个人要在家里组建服务器,而且要外网的客户端可以访问,这时候问题就出现了
- 问题1:现在一般家里是没有外网ip的,ip都是路由好几层的局域网ip
- 问题2:就算有外网ip,也是动态ip
准备
- 外网服务器一台,系统为Ubuntu
- 根域名,需要具有域名的A记录解析权限
- 内网测试机器,这里使用个人windows笔记本
正式工作
域名解析
首先需要一个域名作为ngrok的域名,比如ngrok.example.com,那么需要把ngrok.example.com和*.ngrok.example.com域名的A记录解析到外网服务器。
安装ngrok
安装Go环境
ngrok是Go语言开发的,需要安装Go环境
ubuntu使用 sudo apt install golang
安装
安装完成后使用 go version
验证是否安装成功。
下载ngrok源码
ngrok的官方github地址是:https://github.com/inconshreveable/ngrok
使用 git clone https://github.com/inconshreveable/ngrok.git
拉取代码。
生成自签名证书
删除
assets/client/tls
和assets/server/tls
目录下的所有证书文件-
在ngrok根目录创建脚本文件script,文件内容为:
将NGROK_DOMAIN替换成自己的ngrok域名cd /usr/local/ngrok NGROK_DOMAIN="ngrok.example.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 device.key 2048 openssl req -new -key device.key -subj "/CN=$NGROK_DOMAIN" -out device.csr openssl x509 -req -in device.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out device.crt -days 5000 cp rootCA.pem assets/client/tls/ngrokroot.crt cp device.crt assets/server/tls/snakeoil.crt cp device.key assets/server/tls/snakeoil.key
使用
sudo sh script
运行文件
编译服务端
Linux 平台 32 位系统:GOOS=linux GOARCH=386
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
Windows 平台 32 位系统:GOOS=windows GOARCH=386
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
MAC 平台 32 位系统:GOOS=darwin GOARCH=386
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64
ARM 平台:GOOS=linux GOARCH=arm
这是使用 GOOS=linux GOARCH=amd64 make release-server
编译linux服务端版本
编译客户端
Linux 平台 32 位系统:GOOS=linux GOARCH=386
Linux 平台 64 位系统:GOOS=linux GOARCH=amd64
Windows 平台 32 位系统:GOOS=windows GOARCH=386
Windows 平台 64 位系统:GOOS=windows GOARCH=amd64
MAC 平台 32 位系统:GOOS=darwin GOARCH=386
MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64
ARM 平台:GOOS=linux GOARCH=arm
这里使用GOOS=windows GOARCH=amd64 make release-client
编译windows客户端版本
运行服务端
- 编译完服务端后,在生成的bin下有ngrokd,把ngrok复制到服务器
- 运行服务
./ngrokd -domain="ngrok.example.com" -httpAddr=":8088" -httpsAddr=":8089" -tunnelAddr=":4000"
- 出现以下信息表示成功
运行客户端
- 编译完服务端后,在生成的bin/windows_amd64下有ngrok.exe,把ngrok.exe复制到笔记本电脑
- 创建ngrok.cfg,添加配置
server_addr: "ngrok.example.com:4000" trust_host_root_certs: false
- 运行服务
./ngrok -subdomain="vv" -config="ngrok.cfg" 8080
- 出现以下信息表示成功
测试
浏览器访问vv.ngrok.example.com:8088
就会被代理到内网机器的8080端口