公网IP vs 内网穿透

最近在开发「即刻大陆」公众号的时候,由于微信的一些限制,在本地测试公众号需要配合一个公网地址,这就导致了没有公网IP的环境下出现许多不必要的麻烦。当然这对一个技术从业者并不是什么难事,早在去年就开发了「御花园」这个项目来做内网穿透,这不又用上了。顺便好好来聊聊这个话题。

研发「御花园」的最初目的是因为家里添置了一台Windows Server,当做NAS使用,需要RDP远程控制,带宽要求较高,折腾过各种开源的方案,均不太理想,主要有以下方案。

Ngorkhttps://ngrok.com/ ):官方中转服务器在国外,慢就不说了,国内很多收费的节点,服务能力各有千秋。其早期版本已经开源出来,可以自己搭建,采用Go语言编写,端口配置依赖客户端配置,仅有简单的权限控制,长期使用并不太方便,也不太安全。

FRPhttps://github.com/fatedier/frp ):和Ngork类似,也是需要服务器中转,提供的配置更为丰富,不过官方一直声明不建议用在生产环境,便没有过多的研究,支持Unix 套接字和DNS转发,实验性的点对点内网穿透,甚至还能搭建成一个https服务来转发非https流量,也算是一大特色。

ZeroTierhttps://www.zerotier.com/ ):和上述基于传输层协议不同,这个是工作在二层协议,可以提供多个设备组建虚拟局域网进行互通,大部分配置在官网后台操作,设备上只需要安装一个客户端,Join一个网络,激活即可,相当方便。可以自建卫星节点来加速。虚拟LAN兼容性较好,但网络不理想的情况下,上层不容易感知。

花生壳https://hsk.oray.com/ ):作为Oray旗下的老牌服务,从最初的DDNS转型到内网穿透,可以说是很顽强了,免费用户有1M的带宽,一个端口可用。他们家的Windows客户端还是做的比较稳定。

工慾善其事,必先利其器,综上所述,一个工具好用,清晰便捷的图形化操作必不可少,客户端则尽可能的透明,稳定。出于职业特性,对于TCP传输层的操作,Java Netty性能毋庸置疑,且任何需求只要有一个人需要,就有成千上万人需要。「御花园」便孕育而生( https://ifport.com/ ),参考了众多的开源实现,封装了一个私有IPF报文,SSL加密数据,同时写了一个管理后台,方便的自行注册/添加/删除接入设备和端口映射,端口随机自动分配,客户端实时刷新生效,完全无须人工介入。在19款macbookpro上部署,采用iperf3测试local转发能力在1.6Gb/s 左右,受制cpu/内存限制,成绩应该还能更高。

公网IP之争,在19年下半年开始,国家大力推广IPv6,似乎IPv4也没那么紧缺,运营商打打电话,工信部走一波,基本也能得到,还是v4,v6双公网(顺便升级了博客v6支持),路由器绑定DDNS,远程控制更加便捷,内网穿透似乎没有必要了。

随着生活的变迁,环境的变化,常在租住地,咖啡馆WiFi,新家4G之间的来回切换,公网IP并非万能,抗网络波动更是重要,众所周知的原因,运营商PPPoE存在强制断线的坑,DDNS生效有一定的延迟。「御花园」又有了用武之地 ,同一个端口,穿越任意网络,短周期心跳检测、重连,抗网络波动极为灵活,客户端几乎无感知,不得不说还是自研的用着顺手,但迫于带宽和成本压力,也没计划推广。

「御花园」和「即刻大陆」并非什么高深的技术,不过是在这个特定时期能让你看的更远。