标题本来应该是内网穿透与动态域名解析,只不过我觉得更重要的问题,还是内网穿透,仔细点讲,是内网穿透中,内网主机与负责转发请求的主机之间,链路的建立与保活,以及数据传输的问题。

一切的原因都是IPv4地址数量不足。在国外网络早期部署时,32位空间的IPv4地址可以说是被滥用了,随意分配给了大量的运营商、学校和机构,早在上个世纪,人们就认识到IPv4地址将会枯竭,于是NAT技术在冥冥中发展起来(之所以这么说,因为NAT技术还未有一个明确的作者)。通过网络地址转换,除了可以让大量用户使用同一个IP外,还有利于管理和安全。

部分网络运营商由于手中掌握了大量的IP地址,在早期提供网络服务时,会给用户分配公网IP,动态域名解析在这时得到了运用。随着用户数量进一步增长,IP地址价格飙升,许多运营商已经不再给用户分配公网IP,搬瓦工下架部分低配VPS也可能有IP地址不足的原因,但不排除跟风涨价的可能。

人常说我大天朝局域网。国内的IP地址本来就处于短缺的状态,而在用户数量暴涨,光纤和移动网络普及后,这种情况更加明显,民用的宽带拨号基本获取不到公网IP,许多主机都隐藏在一个IP背后,并且可能有一到两层的NAT转换。我们在大多数时间内,都处于局域网中。

NAT带来了内网间的高速访问与安全性,对外表现为同一个IP,我们所有请求的实际出口也被移到了公网IP所在主机。对于一些隐藏在NAT后的网络攻击,我们也无法获取到它的具体所在地,如果采取封锁IP的方法,可能会同时封锁掉一个乃至多个地区的用户,最好的办法,只有报警了(还是需要靠警察叔叔)。

NAT有多种类型,不过就目前的发展来看,运营商们只会向更高效,更封闭的方向发展,也就是仅允许从内网主动发起请求后,在同一端口接收目的主机的响应,其他不守规矩的外网数据包通通丢弃。常规的基于UDP或TCP打洞方式,也应该会失效或更加不稳定。关于NAT类型,可以查看下花生壳的文章:NAT穿透方法

这里关注的是花生壳所提到(吹牛)的最后一种,支持内网穿透的动态域名解析。提供docker服务的Arukas采用的就是类似的方式,它的免费docker服务并不稳定,宿主机重启或间隔一段时间后,docker应用对应的IP及端口就会发生变化,只是它提供了一个固定的应用HTTPS地址。如果自己有一台VPS,实现类似的服务并不难,我们可以换一种方式,使用固定IP与域名,在内网主机与负责转发的主机间建立一个隧道,将发送给该域名的请求全部转发到内网主机上。

之前为同事配置公众号测试环境时,需要一个HTTPS回调地址,于是在一台公网VPS上配置了Nginx和StrongSwan,公司内网主机与VPS间建立了IKEv2隧道,Nginx转发网络请求到内网主机,这样就可以在外网访问到测试环境。由于内网主机被映射为VPS的一台内网主机,因此可以在VPS上指定转发的IP与端口,测试环境除了延迟较大外,与线上环境没有其他区别。

目前的内网穿透工具基本也都是这个套路,依靠一台转发机在公网接收和转发请求,内网主机通过隧道连接到转发机,只是这种方式会占用两倍的带宽。不论是使用动态域名解析或者带内网穿透的动态域名解析,当请求量增大时,我觉得服务都会不稳定,只适合开发测试使用,对于一些实时性和稳定性有要求服务,还是挪到专业的机房里。

因此回到最初的问题,内网主机与转发机间链路建立与保活,以及数据传输的问题。我们的局域网在扩大,于此同时,我们的网速也在增加,而天朝局域网内的速度与延迟都可以接受,如果使用国内VPS进行转发,完全可以满足测试开发需求的。对于内网主机的网络,电信还是保持上行速度远小于下行速度的状态,但50Mbps光纤的10Mbps上行对于简单的RESTful服务和ssh连接没有太大压力。老家的网络一直闲置,一直想利用起来,最近看了几个内网穿透工具,包括ngrok,花生壳,frp等,基本都是同样的套路。

ngrok的1.x版本开源,目前开发状态有点停滞,2.0后闭源,仅提供客户端和付费服务,国外的服务器在国内的访问速度不会很快,但也很容易被墙。国内也有提供ngrok收费服务的小站点,只是全部流量经过别人家的程序,有点不放心。

花生壳,从最早提供动态域名解析,到现在提供内网穿透服务,支持多个平台,之后出了个花生棒(也就是个迷你主机),搭配内网穿透,其实也就是内置了内网转发功能,有种强买强卖的感觉,总之就是很贵。但和收费的ngrok服务一样,提供相同的功能时,价格上是不会超过国内VPS的。

frp,刚刚接触的新玩具,使用go语言编写,作者还在持续开发中,拥有一整套完善的服务,一眼看上去有点像SS反着开发了。使用配置文件设置VPS接收端口与本地服务的目的端口,不过我需要的只是建立隧道的功能,文档里说可以暴露HTTPS服务,但我还没看到关于证书配置的部分,HTTPS服务还是交给Nginx比较可靠,接下来也许会再写个frp使用体验。这个是链接:https://github.com/fatedier/frp

现在我最熟悉的方法,还是使用VPN建立隧道,Nginx转发外网请求,HTTPS证书使用let’s encrypt,这也是我们现在开发测试使用的,天朝局域网的速度十分稳定。但如果个人有钱购买国内主机的话,应该也不会专门拿来当转发机用,光带宽收费就十分昂贵。国外的VPS的价格和配置都很友好,只是除了一些能够直连的周边地区,如香港,日本,韩国,其他地区的延迟都很大,隧道也不建议使用VPN,除了干扰严重,还有可能被墙。

部署TCP BBR后,原来购买的日本节点的VPS速度已经趋于稳定,接下来会用它来做一些内网穿透相关的测试~