原文发布在我的博客
早在毕业后的租房时期,我就时常期待拥有自己的家后要如何改造家庭网络。每次看到网上博主分享内网万兆传输、服务器机柜、NAS 阵列等内容,都不禁心生羡慕。2023 年新家入住后,我对家庭网络的改造断断续续持续了两年。到了 2025 年,终于是时候对这段历程做一些总结了。
这篇文章将重点回顾这两年来家庭网络结构的演进过程及背后的思考。
房屋为精装交付,出于成本考虑,入住时未对结构进行大幅改造。简略结构如下:
入住前暴露的主要问题有以下几点:
我对家庭网络能力的主要需求如下:
需求 | 必要性 | 备注 |
---|---|---|
全屋透明代理 | ⭐⭐⭐⭐⭐ | 满足全屋代理的同时,需要过滤 PT 流量/大陆域名请求等 |
内网 2.5G 速率 | ⭐⭐⭐⭐⭐ | 综合考虑,部署万兆的成本过高,日常使用 2.5G 已够使用 |
内网穿透 | ⭐⭐⭐⭐ | 游戏联机/家庭相册共享需要 |
支持内网私有域名 | ⭐⭐⭐⭐ | 简化日常内网部署应用的使用 |
网络监控/恢复能力 | ⭐⭐⭐ | 提升故障问题发现率 |
智能家居内网部署 | ⭐⭐ | 提升响应速度并支持离线使用 |
隐私设备子网隔离 | ⭐⭐ | 摄像头、传感器类 iot 设备屏蔽公网 |
容灾能力 | ⭐ | 减少故障发生后的恢复时间 |
基于以上的需求,得到以下的初步结论
2023 年的主题是建设,在入住后不久,我便设计了如下的网络拓扑:
可以看到这里用了不太常见的单臂路由作为主路由连接方案,并不是因为软路由只有一个网口,纯粹是当时考虑如果软路由放在弱电箱内散热不太好。
我的主要网络设备如下:
硬件配置上普普通通,甚至有些富裕。当然,在闲鱼淘的交换机还是带起了后续的一些变化(笑
系统架构如下图所示
我在 ESXi 上虚拟化运行 OpenWrt ,主要出于以下考虑:
OpenWrt 使用了来自恩山的“高大全”版本,后来发现其中大部分功能并未用到,反而偶尔引发卡顿。
HomeAssistant 直接部署在软路由中,主要原因一是软路由设备先于服务器购买,出于调教智能家居设备的原因先安装在软路由内。二是 HA 需要安装 HAOS 才能安装插件(即必须是虚拟机版本,不能部署在容器内),当时认为 TrueNAS 的虚拟机能力并没有 ESXi 好,所以服务器买来后也没有进行迁移(后来发现 N100 性能根本无法与 E-2144G 相比😅)
2023 年 618 ,我筹备组建第一台服务器,当时我对服务器的主要需求是以下几点:
在淘了比较久的垃圾后,最终选用的配置如下:
这套配置里,最先选择的是机箱,因为家里没有位置放置机柜,想要多盘位又不想装较大的塔式机箱,最终入了半人马的机箱,颜值和扩展相对不错。
CPU 上,2144g 的性能和能耗较为平衡,且核显有 QSV 能力,能加速视频编解码,主频 3.6 睿频 4.5 也能较好的应付日常的计算工作。
内存上由于心心念念一直想要搞一套 ecc 内存,这次选用了三星的 ddr4 2666 的纯 ecc 内存条(24 年还坏了一根😭)。
这套配置有几个小插曲,一是网卡一开始买的浪潮电口 X540, 没想到居然不支持 2.5G 协商速率,害的我又重新买了一块。二是由于机箱比较小,虽然能装 atx 板,但硬盘接口的位置都被挡住了,没办法后续加装了一块 SAS 直通卡解决。
在系统上,由于是偏存储的服务器,系统更偏向选择一些具备 nas 功能的系统,在 Unraid/TrueNAS 等一众 nas 系统及 linux 原生/虚拟机系统的抉择下,我最终选择了以 TrueNAS 作为我的服务器系统,理由主要是以下几点:
RAID 方面,我的 4 块 4T 酷鹰组了 RAIDZ1(类似 RAID5),实际容量在 10T 左右,确保在一块坏了的时候能够不丢失数据恢复。
软件服务方面,我部署了以下的服务:
作为 ios 用户,加上购买了 AppleTv 、HomePod 等一些设备,智能家居生态自然选择了 Apple 的 HomeKit 。主要设备有:
Aqara 设备通过网关直接接入 HomeKit ,小米设备则通过 HomeAssistant 桥接接入。
2023 年的架构基本稳定运行至 2024 上半年,期间虽然偶尔出现 PT 流量误走代理、OpenClash 卡死等问题,但尚可接受。
然而以上的拓扑存在一个致命的缺陷: 弱电箱中的网管交换机成为单点故障。一旦损坏,替换过程极为繁琐,需重新配置 VLAN ,且端口顺序必须与原配置一致。
而就在 2024 年的 5 月某天,那台网管交换机突然宕机了,我在重新下单等了 2 天收到货后开始配置,才发现完全不记得之前的 VLAN 设置了。当时正值 618 之际,在每天晚上下班仅有的 2 个小时内,花了 2 天才将家庭网络恢复如初。这促使我决心进行网络改造,重点是稳定性和容灾能力
既然要增强系统稳定性及容灾能力,那么首先需要梳理一下目前的网络链路以及相关的可用性需求。
链路 | 可用性需求 | 达到可用时的最少设备 | 达到可用时的最少系统组件 |
---|---|---|---|
国内访问(部分设备) | ⭐⭐⭐⭐⭐ | 路由器 | 无 |
无线连接 | ⭐⭐⭐⭐ | 路由器、AP | 无 |
书房有线连接 | ⭐⭐⭐⭐ | 路由器、弱电箱到书房网线 | 无 |
客厅有线连接 | ⭐⭐⭐⭐ | 路由器、弱电箱到客厅网线 | 无 |
国际访问(部分设备) | ⭐⭐⭐ | 路由器 | OpenClash |
PC 网络 | ⭐⭐⭐ | 路由器、PC | 无 |
服务器网络 | ⭐⭐ | 路由器、服务器 | 无 |
智能家居可用 | ⭐⭐ | 路由器、交换机、智能家居网关 | HomeAssistant |
全设备国内访问 | ⭐⭐ | 路由器、交换机、AP | 无 |
全设备国际访问 | ⭐⭐ | 软路由设备、交换机、AP | OpenClash |
内网穿透 | ⭐ | 软路由设备 | 阿里 DDNS 、域名服务 |
其次,需要梳理一下网络中可能故障的节点以及其挂了后的影响面。对影响面的评估我分了以下几级:
先列举一下物理设备可能的故障:
故障节点 | 故障影响 | 应急措施 | 监测手段 |
---|---|---|---|
书房至弱电箱网线故障 | 致命 | 书房的有线网络失效,需要额外引入书房 ap 连入客厅 ap 进行上网 | 无有效手段 |
客厅至弱电箱网线故障 | 致命 | 无线 ap 迁移至弱电箱内或书房,无线信号会受影响 | 无有效手段 |
软路由设备故障 | 严重 | 软路由设备临时替换为普通路由器拨号上网 | 通过 ESXi 和 OpenWrt 探活可知,但实际确认需要线下 |
弱电箱内交换机故障 | 严重 | 替换备用交换机 | 无有效手段(原网管交换机有后台可以探活,但非网管的一般没有) |
书房交换机故障 | 严重 | 替换备用交换机 | 无有效手段(同上) |
服务器设备故障 | 严重 | 无通用方案,根据故障情况处理 | 软路由内部署脚本进行探活 |
智能家居网关故障 | 严重 | 无应急方案 | HA 主动进行的设备探活 |
无线 AP 故障 | 严重 | 替换备用 ap | 通过无线 ap 的端口探活 |
然后是系统组件的可能的故障:
故障节点 | 故障影响 | 应急措施 | 监测手段 |
---|---|---|---|
ESXi 故障 | 严重 | 若重启无法失效需要替换为普通路由器拨号上网 | 通过 ESXi 管理端口探活 |
OpenWrt 故障 | 严重 | exsi 内通过备份快照快速恢复即可 | 通过 OpenWrt 管理端口探活 |
TrueNAS 故障 | 严重 | 需要重装系统,管理配置通过备份恢复 | 软路由内部署脚本进行探活 |
OpenClash 故障 | 一般 | 重启或降级 | 通过 OpenClash 端口探活 |
HomeAssistant 故障 | 一般 | exsi 内通过备份快照快速恢复即可 | 通过 HA 端口探活 |
DDNS 故障 | 轻微 | 重启/手动更新 IP | 无有效手段 |
根据上述的可用性优先级,我将物理拓扑图变成了这样:
从物理拓扑上来看,改变不算特别大,仅是将路由器从书房移回了弱电箱,但从稳定性的角度考虑,这一项调整让家庭减少了 2 个强依赖项,一个就是网管交换机,就算挂了我也可以替换为普通交换机,甚至不用交换机直连客厅 AP,也能保证局部的网络可用。另一个就是去除了弱电箱到书房的网线这个强依赖,一旦网线出问题,仅需降级书房的有线网络即可保障部分可用性。
至于软路由的散热问题,一来在这一年的使用过程中,温度还算可控。二来我买了一个 usb 温控风扇贴着吹进行散热,整体评估放在弱电箱内问题不大。(是吗=。=)
在系统拓扑方面,改造的东西就相对较多一些了,在聊改造细节之前,我们还是先来看看当下遇到的问题有哪些:
为了解决以上的问题,系统的拓扑变成了这样:
由上图所示,软路由内最大的一个改变,就是将 OpenClash 从拨号的 OpenWrt 内剥离了出去,并将拨号用的 OpenWrt 更改为了自编译的精简版本,插件只包含了阿里 ddns 和 mosdns ,其中阿里 ddns 用于内网穿透,而 mosdns 用做代理分流使用。
首先需要说明一下这样调整后的网络请求顺序,为方便说明,拨号用的 OpenWrt 简称为 A ,OpenClash 所在的 OpenWrt 简称 B:
如图所示,在这种网络链路下,国内请求不会经过 OpenClash ,同时为了控制 OpenClash 影响的 CPU 和内存范围,我选择在 ESXi 内单独起了一个虚拟机,用 ESXi 进行最大 CPU 和内存的限制,尽可能做到在 OpenClash 异常时不会耗尽整个路由器资源。至于为什么要再套一层 OpenWrt 而不是直接部署 OpenClash ,那是为了后续有其他插件需要安装时也可以从主链路中剥离开。
而在 2024 年,为什么我还将 HomeAssistant 部署在软路由内,原因是当时高估了软路由的性能,并且因为担心服务器挂了可能会影响智能家居设备=.=
首先提一下硬件上的调整(上图中没展示出来),由于需要按资料重要性进行资源隔离,我新增了 2 块二手 12T 的氦气盘组了 RAID 1 阵列,高频读写的 PT 、影音等数据存在这个阵列内,原先的阵列用来存放家庭照片、数据备份、文档备份等。
然后是服务器内部署的一些应用进行了调整:
在增强稳定性方面,服务器上的脚本担任了绝大多数的任务需求,整个监控体系如下图所示:
其中的脚本都是非常简单的 shell 脚本,通过 http 请求对应服务的管理接口,有数据就当有心跳。这里可以看出当时的一个观点:只要不挂都不是大问题(笑)。但这套体系还是有不少的监控盲区和问题,最显而易见的,就是当 OpenWrt 或者 ESXi 挂了的时候,push 消息根本发不出来(这个问题居然一直到了 25 年才被反应过来)
上述调整后的架构完美运行了很长时间,期间没有发生任何大问题,偶尔的 clash 异常也能在重启后恢复。但没出大问题也就意味着上述的降级容灾措施并没有被实际验证过。
时间来到 2025 年的夏天,某个周末开始网络会时不时出现卡顿,一开始还以为是 PT 下载的缘故,由于持续时间不长就没太关注。但慢慢的卡顿频率越来越多,有时候 OpenWrt 的 CPU 占用会飙升到 100%,排查发现 OpenWrt 内 CPU 占用最高的线程是 ksoftirqd ,ksoftirqd 是一个处理软中断的线程,它占 CPU 高往往是结果而不是原因。深入排查发现在弱电箱内的软路由在正常情况下就烫的厉害,那会不会是因为软路由散热不好导致 CPU 降频或网卡异常进而触发了软中断爆炸呢,在换了一个更大的散热风扇后,这个情况再没有发生。
这个事件让我看到了 2 个问题:
这样下来,2025 年的改造目标,重点就是:
建设体系化监控+设备能力单一化
其实在 2024 年的规划中,就已经画出了 grafana+prometheus 的套件组合,但由于 prometheus 过于原始的配置方式,加上当时认为脚本探活就可以完成家庭网络的监控工作,这 2 者并没有被使用起来。
回到现在,监控体系还是选择使用 grafana+prometheus 的组合,毕竟开源解决方案很多。安装后的效果如下。
关于 prometheus exporter 的选择,目前是这样的:
监控节点 | 拉取速度 | 核心关注指标 | exporter 来源 |
---|---|---|---|
OpenWrt | 5s | CPU 使用率、内存使用率、load 、网络 io 、活跃连接数 | OpenWrt 软件包内自带 |
HomeAssistant | 30s | 设备电池电量、空调使用时间 | HA 插件 |
TrueNAS | 5s | CPU 使用率、内存使用率、load 、磁盘 io 、网络 io | https://github.com/Supporterino/TrueNAS-graphite-to-prometheus |
qBittorrent | 60s | 下载/上传速度、做种数 | 自建 |
OpenClash | 20s | 下载/上传速度、流量使用量、活跃连接数、国内/国际 ping 延时 | 自建 |
需要提的是为什么没有 ESXi 的 exporter ,原因是不想为了监控再装一个 vCenter 了=。=
日志及下述单一化的部分在这篇文章写作之时并没有完全调整完成,这里主要说一下我的方案。
既然监控使用了 grafana ,日志当然使用 promtail+loki 的配套搭配,但看了文档发现 promtail 目前已经被弃用了,替代者是 alloy ,所以整个的日志方案就变成了 alloy(日志采集)+loki(日志存储)+grafana(日志看板)的组合拳。
TrueNAS 内的日志采集直接部署 alloy 应用即可,日志基本集中在/var/log 目录下,我目前是采集了/var/log/containers/*和/var/log/syslog.log 用以监控应用和系统的关键日志。
OpenWrt 的日志采集,我决定参考 github 的方案在 OpenWrt 内直接部署日志上报的功能。
ESXi 和 HomeAssistant 暂不接入。
在软件工程里,KISS 原则是一个非常重要的工程实践方法。回看前两年迭代的结构演进,有哪些地方违法了 KISS 原则呢?
要如何解决这 3 个问题呢,我目前的方案如下:
关于问题 1, 当我在 2025 年再次审视 clash 的配置时,发现其实 clash 本身就支持 dns 分流及按配置绕过内核,引入 mosdns 似乎并不需要,于是我将 2 个 OpenWrt 再次删减为一个,仅使用 OpenClash 的规则配置进行流量分流,这个方案带来的唯一问题可能 CPU 会被 clash 吃满,但这通过监控也可以完成 clash 自动启停。关于 clash 的配置,github 上的这个仓库有非常详尽的教学,可以参考。
关于问题 2, 很好解决,我将 HomeAssistant 从软路由迁移至服务器。
关于问题 3 ,这实际是个成本问题(哈哈)。随着监控和日志系统的完善,我计划观察一段时间服务器使用,如果确实日常计算量很高,可能会考虑增加一台专用计算的设备保障存储设备的稳定性。(比如 mac mini )
家庭网络的建设是一个持续迭代的过程,从最初的“能用到”到“稳定用”,再到“高效与可观测”,每一个阶段都伴随着新的挑战与解决方案。本文重点分享了设计思路与架构演进,具体技术细节将在后续文章展开。如果你也正在构建家庭网络,希望本文能为你提供一些参考。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.