浅谈为什么要用ngrok

一句话道明本质

ngrok大名早有所闻,但搞明白怎么回事,也是最近做站点建设和开发才领会到一点。这里有篇不错的文章从零教你搭建ngrok服务,解决外网调试本地站点,具体操作我参考了下,顺利实现。下面主要是解释一下为什么要用ngrok。

如果你搭建了一个服务器在网络上,别人能访问到至少需要提供三个信息:协议,地址和端口。其中的地址就是重点了,一般而言,如果你的服务器就是别人访问的服务器,你应该拥有一个公网IP地址。比如我现在手上的VPS每台都是配备了一个IPv4的公网地址。但问题在于有时候你的服务器没有公网IP地址,或者说你的服务器是从内网到公网的NAT,那别人如何访问?端口映射(转发),可以把出入口公网IP的某个端口映射到你的服务器的某个端口上。这样貌似也能解决问题。

然而问题又在于,现实中端口映射不是那么好办,例如,一般家庭用的路由拨号上网,家里的一台电脑拿的是LAN的私有IP,路由器获取的是运营商分配的公网IP。那么端口映射需要在路由器上完成,然而运营商做为你公网IP的上面节点,很有可能做了端口限制(常见的禁用80端口),更何况相当多人是拿不到公网IP的。这种情况下,就没法一路打通的去做端口映射,总有个地方挡住,而你又无可奈何的。

这时候要引入一个反向代理的概念了。正向代理是大家熟知的,你访问一个代理服务器,它访问许多个网站。这种情况,许多个网站不知道你是谁,他们只知道代理服务器访问了自己。反向就是,你就是一个网站,许多个人通过一个代理服务器访问你。这样,许多个人不知道你是谁,他们只要知道代理服务器就可以访问到你。反向代理服务器有公网IP,问题解决有望了。

之前文章说过,反向代理一般用在服务器集群,Web前端服务器是同时对内外的,对外提供Web服务,对内反向代理内网的应用服务器。用在这个问题上的话,场景肯定不同,反向代理服务器不是你内网的机器,也是一个公网上的服务器。或者说,它也是一个公网访客,它要访问你内网服务器也是一样有问题的,那怎么办?这事就要交给ngrok了。ngrok基本上做的就是两件事,一件对外,提供服务器给公网访客用的,另一件对“内”(因为实际上你跟他并不是内网),代理到你的内网服务器,通过ngrok建立的特殊通道(也叫隧道穿透)。这样一来,问题解决了。

给防火墙穿了个洞

因为ngrok算是一个web服务器,所以域名支持也是必须的。简单而言,在配置ngrok服务端的时候,需要给定一个域名和泛子域名。然后在配置具体的ngrok服务,也就是ngrok客户端设定启用时给定一个子域名。举个例子,假设ngrok服务器地址是1.2.3.4,域名是ngroksrv.com,你的服务器地址是192.168.0.88(公网地址是什么无所谓,只要能和1.2.3.4联通),你设定的子域名是myapp,ngrok服务器的http端口是80,你的服务器做的是web网站但端口改成8080。那么当你启用ngrok客户端后,如果别人访问myapp.ngroksrv.com,域名服务器会指向1.2.3.4也就是ngrok服务器,ngrok服务查询到myapp对应的通道是从1.2.3.4连接到你的公网IP最后到你192.168.0.88的电脑的8080端口,这样别人就访问到你的8080端口和对应的web网站了,虽然他浏览器上看到的是http://myapp.ngroksrv.com。

官方的简明介绍

说完这个例子,其实已经可以看到ngrok最有可能用在什么场景上面,那就是你的服务器是放在内网的,但是需要和公网互动。比如,你用家里的电脑搭建了一个网站,然后让公网其他人看到。还是说说开发者吧:有时候开发环境需要公网访问开发服务器,比如API开发,有一种PUSH是API服务器发信息给你(例如微信),或者比如,你开发中的网站需要不在你内网的其他人访问,像这些问题归纳都是公网访问到你无公网IP的内网服务器,都可以用ngrok解决。因为没有ngrok的时候,遇到这些问题,你可能有两种做法,第一种开发环境放到公网IP服务器(等于一直远程开发),第二种将内网服务器的内容提交到公网IP服务器,显然从专业角度而言都不是好做法。

某提供ngrok代理服务网站的用途介绍

对于没有什么动手能力的,或者没办法搞到合适的公网服务器自己搭建ngrok服务端的,官方和第三方提供了代理服务,简单说就是他来做ngrok服务端,但也能给你客户端和配合启用ngrok,你只需要网页上填点东西做些简单配置(什么是SaaS?这就是一个例子)。

题外话,其实这种思路做法不是新鲜事,不然你以为那些智能家电怎么做到让你在外面用手机移动网络可以控制家里联网的电器?虽然具体的实现有不同做法,但本质而言都是实现了公网对内网设备的访问。

发表评论