家庭网络架构 2.0

从 iKuai + ImmortalWrt 双路由迁移到单 ImmortalWrt,并重新整理 PVE、TrueNAS 和 Home Assistant OS。

家里的网络最早是 iKuai + ImmortalWrt 的组合。iKuai 负责拨号和主要的网络管理,ImmortalWrt 则作为旁路由使用。这套方案前后用了几年,能用,但也一直有一些不太舒服的地方。

今年我终于把它重新整理了一遍:去掉 iKuai,让 ImmortalWrt 独立接管拨号、DHCP、DNS、IPv6 和防火墙,同时在 PVE 中重新部署了 TrueNAS 和 Home Assistant OS。网络结构比以前简单了,后续维护和排查问题也更直接。

下面简单记录一下 2026 年 9 月这次迁移,以及现在家里的网络配置。

调整前的网络架构

底层是一台 N6005 小主机,配置为 4 核 CPU、16 GiB 内存和 1 TB SSD,另外还连接了几块用于存储的机械硬盘。主机安装 PVE,路由系统和其他服务都以虚拟机的形式运行。

当时几个主要服务的 IPv4 地址如下:

地址 用途
192.168.31.1 PVE
192.168.31.2 iKuai
192.168.31.3 ImmortalWrt
192.168.31.4 群晖
192.168.31.5 Home Assistant

iKuai 是主路由,负责 PPPoE 拨号、DHCP、端口映射、动态 DNS,以及当时需要的多线路和流量管理。ImmortalWrt 的网关指向 iKuai,作为旁路由提供额外的网络功能。

这套结构最大的问题是链路比较绕。同一个请求可能经过 iKuai 和 ImmortalWrt,也可能只经过其中一个。实际使用中,我遇到过部分流量没有走完整链路、DNS 行为与预期不一致等情况。问题出现以后,需要同时检查两个系统,定位起来很麻烦。

除此之外,小主机的 BIOS 电池早就没电了,我又一直懒得换。过去两年里每次断电,机器不但无法自动开机,还会丢失默认引导设置。这次迁移前我终于更换了电池,把这个拖了很久的问题一起解决了。

为什么放弃 iKuai

旧架构其实还能继续用,只是我已经不想再维护两套路由配置了。

iKuai 在使用过程中出现过不少问题,更新有时也比较奇怪。它本身不开源,后来又逐渐要求绑定官方平台才能使用一些基础功能,这让我越来越不愿意继续把整个家庭网络的入口交给它。

双路由也带来了不少麻烦。拨号、DNS、DHCP、防火墙和流量统计分散在两个系统里,改一边的配置时还要想一下另一边会不会受影响。换成单 ImmortalWrt 后,所有流量都走同一套规则,出问题也只需要检查一个系统,省心了很多。

底层虚拟化仍然选择 PVE。这样既可以把路由系统和其他服务隔离开,也方便做快照、备份和恢复。最终迁移发生在 2026 年 9 月 13 日至 14 日。

现在的整体架构

N6005 小主机带有 4 个 2.5 GbE 网口。PVE 保留第一个物理网口并将它加入 vmbr0,其余 3 个网口直接传给 ImmortalWrt。这里宿主机和虚拟机里的接口名称容易混淆,最终关系如下:

ImmortalWrt 接口 连接方式 用途
eth0 VirtIO → PVE vmbr0 → 第一个物理网口 连接电脑,也是 PVE 进入局域网的通道
eth1 PCI 直通 备用 LAN 口,目前空闲
eth2 PCI 直通 连接锐捷 X60 Pro,工作在 AP 模式
eth3 PCI 直通 连接光猫并进行 PPPoE 拨号

eth0、eth1 和 eth2 被加入 br-lan,eth3 单独作为 WAN。外网流量从 eth3 进入 ImmortalWrt,经过路由和防火墙处理后,再由 br-lan 发往电脑、AP 和 PVE 中的其他虚拟机。

光猫
  │
  │ PPPoE
  ▼
ImmortalWrt eth3 (WAN)
  │
  ├── br-lan ── eth2 ── 无线 AP
  │           ├─ eth1 ── 备用 LAN
  │           └─ eth0 (VirtIO)
  │                         │
  │                       vmbr0
  │                         ├─ PVE
  │                         ├─ TrueNAS
  │                         ├─ Home Assistant OS
  │                         └─ 物理网口 ── 电脑
  │
  └── WireGuard ── 远程管理设备

