工具|NGROK 内网穿透搭建

ngrok是一个反向代理的小工具,可以直接从官网下载ngrok客户端,连接官方的服务,达到内网穿透目的,但由于官方服务器在国外,加上一些不可描述的原因,导致直接使用官方提供的服务比较慢。国内也有很多内网穿透的服务,如:natapp,但是追根溯源使用的都是使用该公司开放的1.7版本的源码编译的。以下将要演示的也是用1.7版的源码进行编译,在此感谢开源世界,由此才能站在巨人的肩膀。

准备工作

安装步骤

  1. 安装git(非必须,安装是为了方便下载ngrok源码)
yum install git
  1. 安装golang (ngrok是由go语言开发)
yum install golang
  1. 安装openssl (非必须,制作证书时使用)
yum install openssl
  1. 下载源码到 /usr/local/ngrok 目录
git clone https://github.com/inconshreveable/ngrok.git /usr/local/ngrok
  1. 制作证书(非必须,如果有可用的https证书就无需制作)
#这里替换为自己的域名
export NGROK_DOMAIN="yuhaowin.com"
#进入到ngrok目录生成证书
cd /usr/local/ngrok	
#下面的命令用于生成证书
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
#将我们生成的证书替换ngrok默认的证书
cp rootCA.pem assets/client/tls/ngrokroot.crt
cp device.crt assets/server/tls/snakeoil.crt
cp device.key assets/server/tls/snakeoil.key
  1. 编译服务端和客户端到 ngrok/bin
#编译64位linux服务端
GOOS=linux   GOARCH=amd64 make release-server
#编译64位windows服务端
GOOS=windows GOARCH=amd64 make release-server
#编译64位mac客户端
GOOS=darwin  GOARCH=amd64 make release-client
#编译64位windows客户端
GOOS=windows GOARCH=amd64 make release-client
  1. 启动服务端
#指定我们刚才设置的域名,指定http, https, tcp端口号,端口号不要跟其他程序冲突
./bin/ngrokd -domain="yuhaowin.com" -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"
  1. 启动客户端
#先编写ngrok.cfg的配置文件,内容如下
server_addr: "yuhaowin.com:4443" //填写在制作证书是配置的域名,端口填写启动服务端tunnel端口,这里是4443,
trust_host_root_certs: false //如果有可用证书 true 自己制作证书 false
#Windows启动
ngrok.exe -subdomain=test -config=ngrok.cfg    8080
#Mac os启动
./ngrok   -subdomain=test -config=./ngrok.cfg  8080 

几点说明

1、服务端使用的三个端口说明

2、如果使用可用的https证书,在编译服务端和客户端时无需替换3个证书,但是在启动服务时需要指定证书路径。

./bin/ngrokd -tlsKey="/root/.acme.sh/yuhaowin.com/yuhaowin.com.key" -tlsCrt="/root/.acme.sh/yuhaowin.com/fullchain.cer" -domain="yuhaowin.com"  -httpAddr=":80" -httpsAddr=":443" -tunnelAddr=":4443"

3、https证书获取脚本

curl  https://get.acme.sh | sh
alias acme.sh=~/.acme.sh/acme.sh
export DP_Id="126022**"
export DP_Key="9777368c091db846d459757f42b43**"
acme.sh --issue --dns dns_dp -d yuhaowin.com -d *.yuhaowin.com
#生成的证书在 ~/.acme.sh 目录下

#使用 --installcert 命令,并指定目标位置, 然后证书文件会被copy到相应的位置
acme.sh --installcert  -d  <domain>.com   \
        --key-file   /etc/nginx/ssl/<domain>.key \
        --fullchain-file /etc/nginx/ssl/fullchain.cer \
        --reloadcmd  "service nginx force-reload"

注意:windows 用户不能使用 PowerShell 启动,必须使用 cmd 启动。

80 端口 和 443 端口 这种特殊端口不能 ngrok 占据,过于浪费,同时又为了解决微信对非 80、443 端口的限制,服务端使用 nginx 对 ngrok 做了反向代理。因此,直接访问 https://test.yuhaowin.comhttps://test.yuhaowin.com 即可代理 127.0.0.1:6001 服务。

nginx 反向代理 ngrok 配置

    # HTTPS server
    server {
        listen       443 ssl;
        server_name  *.yuhaowin.com;
        ssl_certificate      ../ssl/yuhaowin.com/fullchain.cer;
        ssl_certificate_key  ../ssl/yuhaowin.com/yuhaowin.com.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        location / {
            proxy_pass http://127.0.0.1:8848;
            proxy_set_header Host $host:8848;  #$host指与server_name相同
            proxy_redirect off;
            client_max_body_size 10m;
            client_body_buffer_size 128k;
            proxy_connect_timeout 90;
            proxy_read_timeout 90;
            proxy_buffer_size 4k;
            proxy_buffers 6 128k;
            proxy_busy_buffers_size 256k;
            proxy_temp_file_write_size 256k;
        }
        #解决配置反向代理后js css文件无法加载问题
        location ~ .*\.(js|css)$ {
            proxy_pass http://127.0.0.1:8848;
            proxy_set_header Host $host:8848; #$host指与server_name相同
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }