旁路由改造家庭网络
十一长假,趁着有时间,我把家里的网络升级了一遍。这篇文章简单记录一下这次的需求和方案选择。
原先家里没几台设备,一个主路由,再给每台机器装上 sing-box 或者 Surge,就能满足需求,简单方便。近来,家里的 NAS 上开了不少 VMs,用来运行各种 agent 工具。设备一多,逐台维护代理就开始变得繁琐,尤其是更新配置、升级软件版本的时候,同样的操作总要重复很多遍。
这次升级,主要就是想把这部分维护集中起来。
最终选定的是旁路由拓扑,如下图所示。图中的 IP 均为示例地址。
Remote Clients
|
Shadowsocks
|
INTERNET
|
+----------+----------+
| Main Router |
| 10.20.30.1 |
| NAT + DNS |
| SS port forwarding |
+----------+----------+
|
Home LAN: 10.20.30.0/24
|
+--------------------------+------------+-----------+--------------------------+
| | | |
+------------+------------+ +----------+----------+ +----------+----------+ +------------+------------+
| Sidecar Gateway | | Mac / iPhone | | Smart Home Devices | | PVE |
| 10.20.30.11 | | | | | | | |
| Ingress: Shadowsocks | | Gateway + DNS: | | Gateway + DNS: | | +----------+----------+ |
| Egress: sing-box | | 10.20.30.11 | | 10.20.30.1 | | | Bridge | |
+-------------------------+ +---------------------+ +---------------------+ | +----------+----------+ |
| | |
| +----------+----------+ |
| | VMs | |
| +---------------------+ |
| |
| Gateway + DNS: |
| 10.20.30.11 |
+-------------------------+
我不喜欢在主路由上部署奇奇怪怪的服务,对它的要求很简单:稳定地提供互联网接入。代理和分流交给旁路由,主路由保留原有的工作方式。这样,家里已有的智能家居设备仍然可以简单可靠地连接米家服务,有特殊需求的设备再按需接入旁路由。
同一个内网里有两个可选网关:主路由 10.20.30.1 和旁路由 10.20.30.11。智能家居设备继续使用前者,Mac、iPhone、PVE 及其 VMs 则使用后者。
旁路由同时在 10.20.30.11 提供 DNS 服务。客户端通过它查询域名时,sing-box 会记录解析结果,在内部维护一张 IP 到域名的映射表。后续连接经过旁路由,就可以利用这张表匹配域名规则,再通过 TProxy 实现透明代理,应用本身不需要单独设置代理。
例如,把设备的网关和 DNS 都改为 10.20.30.11 后,访问 example.com 的流程是:
- 客户端向旁路由 DNS 查询 example.com;
- 旁路由返回真实的 IP 地址,并记录 IP 到域名的映射;
- 客户端向这个 IP 发起连接,将旁路由作为下一跳;
- sing-box 根据域名、IP 等规则,决定直连还是通过代理节点访问;
- 旁路由的对外连接,再经由主路由 10.20.30.1 接入互联网。
同一子网内的访问,比如 Mac 访问 NAS,仍然在局域网内直接完成。PVE 中的 VMs 通过宿主机上的软件桥接入这个网络,也不需要为本地通信绕行旁路由。
这里特别说一下 real-IP 和 fake-IP 的选择。在这套方案里,我更倾向于 real-IP,也就是让 DNS 返回真实地址。像 Wi-Fi Calling 这样的系统服务,网络行为比较特殊,排查起来容易遇到意想不到的问题。保留真实的目标地址,可以少引入一层 Fake-IP 映射带来的兼容性变量。不过,Wi-Fi Calling 还依赖正确的 UDP 转发和代理出口,单纯换成 real-IP 并不能解决所有问题。代价是:DNS 缓存未命中时,客户端需要先等上游查询完成,首次访问冷域名可能会慢一点。对我来说,用这点等待时间换取更合适的兼容性,是可以接受的。
日常使用也不需要来回切换。iPhone 和 Mac 上的 Surge 都支持连接指定 Wi-Fi 后暂停代理:出门后自动恢复,回家后暂停本机代理,由旁路由统一处理分流。
家里还有一个公网 IP,因此我在旁路由上额外启动了 Shadowsocks 服务,并通过主路由做端口映射。配合客户端的分流规则,出门在外也能无感访问内网服务。
核心的指导思想是:**主路由保留稳定的接入能力,需要额外功能的设备自行选择旁路由,维护配置也有了一个集中的位置。**整体架构简单干净,符合我的 less is more 准则。
硬件方面,我选择了 Dell Wyse 5070,配备 Intel J4105 CPU + 8GB RAM + 16GB eMMC,总价 400 多元。感谢 AI 时代,让我用 210 块的价格用上了 8GB DDR4 SODIMM 二手内存。如果你想进一步降本,可以考虑把内存降到 4GB,因为我目前的内存利用率也就 20% 左右。平时功耗大概 2W,电费可以忽略不计。
硬件我还考察了一些 ARM 开发板,比如 R2S、H28K 等。就我考察的这几款来说,性能拉胯,兼容性也拉胯,甚至还会出现掉网卡的问题。这些奸商凭什么卖这么贵?当然,如果你就是冲着功耗去的,那当我没说。
Dell Wyse 5070 的定位是商用瘦客户机,电源余量很足,皮实耐*,强烈建议。作为软路由,J4105 在这个场景下已经性能溢出了,没必要再上更好的 U 了。