francoameri/home-lab
GitHub: francoameri/home-lab
一个已退役的家庭实验室文档项目,完整记录了基于 Proxmox 的混合网络设计、Site-to-Site VPN、动态 DNS 自动化和容器化服务的实际构建过程及经验教训。
Stars: 0 | Forks: 0
# 🔧 Home-Lab — 基于 Site-to-Site VPN 的混合 Proxmox 实验室
**一个运行 Proxmox VE 的 Dell 笔记本电脑上构建的实操家庭实验室。**
一个混合网络,包含一个虚拟化的 Sophos Home 防火墙,一个通过 StrongSwan 连接到 Oracle Cloud Ubuntu 虚拟机的 Site-to-Site IPsec 隧道,一个自建的动态 DNS 服务(BIND9 + DHCP 租约同步脚本),以及一个小型的经过身份验证的 Samba 共享。本仓库记录了系统的设计、实际配置、部署步骤,以及——同样重要的是——那些只有在实验室运行一段时间后才会出现的 bug、缺陷和经验教训。
## 📑 目录
1. [状态](#-status)
2. [概述](#-overview)
3. [目标](#-goals)
4. [网络拓扑](#️-network-topology)
5. [软硬件清单](#-hardware-and-software-inventory)
6. [配置亮点](#️-configuration-highlights)
7. [已知问题与经验教训](#-known-issues--lessons)
8. [相关文档](#-related-documentation)
9. [关键词](#-keywords)
10. [贡献](#-contributions)
11. [许可证](#-license)
## 📌 状态
**已停用。** 建于 2025 年 11 月至 2026 年 4 月,在我迁移到新硬件和新构建时退役。
本仓库是一个历史记录:它是如何工作的、为什么要这样构建,以及我会有什么不同的做法——而不是一个实时维护的项目。
## 🔧 概述
本项目记录了一个紧凑的、受生产环境启发的家庭实验室,用于学习和演示虚拟化、网络、VPN、DNS 自动化和容器服务。
以下所有内容都反映了实验室的**实际最终状态**,直接从 Hypervisor、容器、防火墙和云控制台重构而来——而不是从本 README 的早期草稿中获取的。
## 🎯 目标
- **虚拟化** – 在普通的硬件上构建一个可复现的、基于 Proxmox 的家庭实验室。
- **安全性** – 运行一个具有策略、IPS 和 VPN 的真正的边缘防火墙,并在实践中学习基础设施安全。
- **DNS 自动化** – 模拟企业级的动态 DNS:DHCP 租约自动成为正向和反向记录,而无需重量级的域控制器。
- **连通性** – 演示连接到云端虚拟机的真正 Site-to-Site IPsec 隧道(StrongSwan ↔ Sophos),以及远程访问家庭网络。
- **文件共享** – 提供一个小型的、经过身份验证的跨平台内部共享。
## 🗺️ 网络拓扑
```
flowchart LR
subgraph HOME["Home / On-Premise -- LAN 10.0.0.0/24"]
direction TB
DEV["Devices
(DHCP clients)"] subgraph VIRT["Virtualization Layer -- Proxmox VE
(Dell laptop, 10.0.0.200)"] direction TB SOPHOS["Sophos Home FW (VM)
10.0.0.1
Gateway / NAT / DHCP"] BIND["BIND9 (LXC)
10.0.0.201
DNS / DDNS updater"] SAMBA["Samba (LXC)
10.0.0.202
file share"] end DEV --> SOPHOS SOPHOS --- BIND SOPHOS --- SAMBA end subgraph ISPZONE["ISP Zone -- double NAT -- 192.168.1.0/24"] direction TB ONT["ISP router / ONT (Claro)
hands Sophos a private 192.168.1.x"] DYNU["DynU DDNS
fameri-lab.ddnsfree.com"] end subgraph CLOUD["Oracle Cloud (OCI) -- VCN 172.16.0.0/16"] direction TB UBUNTU["Ubuntu 24.04 VM
StrongSwan peer
172.16.1.99
public 164.152.249.176"] end SOPHOS -->|WAN| ONT BIND -.->|updates IP| DYNU ONT ==>|IPsec tunnel| UBUNTU DYNU -.->|resolves home| UBUNTU classDef fw fill:#2e7d32,stroke:#1b5e20,color:#fff classDef svc fill:#1565c0,stroke:#0d47a1,color:#fff classDef cloud fill:#e65100,stroke:#bf360c,color:#fff class SOPHOS fw class BIND,SAMBA svc class UBUNTU cloud ``` ### 本地网络 (`10.0.0.0/24`) - **10.0.0.1** — Sophos Home Firewall(虚拟化虚拟机)。边缘、NAT、DHCP、VPN 端点。 DHCP 范围:`10.0.0.100–10.0.0.199`。Sophos 本身位于**双重 NAT** 之后——它的 WAN 接口从 ISP 路由器 (Claro-Telmex) 获取了一个私有 `192.168.1.x` 地址,而不是真正的公网 IP。 - **10.0.0.200** — Proxmox VE(裸机宿主机)。 - **10.0.0.201** — BIND9 LXC — 动态 DNS。 - **10.0.0.202** — Samba LXC — 经过身份验证的文件共享。 - **访客 WiFi** (`10.255.0.0/24`) — 配置在专用 AP 接口上,但从未投入使用。 ### DNS — 设计为两层 1. **静态基础设施**(Sophos、Proxmox、BIND9、Samba)在 **Sophos 自己的 DNS 主机表**中直接获得了固定的主机名记录——简单,且永远不需要更改。 2. **动态客户端**实现了真正的自动化:BIND9 容器上的一个 cron 任务每 5 分钟通过 `scp` 拉取 Sophos 的实时 DHCP 租约文件,然后使用 `nsupdate`(受 TSIG 保护)将 `A` 和 `PTR` 记录推送到 BIND9 具有权威性的 `lab.lan` 区域中。正是这让局域网内的任何设备都无需静态配置即可通过主机名解析——完整构建过程请参见 [`BIND9.md`](./BIND9.md)。 Sophos 的 DNS API 被锁定为仅接受来自 BIND9 IP 的调用,因为 BIND9 是唯一需要它的服务。 **上游过滤:** 使用 Cisco Umbrella(IPv4 为 `208.67.222.222` / `208.67.220.220`,IPv6 为 `2620:119:35::35` / `2620:119:53::53`)作为 Sophos 的转发器。 ### 远程 / 云端 (Oracle Cloud Infrastructure) - 区域 `sa-vinhedo-1`(巴西),Always Free 层级。 - **Ubuntu 24.04 虚拟机**(`VM.Standard.E2.1.Micro`,1 OCPU / 1GB RAM) — 私网 `172.16.1.99`,公网 `164.152.249.176`。 - VCN `172.16.0.0/16`,子网 `172.16.1.0/24`,互联网网关。 - **StrongSwan** 运行隧道的远端:IKEv2,PSK,`AES256/SHA256`,隧道 `172.16.0.0/16 ⇄ 10.0.0.0/24`。在最后阶段连续正常运行了 40 多天。 - **DDNS (DynU):** 由于 Sophos 位于 ISP NAT 之后,一个 cron 任务(在 BIND9 容器上运行,而不是 Sophos 上)使 `fameri-lab.ddnsfree.com` 始终指向真实的公网 IP——OCI 端通过主机名而不是静态 IP 来查找家庭网络。 ## 🧾 软硬件清单 **硬件** - Dell 笔记本电脑 — Core i7 (4C/8T),16GB DDR3,NVMe 驱动器(宿主机 + ISO),SATA SSD(虚拟机/容器)。 **软件 / 服务** - **Proxmox VE 9.2.3**(内核 7.0.6-2-pve) — 裸机 Type 1 Hypervisor。 - **Sophos Home Firewall**(免费/注册版,型号 `SFVH`) — 虚拟化。 - **BIND9**(非特权 Debian LXC,128MB) — 动态 DNS。 - **Samba**(非特权 Debian LXC,128MB,启用容器级防火墙) — 文件共享。 - **Ubuntu 24.04**(OCI Always Free) + **StrongSwan 5.9.13** — Site-to-Site VPN 节点。 - **DynU** — DDNS 提供商。 - **Cisco Umbrella** — 上游 DNS 过滤。 ## ⚙️ 配置亮点 - **BIND9** – 基于 TSIG 密钥的动态区域(`lab.lan` 正向 + `0.0.10.in-addr.arpa` 反向),由解析 Sophos 的 DHCP 租约文件的 cron 驱动的同步脚本提供数据。参见 [`BIND9.md`](./BIND9.md)。 - **Samba** – 单一经过身份验证的共享(`valid users = fameri`),用作快速安全的内部文件传输通道。参见 [`Samba.md`](./Samba.md)。 - **Sophos** – 针对常见服务上的局域网↔局域网/WAN/VPN 采用默认接受策略,为 OCI 隧道制定显式的双向规则,IPS + Web 过滤 + NDR 威胁情报,每周自动发送加密的配置备份邮件。完整说明见 [`firewall.md`](./firewall.md)。 - **Site-to-Site + 远程访问 VPN** – 连接到 Oracle Cloud 虚拟机的 IKEv2 IPsec 隧道,以及用于远程访问的 SSL VPN。双重 NAT/DDNS 的问题解决是最有趣的部分——完整说明见 [`vpn.md`](./vpn.md)。 - **Proxmox** – 双磁盘(宿主机 / LVM-thin 客户机池)和双网桥(`vmbr0` WAN,`vmbr1` LAN)设计;一个防火墙虚拟机 + 两个精简的 LXC。完整说明见 [`proxmox.md`](./proxmox.md)。 ## 🐛 已知问题与经验教训 这些只有在实验室运行了一段时间后才会显现出来的真实 bug 和缺陷——完整故事见 [`journey.md`](./journey.md): - **裸机宿主机上未受防火墙保护的 IPv6。** Proxmox 宿主机的 WAN 网桥通过路由器通告获取了一个全球可路由的 IPv6 地址——这是一条与 Sophos 平行的路径,但从未被其过滤,因为 Sophos 只保护它自己的虚拟机。通过宿主机级别为空的 `iptables`/`ip6tables` 得到了确认。 - **DHCP→DNS 同步脚本中的一个小写转换 bug**(`tr '[:upper:]' '[:lower':]`)偶尔会导致主机名的大小写不一致。 - **健康检查脚本每次运行都会覆盖自己的日志**,并且它的 cron 计划(`*/120` 分钟)每小时触发一次,而不是预期的每两小时触发一次。 - **远程访问 VPN 的客户端地址池与 DHCP 作用域重叠**(都是 `10.0.0.100–10.0.0.199`)——存在真实的地址冲突风险。 - **StrongSwan 的 `_updown` 脚本在每次重连时都会复制其 iptables 规则**——虽然无害,但 40 多天的正常运行时间留下了四个堆叠的副本。 ## 🔗 相关文档 - [`journey.md`](./journey.md) — 构建纪实:实验室是如何一次增长一项技能的,以及回顾时的发现。 - [`proxmox.md`](./proxmox.md) — Hypervisor 基础:存储、网桥、客户机、虚拟机与 LXC 的选择考量。 - [`firewall.md`](./firewall.md) — 完整的 Sophos 防火墙介绍:区域、规则、NAT、DHCP、安全服务。 - [`vpn.md`](./vpn.md) — 端到端的 Site-to-Site VPN,涵盖 Sophos 和 Oracle Cloud 端。 - [`BIND9.md`](./BIND9.md) — 完整的自建动态 DNS 服务。 - [`Samba.md`](./Samba.md) — 经过身份验证的文件共享。 - [`configs/`](./configs/) — 上述所有内容背后的真实配置文件(机密信息已脱敏)。 ## 🔑 关键词 `Proxmox VE` · `Sophos` · `firewall` · `IPsec` · `StrongSwan` · `site-to-site VPN` · `BIND9` · `dynamic DNS` · `DDNS` · `nsupdate` · `TSIG` · `Samba` · `LXC` · `Oracle Cloud` · `OCI` · `homelab` · `virtualization` · `network security` ## 📝 许可证 本仓库中的所有内容均在 **知识共享署名 4.0 国际许可协议 (CC BY 4.0)** 下共享。 您可以自由地: - **分享** — 在任何媒介或格式下复制和重新分发本素材 - **改编** — 出于任何目的(甚至是商业性质)混音、转换和基于本素材进行创作 在以下条款的约束下: - **署名** — 请给予原作者 **Franco [francoameri]** 适当的署名,提供指向本仓库的链接,并说明是否进行了更改。 🔗 完整许可证文本:[LICENSE.md](https://github.com/francoameri/francoameri/blob/main/LICENSE.md)
(DHCP clients)"] subgraph VIRT["Virtualization Layer -- Proxmox VE
(Dell laptop, 10.0.0.200)"] direction TB SOPHOS["Sophos Home FW (VM)
10.0.0.1
Gateway / NAT / DHCP"] BIND["BIND9 (LXC)
10.0.0.201
DNS / DDNS updater"] SAMBA["Samba (LXC)
10.0.0.202
file share"] end DEV --> SOPHOS SOPHOS --- BIND SOPHOS --- SAMBA end subgraph ISPZONE["ISP Zone -- double NAT -- 192.168.1.0/24"] direction TB ONT["ISP router / ONT (Claro)
hands Sophos a private 192.168.1.x"] DYNU["DynU DDNS
fameri-lab.ddnsfree.com"] end subgraph CLOUD["Oracle Cloud (OCI) -- VCN 172.16.0.0/16"] direction TB UBUNTU["Ubuntu 24.04 VM
StrongSwan peer
172.16.1.99
public 164.152.249.176"] end SOPHOS -->|WAN| ONT BIND -.->|updates IP| DYNU ONT ==>|IPsec tunnel| UBUNTU DYNU -.->|resolves home| UBUNTU classDef fw fill:#2e7d32,stroke:#1b5e20,color:#fff classDef svc fill:#1565c0,stroke:#0d47a1,color:#fff classDef cloud fill:#e65100,stroke:#bf360c,color:#fff class SOPHOS fw class BIND,SAMBA svc class UBUNTU cloud ``` ### 本地网络 (`10.0.0.0/24`) - **10.0.0.1** — Sophos Home Firewall(虚拟化虚拟机)。边缘、NAT、DHCP、VPN 端点。 DHCP 范围:`10.0.0.100–10.0.0.199`。Sophos 本身位于**双重 NAT** 之后——它的 WAN 接口从 ISP 路由器 (Claro-Telmex) 获取了一个私有 `192.168.1.x` 地址,而不是真正的公网 IP。 - **10.0.0.200** — Proxmox VE(裸机宿主机)。 - **10.0.0.201** — BIND9 LXC — 动态 DNS。 - **10.0.0.202** — Samba LXC — 经过身份验证的文件共享。 - **访客 WiFi** (`10.255.0.0/24`) — 配置在专用 AP 接口上,但从未投入使用。 ### DNS — 设计为两层 1. **静态基础设施**(Sophos、Proxmox、BIND9、Samba)在 **Sophos 自己的 DNS 主机表**中直接获得了固定的主机名记录——简单,且永远不需要更改。 2. **动态客户端**实现了真正的自动化:BIND9 容器上的一个 cron 任务每 5 分钟通过 `scp` 拉取 Sophos 的实时 DHCP 租约文件,然后使用 `nsupdate`(受 TSIG 保护)将 `A` 和 `PTR` 记录推送到 BIND9 具有权威性的 `lab.lan` 区域中。正是这让局域网内的任何设备都无需静态配置即可通过主机名解析——完整构建过程请参见 [`BIND9.md`](./BIND9.md)。 Sophos 的 DNS API 被锁定为仅接受来自 BIND9 IP 的调用,因为 BIND9 是唯一需要它的服务。 **上游过滤:** 使用 Cisco Umbrella(IPv4 为 `208.67.222.222` / `208.67.220.220`,IPv6 为 `2620:119:35::35` / `2620:119:53::53`)作为 Sophos 的转发器。 ### 远程 / 云端 (Oracle Cloud Infrastructure) - 区域 `sa-vinhedo-1`(巴西),Always Free 层级。 - **Ubuntu 24.04 虚拟机**(`VM.Standard.E2.1.Micro`,1 OCPU / 1GB RAM) — 私网 `172.16.1.99`,公网 `164.152.249.176`。 - VCN `172.16.0.0/16`,子网 `172.16.1.0/24`,互联网网关。 - **StrongSwan** 运行隧道的远端:IKEv2,PSK,`AES256/SHA256`,隧道 `172.16.0.0/16 ⇄ 10.0.0.0/24`。在最后阶段连续正常运行了 40 多天。 - **DDNS (DynU):** 由于 Sophos 位于 ISP NAT 之后,一个 cron 任务(在 BIND9 容器上运行,而不是 Sophos 上)使 `fameri-lab.ddnsfree.com` 始终指向真实的公网 IP——OCI 端通过主机名而不是静态 IP 来查找家庭网络。 ## 🧾 软硬件清单 **硬件** - Dell 笔记本电脑 — Core i7 (4C/8T),16GB DDR3,NVMe 驱动器(宿主机 + ISO),SATA SSD(虚拟机/容器)。 **软件 / 服务** - **Proxmox VE 9.2.3**(内核 7.0.6-2-pve) — 裸机 Type 1 Hypervisor。 - **Sophos Home Firewall**(免费/注册版,型号 `SFVH`) — 虚拟化。 - **BIND9**(非特权 Debian LXC,128MB) — 动态 DNS。 - **Samba**(非特权 Debian LXC,128MB,启用容器级防火墙) — 文件共享。 - **Ubuntu 24.04**(OCI Always Free) + **StrongSwan 5.9.13** — Site-to-Site VPN 节点。 - **DynU** — DDNS 提供商。 - **Cisco Umbrella** — 上游 DNS 过滤。 ## ⚙️ 配置亮点 - **BIND9** – 基于 TSIG 密钥的动态区域(`lab.lan` 正向 + `0.0.10.in-addr.arpa` 反向),由解析 Sophos 的 DHCP 租约文件的 cron 驱动的同步脚本提供数据。参见 [`BIND9.md`](./BIND9.md)。 - **Samba** – 单一经过身份验证的共享(`valid users = fameri`),用作快速安全的内部文件传输通道。参见 [`Samba.md`](./Samba.md)。 - **Sophos** – 针对常见服务上的局域网↔局域网/WAN/VPN 采用默认接受策略,为 OCI 隧道制定显式的双向规则,IPS + Web 过滤 + NDR 威胁情报,每周自动发送加密的配置备份邮件。完整说明见 [`firewall.md`](./firewall.md)。 - **Site-to-Site + 远程访问 VPN** – 连接到 Oracle Cloud 虚拟机的 IKEv2 IPsec 隧道,以及用于远程访问的 SSL VPN。双重 NAT/DDNS 的问题解决是最有趣的部分——完整说明见 [`vpn.md`](./vpn.md)。 - **Proxmox** – 双磁盘(宿主机 / LVM-thin 客户机池)和双网桥(`vmbr0` WAN,`vmbr1` LAN)设计;一个防火墙虚拟机 + 两个精简的 LXC。完整说明见 [`proxmox.md`](./proxmox.md)。 ## 🐛 已知问题与经验教训 这些只有在实验室运行了一段时间后才会显现出来的真实 bug 和缺陷——完整故事见 [`journey.md`](./journey.md): - **裸机宿主机上未受防火墙保护的 IPv6。** Proxmox 宿主机的 WAN 网桥通过路由器通告获取了一个全球可路由的 IPv6 地址——这是一条与 Sophos 平行的路径,但从未被其过滤,因为 Sophos 只保护它自己的虚拟机。通过宿主机级别为空的 `iptables`/`ip6tables` 得到了确认。 - **DHCP→DNS 同步脚本中的一个小写转换 bug**(`tr '[:upper:]' '[:lower':]`)偶尔会导致主机名的大小写不一致。 - **健康检查脚本每次运行都会覆盖自己的日志**,并且它的 cron 计划(`*/120` 分钟)每小时触发一次,而不是预期的每两小时触发一次。 - **远程访问 VPN 的客户端地址池与 DHCP 作用域重叠**(都是 `10.0.0.100–10.0.0.199`)——存在真实的地址冲突风险。 - **StrongSwan 的 `_updown` 脚本在每次重连时都会复制其 iptables 规则**——虽然无害,但 40 多天的正常运行时间留下了四个堆叠的副本。 ## 🔗 相关文档 - [`journey.md`](./journey.md) — 构建纪实:实验室是如何一次增长一项技能的,以及回顾时的发现。 - [`proxmox.md`](./proxmox.md) — Hypervisor 基础:存储、网桥、客户机、虚拟机与 LXC 的选择考量。 - [`firewall.md`](./firewall.md) — 完整的 Sophos 防火墙介绍:区域、规则、NAT、DHCP、安全服务。 - [`vpn.md`](./vpn.md) — 端到端的 Site-to-Site VPN,涵盖 Sophos 和 Oracle Cloud 端。 - [`BIND9.md`](./BIND9.md) — 完整的自建动态 DNS 服务。 - [`Samba.md`](./Samba.md) — 经过身份验证的文件共享。 - [`configs/`](./configs/) — 上述所有内容背后的真实配置文件(机密信息已脱敏)。 ## 🔑 关键词 `Proxmox VE` · `Sophos` · `firewall` · `IPsec` · `StrongSwan` · `site-to-site VPN` · `BIND9` · `dynamic DNS` · `DDNS` · `nsupdate` · `TSIG` · `Samba` · `LXC` · `Oracle Cloud` · `OCI` · `homelab` · `virtualization` · `network security` ## 📝 许可证 本仓库中的所有内容均在 **知识共享署名 4.0 国际许可协议 (CC BY 4.0)** 下共享。 您可以自由地: - **分享** — 在任何媒介或格式下复制和重新分发本素材 - **改编** — 出于任何目的(甚至是商业性质)混音、转换和基于本素材进行创作 在以下条款的约束下: - **署名** — 请给予原作者 **Franco [francoameri]** 适当的署名,提供指向本仓库的链接,并说明是否进行了更改。 🔗 完整许可证文本:[LICENSE.md](https://github.com/francoameri/francoameri/blob/main/LICENSE.md)
标签:DNS自动化, Proxmox, VPN, 家庭实验室, 网络架构, 虚拟化, 运维部署