多数家庭实验室一开始都是扁平网络:一台运行 Pi-hole 的 Raspberry Pi、一台 NAS、一台装着 Proxmox 和十几个容器的迷你主机,全都挂在运营商路由器分配的 192.168.1.0/24 网络上。智能电视和一台早已不再更新固件的摄像头,与你的 NAS 管理页面处在同一个网络里,两年前设置的 Jellyfin 端口转发也还开着。
这篇文章设计一个能隔离 IoT 和访客、安全暴露服务、并且易于恢复的家庭实验室网络,然后把它画出来。
网络需要做到什么
- 隔离。 电视、摄像头和访客的手机能上互联网,但访问不到你的 NAS 或虚拟化主机。
- 安全暴露。 只有一个经过认证和加密的入口,而不是每个服务开一个端口。
- 可恢复。 磁盘损坏时,你靠备份和一张图重建,而不是靠记忆。
硬件包括:设为桥接模式的运营商光猫,这样就不会有双重 NAT;OPNsense 或 pfSense CE 防火墙(两者都是开源的),负责 VLAN 之间的路由,并运行 DHCP、DNS 和 VPN;支持 802.1Q VLAN 的网管交换机;把 SSID 映射到 VLAN 的接入点;用于运行虚拟机和 LXC 容器的 Proxmox VE 主机;以及一台 NAS。
VLAN 规划
从 RFC 1918 的私有地址段(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)中选一个 /16,并给每个 VLAN 分配一个 /24。避开 192.168.0.0/24 和 192.168.1.0/24,因为你在外面连回家时所用的网络里常常用到它们;还要避开 172.17.0.0/16(Docker 通常的默认网桥)和 100.64.0.0/10(Tailscale 的地址)。这个示例使用 10.23.0.0/16,并以 VLAN ID 作为第三个八位组。
| VLAN | 名称 | 子网 | 放在这里的设备 | 允许的出站 |
|---|---|---|---|---|
| 10 | Management | 10.23.10.0/24 | 防火墙、交换机、AP 和 Proxmox 的管理界面 | 仅更新 |
| 20 | Trusted | 10.23.20.0/24 | 你的笔记本电脑和手机 | 互联网、代理、从管理设备访问 Management |
| 30 | Servers | 10.23.30.0/24 | 虚拟机、容器、NAS、代理、Pi-hole | 用于更新的互联网 |
| 40 | IoT | 10.23.40.0/24 | 电视、音箱、摄像头、智能插座 | 仅互联网 |
| 50 | Guest | 10.23.50.0/24 | 访客 | 仅互联网 |
防火墙到交换机、交换机到接入点、交换机到 Proxmox 都是带标签的 trunk;OPNsense 的文档提醒不要在防火墙的 trunk 里混入不带标签的 VLAN。其他设备使用不带标签的接入端口。
在 Proxmox 上,让网桥支持 VLAN,并把主机的管理地址放在 VLAN 10 上,如 Proxmox VE 网络文档所述。这样每台虚拟机就可以有自己的 VLAN 标签:
auto vmbr0
iface vmbr0 inet manual
bridge-ports eno1
bridge-stp off
bridge-fd 0
bridge-vlan-aware yes
bridge-vids 2-4094
auto vmbr0.10
iface vmbr0.10 inet static
address 10.23.10.5/24
gateway 10.23.10.1
为每个无线 VLAN 创建一个 SSID:Trusted、IoT 和 Guest。Cisco Meraki 建议每个接入点最多三个,因为每个 SSID 都会以最低数据速率每 100 ms 发送一次自己的信标。
VLAN 之间的防火墙规则
OPNsense 和 pfSense 在流量进入的接口上自上而下评估规则:第一条匹配的规则生效,没有匹配的流量落入默认拒绝。两者都是有状态的,所以允许 Trusted 访问代理的 443,也会放行返回的响应。
对每个 VLAN,先允许它需要的流量,再用名为 RFC1918 的别名阻止所有私有地址段,最后放行互联网。在 IoT 接口上:
| # | 动作 | 源 | 目标 | 端口 | 原因 |
|---|---|---|---|---|---|
| 1 | Pass | IoT net | Pi-hole,10.23.30.53 | 53 | 经过过滤的 DNS |
| 2 | Block | IoT net | 防火墙自身的地址 | any | 不能访问管理页面 |
| 3 | Block | IoT net | RFC1918 别名 | any | 不能访问其他 VLAN |
| 4 | Pass | IoT net | any | any | 互联网 |
规则 2 覆盖了防火墙的公网 WAN 地址,别名里没有包含它;pfSense 把这个目标叫作 This firewall (self)。个别例外放在阻止规则之上:Trusted 访问代理的 443,你的管理笔记本访问 Proxmox Web UI 的 8006,Home Assistant 访问 IoT。别名只适用于 IPv4,所以如果你的 VLAN 分配了 IPv6 前缀,也要把它们阻止掉。
投屏是常见的意外。AirPlay 和 Google Cast 通过 224.0.0.251 上的多播 DNS 发现设备,而 Apple 指出这类流量通常不会跨子网路由。在 Trusted 和 IoT 之间运行 mDNS 中继,例如 OPNsense 的 os-mdns-repeater 插件,并允许 Trusted 访问电视。
反向代理背后的服务
Servers VLAN 中的一台反向代理(例如 Caddy、Traefik 或 Nginx Proxy Manager)终止 TLS 并按主机名路由,因此防火墙只需把 443 放行给一个地址。
使用你拥有的域名下的名称,例如 jellyfin.home.example.com。避免使用 .local,RFC 6762 把它保留给多播 DNS;.internal 或 home.arpa 下的名称在本地可以用,但没有公共 CA 会为它们签发证书。
用 DNS-01 质询从 Let's Encrypt 获取证书:你的 ACME 客户端通过 DNS 提供商的 API 在 _acme-challenge.<name> 下创建一条 TXT 记录,所以不需要从互联网访问任何东西。它也是唯一能签发通配符证书的质询类型,而你需要一张通配符证书。Let's Encrypt 会把每张证书提交到公开的 Certificate Transparency 日志,所以 *.home.example.com 只公开一个名称,而不是你的服务清单。自 Caddy 2.10 起,其他站点会复用匹配的通配符证书:
*.home.example.com {
tls {
dns cloudflare {env.CF_API_TOKEN}
}
abort
}
jellyfin.home.example.com {
reverse_proxy 10.23.30.21:8096
}
这需要带有 caddy-dns/cloudflare 模块的 Caddy 构建,以及一个仅限于 Zone.Zone:Read 和 Zone.DNS:Edit 的令牌。证书目前有效期为 90 天,到 2028 年 2 月将缩短为 45 天,所以请自动化续期。
远程访问方案
| 方案 | 互联网看到什么 | 难度 | 取舍 |
|---|---|---|---|
| 把 443 端口转发到代理 | 你的 IP 和每个应用的登录页 | 低 | 每个应用的登录是唯一屏障;在运营商级 NAT 之后无法使用 |
| 防火墙上的 WireGuard | 一个会忽略未认证数据包的 UDP 端口 | 中 | 需要可访问的公网 IP,每台设备一对密钥 |
| Tailscale | 没有任何入站 | 低 | 依赖 Tailscale 的协调服务或自托管的 Headscale;免费 Personal 套餐为撰写时(2026 年 11 月)的情况 |
| Cloudflare Tunnel | 没有任何入站 | 低到中 | Cloudflare 终止 TLS 并能看到你的流量;你的域名必须托管在 Cloudflare |
对自己使用来说,WireGuard 是个好的默认选择:根据 WireGuard 论文,它从不应答未认证的数据包,所以扫描器看不到它。但它仍然需要一个入站端口,而运营商级 NAT 做不到这一点;WAN 地址落在 100.64.0.0/10,也就是 RFC 6598 的共享地址段,就是明显的迹象。
Tailscale 和 Cloudflare Tunnel 则是向外连接。Tailscale 的 DERP 中继只转发仍由 WireGuard 加密的数据包,而子网路由器无需在每台虚拟机上装客户端就能访问 Servers VLAN。隧道适合与不愿安装 VPN 的人共享的服务;Cloudflare Access 可以加上登录。零信任架构图解释了为什么身份比网络位置更重要。
每个 VLAN 的 DNS 与 DHCP
防火墙在每个 VLAN 上提供 DHCP,并为服务器设置保留地址。OPNsense 默认启用 Unbound,这是一个带验证的递归解析器。在 Servers VLAN 中运行 Pi-hole 或 AdGuard Home,供 Trusted 和 IoT 使用:两者都能过滤广告和跟踪器,保存把 *.home.example.com 指向代理的本地记录,并把其他查询转发给 Unbound(DNS 如何工作会完整跟踪一次查询)。访客直接使用防火墙。在另一台机器上再运行一个过滤实例:如果唯一的实例停了,这些 VLAN 就会失去域名解析。
备份与供电
遵循 3-2-1:三份副本、两种存储介质、一份异地。你的虚拟机是第一份,每晚备份到 NAS 或 Proxmox Backup Server 是第二份,云存储桶中的加密副本是第三份。Proxmox Backup Server 做增量、去重、加密的备份,Proxmox 称即使在你不完全信任的目标上也是安全的。RAID 和快照不是备份。导出防火墙配置(OPNsense 和 pfSense 中是一个 XML 文件),与这张图放在一起,并测试恢复;灾难恢复架构图讲了 RPO 和 RTO。
把防火墙、交换机、Proxmox 主机和 NAS 接到 UPS 上。使用 Network UPS Tools (NUT) 时,连接 UPS 的那台机器通过网络通知其他机器关机,所以交换机也必须接在 UPS 上。根据插座处的功耗和数据手册的续航曲线来选容量:你需要的是几分钟,而不是几小时。
家庭实验室网络图
图表内容
- Internet
- OPNsense or pfSense
- Managed switch
- Access point
- VLAN 20 · Trusted
- Laptops and phones
- VLAN 40 · IoT
- TV, cameras, plugs
- VLAN 50 · Guest
- VLAN 30 · Servers
- Reverse proxy (Caddy)
- Proxmox VE host
- NAS (backups)
- Links
- deny inbound
- WireGuard UDP 51820
- trunk: 10–50
- trunk: 10, 20, 40, 50
- trunk: 10, 30
- HTTPS 443 from Trusted and VPN
- HTTP to apps
- nightly backups
- SSID home
- SSID iot
- SSID guest
这张图的读法如下:
- 顶部一行: 互联网、防火墙、交换机。WAN 拒绝所有入站流量,只有 UDP 51820 上的 WireGuard(虚线)除外。
- trunk 承载带标签的 VLAN: 到交换机的是 10 到 50,经 PoE 到接入点的是 10、20、40 和 50,到 Proxmox 的是 10 和 30。
- 框是 VLAN,标有 ID、名称和 CIDR。VLAN 10 的 Management 是交换机下方的标签。
- 青色的边是允许的流量: 从 Trusted 和 VPN 客户端到代理的 HTTPS 443,再以 HTTP 到应用。灰色虚线是每晚的备份。
- 接入点 把 home、iot 和 guest 三个 SSID 映射到 VLAN 20、40 和 50。
- Markdown 块 里是 VLAN 规划和设置;图例解释链路的颜色。
把家庭实验室网络图画清楚
- 给每个 VLAN 标上 ID、名称和 CIDR,就写在框上。
- 在 trunk 上标出它承载的 VLAN。 某个 trunk 上少了一个 VLAN 是经典的错误。
- 把防火墙画成 VLAN 之间的唯一通路,并按端口标注允许的流量。
- 画出从外部进入的途径,即使它只是一个 UDP 端口。
- 不要画容器、MAC 地址和交换机端口号。它们属于物理图,正如网络拓扑图指南所解释的。
- 与配置备份放在一起,规则变更时更新它。
在 Archboard 中构建
- 用 Google 或 GitHub 登录并创建一个图表。
- 从 网络 包中,横向添加 互联网、标注为 OPNsense 或 pfSense 的 防火墙 和 交换机,并在右下方为接入点添加一个 无线 节点。
- 为 VLAN 20、30、40 和 50 添加四个 子网 框,每个都写上名称和 CIDR。
- 在 Servers 中,添加一个 负载均衡器 作为反向代理(该包没有代理类型),一个 服务器 用于 Proxmox,以及一个类型设为 NAS 的 设备。在 Trusted 中添加一个笔记本电脑 设备,在 IoT 中添加一个 IoT 设备。
- 把它们连起来,把每条链路的连接类型设为 WAN、Ethernet、PoE 或 Wi-Fi,并标上它的 VLAN 或 SSID。允许的流量用青色画,WireGuard 和备份用虚线。
- 从 网络 包添加一个 网络图例,从 基础 包添加一个写有 VLAN 规划的 Markdown 块,并用基础包的 文本 标签写出每个 VLAN 的规则。
如果你的应用定义在 compose.yaml 里,Docker Compose 转图表工具可以起草服务部分,网络图页面展示了整个包。这个示例共用 15 个图表节点,在 Free 套餐的限制之内,这也是 Free 每个图表的上限。
常见问题
家庭实验室应该有哪些 VLAN? 通常是五个:management、trusted、servers、IoT 和 guest。只有当设备需要不同规则时才增加;每多一个 VLAN 就多一些规则,往往还多一个 SSID。
用 VLAN 需要网管交换机吗? 需要,要支持 802.1Q 的网管或智能交换机,再加一个能把 SSID 映射到 VLAN 的接入点。非网管交换机无法把端口划入 VLAN。
应该把 OPNsense 或 pfSense 作为 Proxmox 上的虚拟机运行吗? 这样能省一台设备,但每次主机重启都会让全家断网。一台小型专用防火墙更容易恢复。如果要虚拟化,给 WAN 单独一块网卡,并在主机之外保留一份配置导出。
为自托管服务开放端口安全吗? 这会把应用的登录页暴露在互联网上,所以它的安全更新就成了你的防线。优先用 VPN;如果非转发不可,只把 443 发给反向代理,并在前面加上认证。
内部专用的服务可以用 Let's Encrypt 吗? 可以,用 DNS-01:一条 TXT 记录就能证明你控制该域名,所以服务无需从互联网访问。通配符证书能让服务名称不出现在 Certificate Transparency 日志中。