在前面写了有篇利用frp实现内网穿透,在此介绍另外一种,它的名字叫:Ngrok

官网:https://ngrok.com/
Github:https://github.com/inconshreveable/ngrok

一、为什么选择Ngrok?
1)提供免费内网穿透服务,免费服务器支持绑定自定义域名;
2)管理内网服务器,内网web进行演示;
3)本地WEB外网访问、本地开发微信、TCP端口转发;
4)无需任何配置,下载客户端之后直接一条命令让外网访问您的内网不再是距离.
5)更多功能等待你探索。

二、搭建所需:
1)VPS一台,作为中间服务器(推荐腾讯云、阿里云)
2)域名一个(最好是备案了的)
3)xshell、xftp类似远程服务器工具

三、服务端搭建:
1)演示系统为Centos7.2、主要防火墙开启后面所需要的端口,将域名解析到服务器IP、如:n.51it.wang,则需要把*.n.51it.wang和n.51it.wang都要解析到服务器IP。
远程登录服务器直接执行以下命令:
yum install gcc git -y //按照依赖和git
wget https://studygolang.com/dl/golang/go1.8.linux-amd64.tar.gz //下载Go源码包,或者直接yum install golang -y
tar -zxvf go1.8.linux-amd64.tar.gz //解压Go源码包
vi /etc/profile //设置环境变量添加以下几行内容:

export GOROOT=你的go解压地址
export PATH=$PATH:$GOROOT/bin

source /etc/profile //环境变量生效
go version //查看go是否安装成功
git clone https://github.com/inconshreveable/ngrok.git //克隆ngrok项目
//下面生成ssl证书,直接复制粘贴

cd ngrok
NGROK_DOMAIN="n.51it.wang"
openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 5000 -subj "/CN=$NGROK_DOMAIN" -out base.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 base.pem -CAkey base.key -CAcreateserial -days 5000 -out server.crt

//下面复制证书,若提示覆盖直接输入Y

cp base.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目录下找到ngrokd和ngrok这两个文件。

nohup ./bin/ngrokd -tlsKey=server.key -tlsCrt=server.crt -domain="n.51it.wang" -httpAddr=":82" -httpsAddr=":8082" -tunnelAddr=":4443" > /dev/null 2>&1 & //后台运行ngrok

GOOS=windows GOARCH=amd64 make release-client //windows系统(编译完成后在ngrok/bin/windows_amd64下)
注:
如果是32位系统,GOARCH=386; 如果是64为系统,GOARCH=amd64
如果要编译linux,GOOS=linux;如果要编译window,GOOS=windows

到此Ngrok服务端部署完成。

四、客户端配置:
将服务器端生成的windows_amd64文件下载到windows机器上。
在同一目录下新建一个ngrok.cfg文件,写入一下内容:

server_addr: "你的域名:4443"
trust_host_root_certs: false
//若是要配置多个隧道可添加以下:
tunnels:
    www:
    proto: 
      http: "8080"
    mstsc:
        remote_port: 39001
        proto: 
        tcp: "127.0.0.1:3389"

启动客户端、cmd切换到目录下执行
ngrok.exe -config=./ngrok.cfg -subdomain aa 8080
//若是添加了多个配置启动为ngrok.exe -config=./ngrok.cfg start www mstsc
上面若需要在外网访问则是aa.n.51it.wang:82即可到内网的localhost:80
教你自己服务器搭建Ngrok
其他:
http协议:
ngrok.exe -config=./ngrok.cfg -subdomain aa -proto=http 8080
tcp协议:
ngrok.exe -config=./ngrok.cfg -subdomain aa -proto=udp 8080

到此,客户端配置完成。

五、优化
1)若要使用服务器的80端口,但是服务器80端口已被其他业务端口占用,则可以才用nginx代理,下面提供一份nginx参考配置文件:

upstream ngrok {
    server 127.0.0.1:82;
    keepalive 64;
}
server {
    listen 80;
    server_name n.51it.wang *.n.51it.wang;
    access_log  /www/wwwlogs/n.51it.wang.log;
    error_log  /www/wwwlogs/n.51it.wang.error.log;
    proxy_set_header "Host" $host:82;
    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $host:82;
        proxy_pass_header Server;
        proxy_redirect off;
        proxy_pass  http://ngrok;

    }
    access_log off;
    log_not_found off;
}

记住修改完后重启nginx生效。

参考文章:
https://blog.csdn.net/u010444106/article/details/80457985
https://www.javatang.com/archives/2018/04/17/05302345.html
http://yangbingdong.com/2017/self-hosted-build-ngrok-server/index.html
https://blog.csdn.net/thislirlu/article/details/53610418