skip to content
fdke.vin

组网方案

/ 5 min read

个人服务有一些非常坑的点,比如说服务器松散分布,预算不足,服务器间不方便内网通讯之类,这就需要我们使用一些淫技奇巧来进行内网通讯来保证服务与服务间,用户与服务间的安全通信。

个人在这一方向有一定了解,便记录下使用一些工具和服务的经验。

从业务模型分析来看,这里面分为几方面需求,也产生了几种不用的解决方案

加密访问个人/私有服务

这方面我首推的是zero trust服务,通常市场上的工具可以在不开放服务器端口的情况下加密的暴露出我们的服务,模型可以简化为服务器本地的客户端与服务商之间建立一个稳定加密信道,用户所有访问向服务的流量会被引入服务商,又服务商完成鉴权后再打入到客户端服务器。

我使用过的zero trust 服务主要为cloudflare zero trust,体验十分不错,但也有几个小问题。

  1. 所有流量都会向去往美国留学(zero trust 核心服务器在美国),对于数据敏感的服务并不适用,有数据出国的风险。个人项目可不考虑。
  2. 访问延迟比较感人
    1. 因为一些奇怪的原因,cloudflare并不能廉价使用中国加速节点,国内到cloudflare的流量也不会去往最近的节点,往往都会到洛杉矶(LAX)和圣何塞(SJC),所以直连的网络质量并不太好(但是可用)。
    2. 其实配合cloudflare边缘网络节点最合适的信道为,client↔cloudflare edge cloudflare zero trust
    3. 访问延迟因为流量通路的问题,需要两个来回的美国。
  3. 客户端默认auto会尝试quic通信,但是实测中国大陆出网方向的udp协议丢包严重,无法建立高可用的信道,可以换用http2,推荐h2mux。
  4. 网络最高100M 测试下来没有产生过更高的速度 不清楚是因为客户端性能约束还是服务端限制

个人设备/服务器间加密访问

这个需求就很清晰,个人项目很可能因为各种原因分布在不同国家地区,不同服务器之间需要互相访问一些服务,如在分别在A地、B地服务器上部署了Web服务,但是需要同时访问C地的数据库。在这样一个环境下,将C的数据库端口向公网开放也无可厚非,但是也增加了被爆破的风险,这时候我们就需要一个虚拟局域网了。

先忽略网段分割,参考我们家中的局域网路由结构,来看看这样一个虚拟局域网该如何搭建:

  1. 设备间可达:所以我们需要一个full mesh网络
  2. 不向外网暴露内网服务:得是加密的

本质上我们需要的是一个好用的 mesh VPN

那么我们可以在市面上找到几个符合需求的产品:zerotier、tailscale/headscale 等服务

这几个服务的实现原理都差不多 客户端节点与服务器通信获得其他子节点的信息,节点与节点间互相尝试通信建立加密信道。

很显然,这样的模型稳定性受限于服务方稳定性与节点到服务方通信是否稳定