家庭网络杂谈(二)—— 拓扑

Posted by Towdium on August 22, 2021

拓扑

上一期我们讨论了各种 VPN 技术,这次我们就可以看到相关技术在实际组网中的应用了。这次我们会简略介绍各台设备的作用,其中比较有趣的部分我们还会在后续章节详细讨论。下图所示就是我目前使用网络的简易拓扑图了,其中灰色方框中的设备实际上是一台物理机上虚拟出的多台设备。需要指出的是,这个系列插图使用的设备图标来自 AWS 图标集,使用 draw.io 就可以调用了。

topo

当前组网中有名字的设备都使用固定 IP 接入,分配在 10.x.x.x 地址段中。一方面是因为 172,192 地址段目前被各类程序使用,冲突较多,另一方面相比起其他地址段,10.x.x.x 地址段有更大的地址范围可以使用,子网分配可以更加轻松。目前的方案是公网 VPS 统一分配在 10.1.x.x 网段,家里的固网设备统一分配在 10.0.x.x 网段(网段 A),其他接入设备经由 Wifi 路由器 R4 上的 NAT 接入,基于 DHCP 分配动态地址,使用 192.168.0.x 网段(网段 B)。这样配置方法相当于在宽带接入后又套入了一层网络内全局可路由的伪公网地址(10 地址段),然后再是传统的家用 NAT 网络接入(192 地址段)。配合基于 Tinc 的 VPN 配置后,将多层 NAT 的关系转化为近似于公网的连接关系。这样做表面上有些繁琐,实际上却具有很多优势:

  • VPS 和家中设备可以双向路由和访问,免去了后续大量的内网穿透配置。
  • 动态接入的设备可以基于静态地址访问内网提供的各类服务。
  • 10 网段内的复杂路由不会侵入接入网段,二级网关完全透明。
  • 网络中服务器与接入设备隔离,问题定位避免干扰。

网络中主要设备功能如下:

  • R1: 一台原生 OpwnWRT 路由器,主要用于宽带接入,并且充当网段 A 内的网关。
  • R2: Tinc VPN,开启 IP 转发,在私网内充当到达 VPS 的中间路由器。
  • R3: XXRay,懂的都懂。
  • PVE: 物理机,部署 PromoxVE 后,可以在网页上轻松管理各台虚拟设备。
  • Docker: 提供各类 docker 部署的网络服务,也就是大家熟知的网盘,影音等应用。
  • R4: 菊厂的母子 Wifi 路由,由于使用 AP 接入,简化为一台 NAT 路由器来看。

这里我没有用上一章讲述的方式使用 Tinc 来做科学上网,当然是因为目前的主流方案已经相当成熟,没有折腾的必要:

  • 使用面板软件可以轻松实现机场接入点的管理,Tinc 做不到。
  • 部署简单,而 Tinc 则需要手写大量 iptables 规则。

除此之外,相比起大家常用的客户端全局代理模式,基于独立设备的科学上网使用三层接入,对于主机而言完全透明,免去了 iptables 规则冲突的各种麻烦,还可以提供更好的兼容性与性能,配置好路由规则后也更加便于管理,免于折腾。

路由

随着路由设备的越加越多,路由打通就成了一大难题了:访问国内服务的流量要从 R1 走,访问国外服务的流量要从 R3 走,访问 10 地址段伪公网设备的流量要从 R2 走。另外,R2 和 R3 实际上都是通过公网隧道和 VPS 建立了连接,因此流量实际上还是需要从 R1 中转。

对于这种场景,我们通常的解决方案是使用二级网关来管理路由和分发流量。从拓扑关系上来看,这个工作也就落到了 R4 的头上了。但是这一台菊厂的家用路由器上的配置选项实在过于拉跨,达不到我预期的效果。如果继续按照这样的思路来配置,那我们只能再加一级软件网关。这样的方法又会用到新的网段,搞得非常复杂。当然,我们也有别的办法,也就是大家经常听到的旁路由。

旁路由的解决方案由于网关不够透明,我实际上并不喜欢。而且实话说,大部分旁路由的方案都是因为缺少多网口的主机而被迫采取的方案,透露出一种贫穷感。我虽然平时比较抠门,但是考虑到家里的网络环境对于我的工作效率有着极大的影响,因此在网络配置上的预算其实是远超需求的。所以说好要 all in one,那在集成度上就不能将就。

在将旁路由方案批判一番后,我们的组网中实际上还是用到了相关的技术。这当然是有原因的:

  • 使用 XXRay 时,把接入路由器和 XXRay 设备合并要用到各种改版的 OpwnWRT 版本,稳定性和功能都没有保障。
  • XXRay 提供的国际流量分离能力在在易用性和准确性上都要远超各类传统的路由设备,因此加一级软件网关也很难在流量分发的精准度上达到 XXRay 的效果。
  • 由于我们还有二级网关顶着,对于接入设备而言旁路由设备完全透明,不破坏网络的集成度,而 10 网段的设备在路由选择上也有更高的灵活度。

这样说来,最终的路由方案也很简单:R4 直接接入 R3,R3 分离国外流量后,剩余流量接入 R1,R1 再将 10 地址段的流量接入 R2,有点像是在二层网段做了一个菊花链的路由。这一配置就可以完全实现我们之前计划的路由规则,而且只需要在 OpenWRT 上录入一条静态路由即可,配置十分简单。这样做的唯一弊端在于有一部分流量可能会在网段 A 内跳转多次,因此网络中也会有一些 ICMP Redirect 报文产生。要解决这个问题实际上也很简单:在 R3 上添加一些静态路由配置,或者退而求其次,打开 Linux 响应 ICMP Redirect 的开关,就可以完成流量转发的最优化。不过苦于没有时间,目前性能也完全够用,就没有再折腾了。

小结

说来好笑,这篇文章里讲解的组网关系,在我动笔之前已经稳定服役了大概一年了。而就在我写作的这段时间里,我已经把整套系统从 XXRay 切换到 XXash 了。猛折腾一段时间配置文件之后,网络接入算是稳定下来了。你也知道 XXash 多少算是 XXRay 套皮,但是除去套皮之外,XXash 多样的路由规则在管理上更便捷,可用性更好,集成度也更高。由于法律原因,这一部分我就不再深入探讨了。这段时间我们聊的东西都太偏理论,后面我们说点具体的东西,聊一聊网络中的各台物理设备。