ngrok内网穿透服务搭建

什么是ngrok

ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。ngrok 可捕获和分析所有通道上的流量,便于后期分析和重放。

内网穿透

内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。穿透后,你个人电脑指定的端口就会暴露在外网,可以通过域名来访问到你提供的服务。

典型用例

微信开发。如果你没有拥有内网穿透的工具,你要在微信测试公众号上面调试功能,只能发布到测试环境,严重影响开发效率。

ngrok服务搭建

准备资源

  1. 服务器1台,如:阿里云CentOS 6.8 64位,假设IP是1.2.3.4。
  2. 域名1个,已备案。如:wechat.userwyh.com,新增以下两个解析(本文在二级域名基础上做展示,即内网穿透要使用到三级域名,需要做泛解析)
    wechat.userwyh.com 映射到 1.2.3.4
    *.wechat.userwyh.com 映射到 1.2.3.4
    配置好后,可以ping一下随便一个三级域名,如:dev.wechat.userwyh.com,如果能ping通那就可以继续往下了。

环境准备

yum -y install zlib-devel openssl-devel perl hg cpio expat-devel gettext-devel curl curl-devel perl-ExtUtils-MakeMaker hg wget gcc gcc-c++ git

GO语言环境

  1. 首先拿梯子去go官网下载对应的安装包 ,64位 OR 32位 | 当然其他地方也有的 : )。
  2. 将文件上传到服务器
  3. 执行以下命令
  4. 解压:tar -C /usr/local -xzf go1.12.linux-amd64.tar.gz
  5. 设置环境:vim /etc/profile
    新增一行 export PATH=$PATH:/usr/local/go/bin
  6. 使环境生效:source /etc/profile
  7. 验证:go version
    输出[go version go1.12 linux/amd64]就代表万事大吉了。

ngrok服务

下载源码

git clone https://github.com/inconshreveable/ngrok.git
cd ngrok

生成证书

NGROK_DOMAIN="wechat.userwyh.com"

openssl genrsa -out base.key 2048
openssl req -new -x509 -nodes -key base.key -days 10000 -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 10000 -out server.crt

替换证书

cp base.pem assets/client/tls/ngrokroot.crt
cp server.crt assets/server/tls/snakeoil.crt
cp dserver.key assets/server/tls/snakeoil.key

编译

make release-server

运行

./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="wechat.userwyh.com"  -httpAddr=":8888" -httpsAddr=":7443" -tunnelAddr=":4443"
#参数说明:
#-domain 生成证书时配置的NGROK_DOMAIN
#-httpAddr http协议端口,默认为80
#-httpsAddr https协议端口,默认为443
#-tunnelAddr 通道端口,默认4443

后台运行

setsid ./bin/ngrokd -tlsKey="assets/server/tls/snakeoil.key" -tlsCrt="assets/server/tls/snakeoil.crt" -domain="wechat.userwyh.com"  -httpAddr=":8888" -httpsAddr=":7443" -tunnelAddr=":8443"

客户端

客户端生成根据自己电脑的实际环境执行相应的命令。执行成功后在bin目录下会有一个windows_amd64,把它下载到自己的电脑上。

GOOS=windows GOARCH=amd64 make release-client
----------------------------------------------------------------------------------------
#MAC 平台 32 位系统:GOOS=darwin GOARCH=386 make release-client
#MAC 平台 64 位系统:GOOS=darwin GOARCH=amd64 make release-client
#ARM 平台:GOOS=linux GOARCH=arm make release-client
#Linux 平台 32 位系统:GOOS=linux GOARCH=386 make release-client
#Linux 平台 64 位系统:GOOS=linux GOARCH=amd64 make release-client
#Windows 平台 32 位系统:GOOS=windows GOARCH=386 make release-client
#Windows 平台 64 位系统:GOOS=windows GOARCH=amd64 make release-client

下载完成后,在ngrok.exe同级目录下创建一个简单的配置文件ngrok.cfg

server_addr: "wechat.userwyh.com:4443"
trust_host_root_certs: false

注意:server_addr由在CentOS上面配置的NGROK_DOMAIN:tunnelAddr组成
然后可以使用命令启动

ngrok -config=ngrok.cfg -log=ngrok.log -subdomain=dev 8080
#参数说明:
-config:你的配置文件,就上面创建那个
-log:日志文件地址
-subdomain:三级域名 本地服务端口号

启动正常的话会控制台会输出如下内容,此时你就可以通过域名【http://dev.wechat.userwyh.com:8888】来访问你的本地服务了。如果访问不了,可以看看自己域名映射配置正确了没有,看【准备资源】一节。

ngrok                                                           (Ctrl+C to quit)

Tunnel Status                 online
Version                       1.7/1.7
Forwarding                    http://dev.wechat.userwyh.com:8888 -> 127.0.0.1:8080
Forwarding                    https://dev.wechat.userwyh.com:8888 -> 127.0.0.1:8080
Web Interface                 127.0.0.1:4040
# Conn                        0
Avg Conn Time                 0.00ms

nginx配置

上面的配置已经实现了内网穿透,但是你会发现访问的时候要带个端口号,但是微信开发的时候只能使用80端口,就是说到这里,我们还是白忙活,还是不能在本地快乐的编码。我们一般也不能直接把80端口配置给了ngrok,因为80端口一般是nginx这个大佬占据的,所以我们只能在nginx上面做一下转发,如下:

server {
       listen 80;
       server_name dev.wechat.userwyh.com;
       location / {
           proxy_pass  http://dev.wechat.userwyh.com:8888/;
           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;
       }
}

然后重启一下nginx,你就可以使用不带端口号的域名【http://dev.wechat.userwyh.com】进行访问了。
如果你觉得可以使用80端口给ngrok,那么也是可以的,忽略本节。

总结

针对诸如微信公众号等开发者来说,如果自己有一台服务器和一个域名,那还是得自己搭一个ngrok服务,接下来,就没有无穷无尽的部署到外网环境了,只管快乐的编码,还有烦躁的调试,改BUG :)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值