使用ngrok一分钟实现内网穿透


一分钟有点夸张,5分钟总可以将本地web服务映射到公网了吧。
简书地址

1、 因果

周末作为纯后端,与前端同事联调微信jsapi的授权接口,听说就一个接口,不用数据库,不鸟权限的事,就是从服务端向微信发起一个请求token和ticket的接口,返回给前端而已。原计划半个小时搞定的,结果搞了三个多小时,如果不是参考原来一个项目里的实现,估计在加两个小时也不一定能搞出个成品。
因为微信限制调用频次,而且本地获取还需要加白名单,但是给前端同事联调的话还需要打包扔到一台公网服务器上,甚是麻烦啊,于是想这次弄完看看搞一个内网穿透,再有类似场景,直接使用。

2、名词解释

2.1、为什么需要内网穿透

当内网中的主机没有静态IP地址要被外网稳定访问时可以使用内网穿透

在互联网中唯一定位一台主机的方法是通过公网的IP地址,但固定IP是一种非常稀缺的资源,不可能给每个公司都分配一个,且许多中小公司不愿意为高昂的费用买单,多数公司直接或间接的拨号上网,电信部门会给接入网络的用户分配IP地址,以前上网用户少的时候基本分配的都是临时的静态IP地址,租约过了之后可能会更换成另一个IP地址,这样外网访问就不稳定,因为内网的静态IP地址一直变化,为了解决这个问题可以使用动态域名解析的办法变换域名指向的静态IP地址。但是现在越来越多的上网用户使得临时分配的静态IP地址也不够用了,电信部门开始分配一些虚拟的静态IP地址,这些IP是公网不能直接访问的,如以125开头的一些IP地址,以前单纯的动态域名解析就不好用了。

2.2、内网穿透的定义与障碍

简单来说实现不同局域网内的主机之间通过互联网进行通信的技术叫内网穿透。

障碍一:位于局域网内的主机有两套 IP 地址,一套是局域网内的 IP 地址,通常是动态分配的,仅供局域网内的主机间通信使用;一套是经过网关转换后的外网 IP 地址,用于与外网程。

ngrok原理图

障碍二:位于不同局域网内的两台主机,即使是知道了对方的 IP 地址和端口号,“一厢情愿”地将数据包发送过去,对方也是接收不到的。

因为出于安全起见,除非是主机主动向对方发出了连接请求(这时会在该主机的数据结构中留下一条记录),否则,当主机接收到数据包时,如果在其数据结构中查询不到对应的记录,那些不请自来的数据包将会被丢弃。

ngrok原理图2

解决办法:要想解决以上两大障碍,我们需要借助一台具有公网 IP 的服务器进行桥接。

3、 选型

3.1、花生壳

花生壳既是内网穿透软件、内网映射软件,也是端口映射软件。规模最大,较正规,完善。

收费高,使用简单

官网:http://www.oray.com/

花生壳

3.2、Nat123

nat123是内网端口映射与动态域名解析软件,在内网启动映射后,可在外网访问连接内网网站等应用。整个网站我都没有找到客服电话,网友发了一些反面的评价

收费,使用简单

官网:http://www.nat123.com

Nat123

3.3、NATAPP

NATAPP基于ngrok的国内内网穿透服务,免费版会强制更换域名,临时用一下可以

收费,使用简单

官网:https://natapp.cn/

NATAPP

3.4、frp与其它

frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。

开源免费

使用相对复杂,需要代理服务器支持

官网:https://github.com/fatedier/frp

文档:查看帮助文档简书示例

利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。

对于 http, https 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。

利用处于内网或防火墙后的机器,对外网环境提供 tcp 和 udp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。

frp

因为frp 仍然处于前期开发阶段,未经充分测试与验证,不推荐用于生产环境,所有我选择了ngrok,资料比较多。

还有如圣剑内网通、ngrok(开源免费)、更多办法

3.5、ngrok

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

开源免费

官网:https://ngrok.com/

源码:https://github.com/inconshreveable/ngrok

ngrok

ngrok1.x开源,ngrok2.x不开源

ngrok使用go语言开发,源代码分为客户端与服务器端。

国内免费服务器:http://ngrok.ciqiuwl.cn/,更多免费服务器请大家挖掘,资源共享,我随时更新:)

如果有服务器,仅客户端的使用是不复杂的,以上面的免费服务器为示例完成内网穿透

本屌丝一向没有多余钱给服务商,只能搜索免费的,最后选了ngrok

3、 搭建

搭建过程很简单,如果参考官网估计会走点弯路,因为windows对很多东西都有这要求。不过还好,找到了小米球ngrok,让所谓的搭建好像没什么可以说的了。
复制一下使用教程。

●windows用户:
1、下载windows版本的客户端,解压到你喜欢的目录
2、在命令行下进入到ngrok客户端目录下
3、执行 ngrok -config=ngrok.cfg -subdomain xxx 80 //(xxx 是你自定义的域名前缀)
4、如果开启成功 你就可以使用 xxx.ngrok.xiaomiqiu.cn 来访问你本机的 127.0.0.1:80 的服务啦
5、如果你自己有顶级域名,想通过自己的域名来访问本机的项目,那么先将自己的顶级域名解析到>120.25.161.137(域名需要已备案哦),然后执行 ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80 //(xxx.xxx.xxx是你自定义的顶级域名)
6、如果开启成功 你就可以使用你的顶级域名来访问你本机的 127.0.0.1:80 的服务啦
7、如果失败 就加下交流群 反馈下问题 本屌会看看什么原因….吧
8、如果实在闲命令打开麻烦,windows版提供了一键启动脚本!直接启动即可(其它版本没有脚本)
●linux用户:
只在centos6.5 amd64 下测试没有问题
1、下载linux版本的客户端,解压到你喜欢的目录,注意:要给ngrok文件的可执行权限
2、在命令行下进入到ngrok客户端目录下
3、执行 ./ngrok -config=ngrok.cfg -subdomain xxx 80 //(xxx 是你自定义的域名前缀)
4、如果开启成功 你就可以使用 xxx.ngrok.xiaomiqiu.cn 来访问你本机的 127.0.0.1:80 的服务啦
5、如果你自己有顶级域名,想通过自己的域名来访问本机的项目,那么先将自己的顶级域名解析到120.25.161.137 (域名需要已备案哦),然后执行./ngrok -config=ngrok.cfg -hostname xxx.xxx.xxx 80 //(xxx.xxx.xxx是你自定义的顶级域名)
6、如果开启成功 你就可以使用你的顶级域名来访问你本机的 127.0.0.1:80 的服务啦
7、最近有很多同学提到需要linux32位与arm版本,这边也新增了两个客户端,由于本屌没有相应设备或环境,请自行测试,如果有问题,可以反馈。
8、如果失败 就加下交流群 反馈下问题 本屌会看看什么原因….吧
●Mac 用户:
1、呃,虽然提供了mac版的客户端,但是本屌没有mac,所有没有测试!
2、所以你下载了之后 自己琢磨吧(应该和linux的使用一样….吧)…….
●其他使用方法
1、呃,虽然搭建了ngrok服务,但是实际上上面的教程只介绍了一些简单的操作
2、ngrok还有许多使用方法,大家可以多了解探索一下
3、比如,同时开启多个服务,TCP端口转发,这些大家可以在.cfg上进行配置,本屌就不一一叙述了。

3.1、下载

下载 windows 64位版(密码: p6n6),并解压,内包含3个文件:

ngrok.cfg
ngrok.exe
小米球Ngrok启动工具.bat

3.2、运行本地web服务

我现在本地运行我的程序,在80端口上,运行起来以后访问我写的获取微信签名的接口:
本地web接口

3.3、启动ngrok,配置映射

配置访问域名和端口
回车,提示配置成功,显示出访问地址:

显示出穿透地址

按照提示在浏览器访问一下:
![用公用域名访问](/images/tools/ngrok-public-host.png

然后再观察ngrok的控制台,发现已经记录了一条访问access log:
ngrok控制台log

到此,穿透完毕,so easy!

鸣谢

感谢小米球的分享
这篇文章用ngrok官网的指导使用也不错


评论
  目录