局域网继续使用 192.168.31.0/24,几个基础服务的地址调整为:

IPv4 ULA IPv6 用途
192.168.31.1 不配置 PVE
192.168.31.2 fdd4:afac:5c5b::2 ImmortalWrt
192.168.31.3 fdd4:afac:5c5b::3 TrueNAS
192.168.31.4 fdd4:afac:5c5b::4 Home Assistant OS
192.168.31.10 按设备分配 无线 AP

ULA 主要用来给局域网里的服务分配固定地址。运营商下发的 IPv6 前缀仍然通过 SLAAC 分配给终端,PVE 本身用不到公网 IPv6,我就没有给它配置。

PVE 和虚拟机

迁移时使用的是 PVE 9.2.18。3 台虚拟机都设置为随宿主机启动,并明确了启动顺序:先启动路由,确认网络可用后,再启动 TrueNAS 和 Home Assistant。

VMID 系统 CPU 内存 磁盘 启动顺序
101 ImmortalWrt 2 vCPU 4 GiB 8 GiB 系统盘 + 40 GiB 数据盘 1
102 TrueNAS 2 vCPU 6 GiB 32 GiB 系统盘 + 数据盘 2
103 Home Assistant OS 2 vCPU 2 GiB 32 GiB 系统盘 3

ImmortalWrt 的 CPU 调度权重稍高一些。平时 N6005 的负载很低,这个设置更多是为了避免宿主机繁忙时影响路由。旧 iKuai 虚拟机已经退出运行,但迁移前的虚拟机备份仍然保留,以便真的遇到问题时回退。

PVE 自己使用 192.168.31.2 作为默认网关和首选 DNS。硬件时钟也统一改成 UTC,并由 Chrony 同步,避免 BIOS 时间、系统时间和日志时间互相打架。

ImmortalWrt 配置

ImmortalWrt 现在是整套网络的唯一主路由。PPPoE 的 MTU 和 MRU 都设置为 1492,实测对应大小的数据包可以正常通过,再大一字节则会正确返回需要分片。

IPv4 继续使用 NAT,IPv6 则直接使用运营商下发的前缀,没有再套一层 NAT66。防火墙这边基本是默认拒绝从 WAN 主动访问 LAN,只放行已经建立的连接和我自己添加的规则。UPnP 和 NAT-PMP 也都关掉了,目前唯一主动开放的管理入口是后面会提到的 WireGuard。

DHCPv4 地址池为 192.168.31.10 至 192.168.31.254,PVE、路由器、TrueNAS 和 Home Assistant 则使用固定地址。IPv6 除了运营商下发的前缀外,还保留一段 ULA,避免公网前缀变化后管理地址也跟着变化。

DNS 也交给 ImmortalWrt 统一处理。上游配置了多个加密 DNS 服务,主线路不可用时会按顺序切换。我没有强制劫持客户端的 DNS,所以设备自己设置安全 DNS 或 VPN 也不会受到影响。

另外,我给局域网里的几个管理页面配了内网域名,大概是这样:

pve.home.example.com     -> 192.168.31.1
router.home.example.com  -> 192.168.31.2
nas.home.example.com     -> 192.168.31.3
ha.home.example.com      -> 192.168.31.4

PVE、ImmortalWrt 和 TrueNAS 的管理页面都通过 DNS-01 签发 HTTPS 证书。我也尝试过给 Home Assistant 配 HTTPS,但 HAOS 的证书同步比想象中麻烦,最后还是改回了 HTTP。反正它只在局域网和 WireGuard 里使用,暂时没有必要继续折腾。

流量统计使用 Bandix,数据保存在独立的 40 GiB 数据盘中。为了保证基于 conntrack 的设备统计完整,软件和硬件流量分载都保持关闭。N6005 处理当前的千兆宽带没有明显压力,所以我更愿意保留准确的统计,等以后真的遇到性能瓶颈再考虑开启分载。

日志同样写入数据盘,避免只保留很小的内存日志。路由器启用了 NTP 客户端,DNS、LuCI 和 SSH 也只监听局域网接口,不会直接暴露在 WAN 上。

TrueNAS 配置

以前的存储服务由群晖承担,这次改成了 TrueNAS。迁移初期我先用一块 100 GiB 虚拟磁盘建立临时测试池,确认网络、磁盘识别、配置备份和虚拟机恢复都没有问题后,再接入正式磁盘。

目前使用两块 16 TB 机械硬盘保存数据,重要内容在两块盘上各留一份。我没有把它们单纯合并成更大的容量,毕竟其中一块盘真的出问题时,至少另一块上还有一份能用的数据。

TrueNAS 的管理地址固定为 192.168.31.3,同时保留稳定的 ULA IPv6 地址。管理页面只允许从局域网或远程管理隧道访问,不直接开放到公网。除了虚拟机级别的备份,我也保留了 TrueNAS 自身的配置导出;这样即使系统盘损坏,也不需要从头回忆每一项设置。

不过现在还算不上完整的备份方案。如果是误删除、文件损坏,或者整台主机一起出问题,两块盘上的数据仍然可能同时受到影响。后面还得继续补自动快照和异地备份。

Home Assistant OS

Home Assistant OS 使用 VM 103,分配 2 vCPU、2 GiB 内存和 32 GiB 系统盘,地址固定为 192.168.31.4。它排在启动顺序的最后,在 ImmortalWrt 和 TrueNAS 之后启动。

HAOS 这部分反而没什么特别要写的。装好以后,把家里的设备逐个加进去就可以了。目前我只完成了基础部署和原生备份,之后再慢慢补设备和自动化。

从外面回家

家里的 IPv4 在运营商 CGNAT 后面,没办法直接做 IPv4 端口转发,所以我用 WireGuard 建了一条远程管理隧道,入口走 IPv6。

WireGuard 使用分流模式,只把 192.168.31.0/24 和对应的 ULA 网段送回家里。手机或电脑的普通互联网流量仍然使用当前网络,不会绕家里的路由器转发。隧道可以访问 PVE、ImmortalWrt、TrueNAS、Home Assistant 和 AP,但不能借道访问公网;路由器自身也只向隧道开放 DNS、SSH、管理页面和 Ping。

我已经用手机流量测试过这条隧道,从外面可以正常打开 PVE、ImmortalWrt、TrueNAS、Home Assistant 和 AP,手机自己的上网流量也不会绕回家里。现在需要临时处理家里的服务时,打开 WireGuard 就可以了。

迁移和备份

这次迁移没有直接删掉旧系统,而是按可回退的顺序进行:

  1. 先备份 iKuai、PVE 网络配置和原有虚拟机。
  2. 创建 ImmortalWrt 虚拟机,配置系统盘、数据盘、VirtIO 网卡和 3 个直通网口。
  3. 完成 PPPoE、IPv4、IPv6 前缀委派、DHCP 和 DNS,再验证电脑与 AP 都能正常上网。
  4. 确认单路由工作稳定后,将 PVE 的网关和 DNS 切换到 ImmortalWrt,并停止 iKuai。
  5. 部署 TrueNAS 和 Home Assistant OS,设置固定地址和虚拟机启动顺序。
  6. 导出各系统配置,对虚拟机备份做完整性校验,最后执行一次冷启动测试。

最后我又做了一次冷启动。3 台虚拟机都按照设置的顺序启动,PPPoE、IPv6、DNS、流量统计和远程管理也都能自己恢复,这次迁移就算完成了。

接下来还要做什么

现在这套架构已经可以稳定使用,但还有几件事没有完成:

  • 给 PVE 和各虚拟机建立自动备份计划,而不是只依赖手动导出;
  • 为 TrueNAS 增加更完整的快照、校验和异地备份策略;
  • 继续配置 Home Assistant 的设备接入与自动化;
  • 增加 UPS 或其他断电保护,减少机械硬盘和 SSD 的异常断电;
  • 等有时间以后再配置 DN42。

整套东西折腾完以后,最明显的感受就是少一层确实轻松很多。以前遇到网络问题时,我要在 iKuai 和 ImmortalWrt 之间来回检查;现在拨号、DHCP、DNS、防火墙和流量统计全都在 ImmortalWrt 里,基本看一处就够了。

PVE 负责虚拟化,ImmortalWrt 负责网络,TrueNAS 负责存储,Home Assistant 负责家里的设备。功能没有比以前少,但每一部分在做什么都清楚了。对我来说,这就是这次家庭网络 2.0 最大的意义。