自我接触Tailscale起,我便一直将它用于远程连接RDP、文件传输等服务,直到寒假我开始着手整合手里的计算资源时,我发现我实在是大材小用了。Tailscale提供便捷、快速且高性能的网络穿透服务,以至于我们在组网时候不需要关注网络情况,只需专注于设备和业务即可。

Tailscale是一种基于WireGuard的虚拟组网工具,它可以提供加密的点到点通信,当双方设备无法穿透通信时才会考虑通过第三方节点进行通信。具体原理可以见WireGuard的资料和官方文档。又由于Tailscale本身的便捷性,我们可以很轻松地建立起一个高效运作远程局域网。下面我就简单分享一下我的组网方案。

明确需求

我需要参与组网的设备类型和网络环境较为多样,但也算不上复杂。

  • 设备类型:服务器、PC设备、移动终端

  • 操作系统:Debian Linux、OpenSUSE、Widnows、Android

  • 网络环境:电信家用宽带、联通校园网络(还有学校那抽象的NAT环境)、移动网络、腾讯云、阿里云

  • 服务类型:RDP、FTP、SSH、数据通信、文件传输、Web服务、端口转发

这时候就会想,上面的这些服务使用FRP一样可以实现,为什么要用虚拟局域网呢。

这时便涉及到我对业务的理解和分类了。我将我的个人服务分为公开和私有两个部分。公开服务包括对外提供的博客站点、个人导航、主页等,主要涉及web服务。而私有服务包括RDP、SSH、面板管理等等较为敏感和隐私的服务。FRP提供的tcp数据传输并不是一个理想的方案。当然现在的FRP也可以通过stcp实现类似的效果。不过由以上分析便可以理解我最大的诉求了:内外网隔离,而不是简单的穿透一个或两个服务。如果使用Frp完成组网,那我将需要频繁得处理frpc.toml配置文件,反复增删代理内容。

配置网络

搞定需求之后,便是按照想法去组建网络、配置服务了。Tailscale的登录和配置过程不必多说了,我在以往的文章中(tailscale的安装配置和使用 | 光溯星河 (tsio.top))详细地讲述过。

我的个人网络拓扑简化示意如下。

我将所有设备通过Tailscale进行连接。其中PC设备主要提供RDP与文件相关服务,重头戏还是在服务器上。出于流量处理上的考虑,我将所有web服务全部使用cloudflare代理,由此会造成一些数据交换问题,我接下来以哪吒监控的部署分享我的隔离方案。

哪吒监控官方文档提供了这样一个解决方案:准备两个域名,一个解析到CDN上,一个直接解析到服务器上用作数据通信。这个方案对于我来说有些困难了。我用于暴露公网的云服务仅有2GB的内存,已经被我霍霍差不多了,那么哪吒监控本体就只能放置在内网服务器中。

于是我便使用云服务器(Server 1)反向代理内网服务器(Server 2)Tailscale v4地址和端口,对外暴露并加挂CDN,便于Github账号认证。而通信域名则直接解析为Tailscale内网地址进行数据交换,直接不过外网。由此便建立了一个内外隔离的网络环境,完成了服务搭建。

总结

其它服务也是一样的,以Tailscale加密通道为核心,辅以防火墙IP限制和服务的监听地址便可将内部服务和数据交换与外网隔离开来,建立一个安全高效的直连通信网络,还可以简化网络拓扑。

不过凡事都有例外。我在使用Tailscale的过程中遇到最大的例外就是我在学校内网环境下的机器,它的连接效率非常低,甚至偶尔会断连。最抽象的是SSH命令输入都是一个字儿一个字儿的蹦。具体问题并没有排查清楚,只能初步猜测是学校的NAT环境过于抽象,导致Tailscale打洞失败了。