最近在开发「即刻大陆」公众号的时候,由于微信的一些限制,在本地测试公众号需要配合一个公网地址,这就导致了没有公网IP的环境下出现许多不必要的麻烦。当然这对一个技术从业者并不是什么难事,早在去年就开发了「御花园」这个项目来做内网穿透,这不又用上了。顺便好好来聊聊这个话题。
研发「御花园」的最初目的是因为家里添置了一台Windows Server,当做NAS使用,需要RDP远程控制,带宽要求较高,折腾过各种开源的方案,均不太理想,主要有:
Ngork( https://ngrok.com/ ):官方中转服务器在国外,慢就不说了,国内很多收费的节点,服务能力各有千秋。其早期版本已经开源出来,可以自己搭建,采用Go语言编写,端口配置依赖客户端配置,仅有简单的权限控制,长期使用并不太方便,也不太安全。
FRP( https://github.com/fatedier/frp ):和Ngork类似,也是需要服务器中转,提供的配置更为丰富,不过官方一直声明不建议用在生产环境,便没有过多的研究,支持Unix 套接字和DNS转发,实验性的点对点内网穿透,甚至还能搭建成一个https服务来转发非https流量,也算是一大特色。
ZeroTier( https://www.zerotier.com/ ):和上述基于传输层协议不同,这个是工作在二层协议,可以提供多个设备组建虚拟局域网进行互通,大部分配置在官网后台操作,设备上只需要安装一个客户端,Join一个网络,激活即可,相当方便。可以自建卫星节点来加速。虚拟LAN兼容性较好,但网络不理想的情况下,上层不容易感知。
花生壳( https://hsk.oray.com/ ):作为Oray旗下的老牌服务,从最初的DDNS转型到内网穿透,可以说是很顽强了,免费用户有1M的带宽,一个端口可用。他们家的Windows客户端还是做的比较稳定。
工慾善其事 必先利其器,综上所述,出于职业特性,一个工具好用,清晰便捷的图形化操作必不可少,客户端则尽可能的透明,稳定。「御花园」便孕育而生( https://ifport.com/ )。对于TCP传输层的操作,Java Netty性能毋庸置疑,参考了众多的开源实现,封装了一个自己的IPF协议,SSL加密代理数据,用Vue写了一个简单的后台管理,方便的添加接入设备,和端口映射,随机可用端口自动分配,客户端自动刷新生效,完全无须人工干扰。在19款macbookpro上部署,采用iperf3测试local转发能力在1.6Gb/s 左右,受制cpu/内存限制,成绩应该还能更高。
公网IP之争,在19年下半年开始,国家大力推广IPv6,似乎v4也没那么紧缺了,运营商打打电话,实在不济工信部走一波,基本也能要到公网IPv4了,还是v4,v6双公网,路由器绑定DDNS,远程控制更加便捷,看似内网穿透这样的需求也就没有必要了。
随着生活的变迁,开发环境的变化,现在经常在租住地,咖啡馆WiFi,新家4G之间的切换,公网IP并非万能。测试环境总不可能换来换去,抗网络波动更是重要,「御花园」又有了用武之地 ,同一个端口,穿越任意网络,5秒一次的心跳检测、重连,抗网络波动,几乎无感知。
「御花园」和「即刻大陆」本质上都是畸形互联网形态下的产物,期待早日下线。
原文 https://dorole.com/2003/