zelogx/msl-setup

GitHub: zelogx/msl-setup

MSL Setup是一个将单台Proxmox服务器自动划分为多租户隔离环境的自动化工具,通过SDN和VPN实现项目间的L2级网络隔离。

Stars: 11 | Forks: 2

# Zelogx™ Proxmox Multiverse Secure Lab (MSL) 设置 [![GitHub Discussions](https://img.shields.io/badge/GitHub-Discussions-181717?logo=github)](https://github.com/zelogx/msl-setup/discussions) [![GitHub Wiki](https://img.shields.io/badge/GitHub-Wiki-red)](https://github.com/zelogx/msl-setup/wiki/) [![Official Site](https://img.shields.io/badge/Official-Site-blue)](https://www.zelogx.com) [![Release Notes](https://img.shields.io/badge/Release-notes-green)](https://www.zelogx.com/documents/release-notes/) Zelogx™ MSL Setup (Multiverse Secure Lab Setup) 是一个多租户设置工具,可以将单个 Proxmox 服务器在逻辑上划分为针对每个项目或团队的隔离环境。 通过为每个租户自动绑定专用的 VPN,它允许授权用户从任何地方安全地访问正确的项目区域。 具体来说,它会为您配置 Proxmox SDN(Simple Zones + VNets)和防火墙规则,将普通的 hypervisor 转变为一组多租户就绪的虚拟空间。借助基于 GUI 的 VPN 管理 (Pritunl) 和 MFA,它最大限度地减少了运营开销,同时通过机制而非人工纪律来保持稳健性。 © 2025 Zelogx. Zelogx™ 和 Zelogx 徽标是 Zelogx Project 的商标。所有其他标记均为其各自所有者的财产。 ## 0. 概述 本项目在第 2 层(Layer 2)级别构建**每个项目完全隔离的开发环境**,并通过 VPN 进行安全访问。\ 这是一个针对**低成本分布式开发**、离岸项目或私有团队实验室的蓝图。 注意: 以下代码库包含与此设置脚本对应的**手动设置过程**。 [MSL Setup Basic](https://github.com/zelogx/proxmox-msl-setup-basic/blob/main/build-instructions.md) 架构图见下文。 ![Zelogx MSL Setup Network Overview](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/08792b49d1105218.svg) ## 1. 快速入门 ``` apt update -y apt install -y ipcalc jq zip # 使用 scp 或类似工具将 zip 文件放置在 proxmox 服务器上。 # 在 Corporate 版本中, unzip msl-setup-pro-1.x.x_corporate.zip # change x to correct version number cd msl-setup-pro-1.x.x_corporate # 在 MSL Setup (Personal Edition) 中, apt install -y git git clone https://github.com/zelogx/msl-setup.git cd msl-setup # 阶段 0: TUI Network Auto Configuration (检查现有网络 + 自动网络配置) ./00_configNetwork.sh en # Language: en|jp (default en) # 阶段 1: Network Setup (检查配置 + SDN 设置) ./01_networkSetup.sh en # Language: en|jp (default en) # 阶段 2: VPN Setup (Pritunl VM 部署 + 配置) ./02_vpnSetup.sh en # Language: en|jp (default en) # 阶段 3 (仅限 Pro Corporate): RBAC Self-Care Portal Setup ./0301_setupSelfCarePortal.sh en # Language: en|jp (default en) # (可选) 完全卸载 MSL setup ./99_uninstall.sh en # Language: en|jp (default en) # 这将: # 1. 销毁 Pritunl VM (调用 0201_createPritunlVM.sh --destroy) # 2. 将网络配置恢复到备份状态 (调用 0102_setupNetwork.sh --restore) ``` ### 安全与设计选择 (FAQ) **Q: 能否防止 VM 跳跃(VM hopping)?** **A:** 可以,隔离在实验室(租户)边界强制执行。 - **实验室内部**:允许同一隔离实验室内的 VM 相互通信。这保持了环境对实际应用程序、集群或服务测试的实用性。 - **实验室之间**:Nftables + Proxmox SDN(“Multiverse Enforcer”)防止流量跨越项目区域。 - **实验室到主机 / 管理**:默认情况下,阻止转发到指定 VPN 客户端池和上游互联网网关之外的任何内容。主机级管理网络和其他实验室保持不可见。 **Q: 如何处理 API token 和权限?** **A:** Zelogx MSL Setup 不使用带 token 的 Proxmox API。它在节点上本地运行,并在 root 权限下使用原生 Proxmox CLI(`pvesh` 和相关工具)。 - **为什么是 root?** 配置 SDN 对象、网桥和 nftables 规则在 Proxmox 上本质上是系统级操作。 - **设计选择**:该工具不增加额外的 API 表面(和 token 生命周期)来保护,而是依赖现有的 Proxmox 权限模型。所有更改都作为标准的 Proxmox SDN 和防火墙配置可见,并且没有额外的控制平面需要审计或加固。 ### 1.1. 您将获得什么(工程师视角) 在单个 Proxmox VE 节点上: - 每个项目完全隔离的网络段,并为远程队友提供 VPN 保护的访问。 - 将每个项目的环境暴露给您的团队,而不会危及主 LAN。 - 安全设计 —— 除了 VPN 隧道和 DNS 查询外,没有其他数据包进入您的企业或家庭 LAN。 - 自动化客户端配置:通过 Prutunl GUI 进行用户注册、证书生成和 VPN 管理。 - 基于 GUI 的服务器控制(按项目启动/停止 VPN)。 - 不需要支持 VLAN 的交换机。 - **仅限 Corporate Edition** 项目网络内的自助 VM 管理:项目成员可以独立创建、删除、启动、停止 VM,并管理快照和备份,无需管理员干预。 ### 1.2. 您将获得什么(经理视角) - 仅授予每个合作伙伴/自由职业者**所需的访问权限**,通过设计防止跨项目泄露。 - 为中小型软件公司或初创企业构建**私有开发云**。 - 比给予开发者完全的云自由更安全、更快速、更便宜。 - 完全开源 —— 您只需要**一台小型服务器(甚至是 NUC)**和约 ¥1,000/月的电费。 - 无厂商锁定,无需订阅。 ### 1.3. 比较:个人/小型办公室 Proxmox 多租户设置的替代方案 在 Proxmox 上构建多租户环境有几种方法。 下表总结了实际差异。 | 方法 | 学习曲线 | 网络隔离 | 自动化 | 个人友好度 | | ---------------------- | -------------- | ------------- | --------------- | ------------------- | | RBAC + Resource Pools | **中** | 无 | 仅 GUI | 有限 | | SDN + OPNsense | **极高** | 强 | 手动设置 | 部分 | | **MSL Setup Basic** | **低** | 强 | 手动(引导式)设置 | 极佳 | | **MSL Setup Personal** | **极低** | 强 | 全自动 | 极佳 | 有关每种方法的更深入解释,请参阅 [Proxmox Multi-tenant Guide](https://github.com/zelogx/msl-setup/wiki/Proxmox-Multi%E2%80%90tenant-Guide)。 ### 1.4. 许可 - **Pritunl**\ 免费使用,可选付费功能用于企业管理。\ 单个企业许可证覆盖集群中的所有服务器。\ → [Pritunl](https://pritunl.com) - **Proxmox VE**\ 核心 Proxmox VE (PVE) 软件是开源的,并根据 GNU Affero General Public License v3 (AGPL v3) 授权。根据 Proxmox 官方立场,不收取“许可费” —— 这意味着使用该软件本身不需要任何费用。[Proxmox][1], [Proxmox Forum][2] \ 但是,付费订阅(支持合同)是单独提供的。 ### 1.5. 目标受众 - “我们已经让开发人员自由地启动 AWS 实例来构建快速、分布式的开发环境。安全?嗯……当有人问这个问题时,小型软件公司的管理层和高管只是瞥一眼负责人求助。” - “我在家里有自己的开发/实验室环境,所以我积极地在那里启动 VM 并进行开发。其他团队成员?我假设他们每个人都在自己解决问题?” - “现在我使用 WSL 并在我的 Windows PC 上运行 Linux VM。如果我丢失了 PC,安全吗?BitLocker 保护它……或者他们是这么说的。每个人都在完全不同的环境中开发。集成测试要花很长时间(笑)。” - “即使在大企业中,也是对的。服务器位于具有严格访问控制的服务器机房中。基本上,开发环境中不存在个人数据。与每位员工签署 NDA?是的,我们执行这些。当然,您只能通过 VDI 登录。但是所有 VM 的 root 密码都是一样的。而且因为它们都在同一个网段上……理论上,如果有人想登录其他 VM?他们可以,哈哈。” - “同样在大企业中:需要它的项目都有自己的 VPN。如果您可以登录一个 VM,您也能进入其他 VM 吗?我没检查过,但我认为不行……我们从未发生过此类事件。此外,我们每年进行两次安全培训。” ### 1.6. 为什么这很重要 #### 1.6.1. 云开发环境中的典型问题 当开发环境位于公有云中时的典型“痛点” - 仍然将公有 IP 直接分配给 VM 并直接 SSH 进去 - 因为它有公有 IP,您未经测试的 Web 应用服务器实际上暴露在整个互联网上 - 跨项目的开发环境彼此可见 - 在不考虑影响范围的情况下大量启动实例 - 由于大数据传输导致网络带宽枯竭(是的,那个老梗) - 审批 → 估算 → 审批 → 配置……“开发速度”是什么来着? - “只是为了测试”的实例 …… 运行了六个月 - 在弱 CPU 实例上等待构建时睡着了 我们真的安全地让安全素养低的应用程序开发人员 —— 或者那些“认为自己了解基础设施”的人 —— 自由操作云吗? 他们没有恶意。他们只是缺乏履行预期责任所需的机制。 结果:成本爆炸、攻击面扩大、权限混乱,以及 “事实证明本地部署毕竟更安全。” **结果:** 高成本、低可见性、意外暴露。\ 即使出于好意,团队也缺乏防止人为错误的“系统性护栏”。 ### 1.7. 成本效率示例 让我们将 AWS EC2 c5d.large(2 vCPUs)与在 Intel NUC 上运行的 2-vCPU VM 进行比较。\ 本项目使用的机器:Intel NUC Pro, Core i7-1360P(12 核 / 16 线程,最高 5.0 GHz)。 | 项目 | AWS EC2 (c5d.large) | NUC 上的 2-vCPU VM | | -------------------------- | ------------------------ | ----------------------------------------- | | 分配的 vCPUs | 2 vCPUs | 2 vCPUs | | 物理 CPU | Xeon Platinum 8124M | Core i7-1360P | | 物理 CPU 规格 | 18C/36T / 最高 3.5 GHz | 12C/16T / 最高 5.0 GHz | | RAM | 4 GB | 自定义 / 按需 | | 成本 | **$89/月 (~¥13,000)** | **~¥200/月 电费(针对 2 vCPUs)** | | 存储 | EBS(单独计费) | 本地 NVMe(高速、低延迟) | | 网络费用 | 100 GB 后收费 | 无(本地 LAN) | | 性能(2-vCPU 等效) | 基准 | **基准测试中快约 3.3–3.5 倍** |
参考基准测试分数(裸机) | 测试 | 分数(8124M) | 分数@1360P | | ---------------------- | ----: | ----: | |PassMark 单线程 | 2.040| 3.573| |PassMark CPU Mark | 22.287| 20.824| |Geekbench 4 单核 | 3.954| 6.517| |Geekbench 4 多核 | 35.420| 35.803| 基准测试显示,与 EC2 相比,每个 vCPU 的性能提高约 3.3 倍。\ 参考 : [gadgetversus](https://gadgetversus.com/processor/intel-xeon-platinum-8124m-vs-intel-core-i7-1360p/) ### 1.8. 风险与缓解措施 | 风险 | 缓解措施 | | ---------------- | --------------------------------------------- | | 硬件故障 | 使用带有 Proxmox Backup Server 的辅助节点 | | 停电 | UPS 或计划的手动关机 | | 过热 | NUC 额定可在 35 °C 下连续运行 | | 数据丢失 | 备份到 S3 兼容存储 | | 物理访问 | 将服务器放置在受限房间或家庭实验室中 | ## 2. 开始使用 所有开源组件 —— 从头开始的可复现设置。 ### 2.1. 要求 - 一个 Proxmox VE 9.0+ 主机 - 互联网路由器(用于端口转发 VPN 流量) - 静态 IP(用于 Pritunl) - 可选:用于 GUI 访问的 Cloudflare tunnel **所需软件包**(由设置脚本自动安装): - `git` - 获取 MSL Setup 仓库(Personal Edition) - `ipcalc` - 网络地址计算工具 - `jq` - JSON 处理工具 - `zip` - 归档解压工具 - `wget` 或 `curl` - Cloud-init 镜像下载 - `sha256sum` - 镜像完整性验证 **客户机 VM 软件包**(在第 2 阶段自动安装): - `bind-utils` - 用于 DNS 验证的 `nslookup` - `nmap-ncat` - 用于 UDP 端口探测的 `nc` - `pritunl-openvpn` - 来自 Pritunl 仓库的 OpenVPN 软件包(RHEL/AlmaLinux) ### 2.2. 网络设计注意事项 您需要提供以下网络地址,这些地址必须正确配置。 如果您的环境除了连接到 Proxmox VE 的子网外没有其他子网,您通常可以保持下面的示例值不变 —— 除了 和,它们应根据您的实际网络进行设置以避免冲突。 ![Zelogx MSL Setup Network Overview](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/2870be8eb9105220.svg) #### a. MainLan(现有 vmbr0):(例如,192.168.77.0/24 GW: .254) - 您公司或家庭实验室主 LAN 的网络地址。 - 此 LAN 可能连接了智能音箱、电视、游戏机、员工或家庭成员的 PC 和智能手机,以及实验室相关的 VM(如 Web 服务器Cloudflared、Nextcloud、Samba、个人 OpenVPN/WireGuard 服务器、Unbound DNS 等)。\ 然而,属于各个项目的所有 VM(VMnPJxx)都由 PVE Firewall 和 vnet 完全隔离,确保了安全的分离。 - 稍后配置的“Pritunl mainlan-side IP”必须在此 IP 范围内。 - 由于大多数互联网路由器只能将端口转发到 LAN 侧 IP 地址,因此建议将 Proxmox VE 主机直接连接在路由器的 LAN 段下。 #### b. Proxmox PVE 的 mainlan IP:(例如,192.168.77.7) - 这是向互联网路由器添加静态路由时的目标 IP。(自动检测,用于显示) #### c. vpndmzvn(新建):(例如,192.168.80.0/24 GW: 192.168.80.1) - VPN 客户端用于访问开发项目子网的路由。 - 至少需要一个 /30 网络。 #### d. 客户端分配的 IP:(例如,192.168.81.0/24) - 为 wg 和 ovpn 分开。例如:192.168.81.2–126/25, 192.168.81.129–254/25 - 根据“要创建的隔离开发段数量”进一步划分为 /28。 - 每个项目的最大 VPN 客户端数为 13。对于离岸分布式开发,建议预留更多。 #### e. 要创建的隔离开发段数量(项目数量):(例如,8) - 最小为 2,且必须是 2 的幂:2, 4, 8, 16 等。 - 如果项目数为 8:项目 ID 将为 01–08,段将为 vnetpj01 到 vnetpj08。 #### f. 分配给每个项目的网络地址(vnetpjxx)(新建):(例如,172.16.16.0/20) - 每个项目的网络段。此 IP 范围根据“要创建的隔离开发段数量”进行划分。 - 例如:如果分配给 vnetpjxx 的网络地址是 172.16.16.0/20 并且您正在创建 8 个段,它将被相应地划分,如下所示。 - vnetpjxx(172.16.16.0/24)内的 VM 组可以在该段内自由通信。 - 这些 VM 的防火墙设置由 Security Groups (SG) 控制。 - 这些段映射到一个 Pritunl server 实例和 organization。 #### g. Pritunl mainlan-side IP:(例如,192.168.77.10) - 这是互联网路由器上添加端口转发规则时的转发目标 IP。 #### h. Pritunl vpndmzvn-side IP:(例如,192.168.80.2) - Pritunl 客户端在通向每个项目子网时使用的子网。最小 /30 即可,但这里我们分配了一个更大的 /24。 #### i. UDP 端口: - 隔离开发段(项目)数量 × 2 = (16) **注意:** - 某些路由器限制端口转发条目的数量。例如,Buffalo 路由器最多允许 32 个。因此,在决定值 5 时,您还应考虑路由器的最大端口转发容量。 - 此外,如果您正在使用带有 ND Proxy / MAP-E / DS-Lite 的 IPoE,可用端口存在限制,因此您必须提前检查。 ## 3. 已知问题 - **网络图主题行为** 基于 SVG 的网络图的配色方案**不**遵循 Proxmox GUI 主题(浅色/深色)。 相反,它遵循 OS / 浏览器 `prefers-color-scheme` 设置。 因此,当您的 OS 或浏览器设置为浅色模式时,即使 Proxmox GUI 使用的是深色主题,图表也可能会以浅色主题颜色显示(反之亦然)。 ## 4. 为什么这种设计仍然重要 公有云提供全球规模和强大的 SLA —— 这一点无可厚非。 但当目标是可控、安全和成本高效的团队开发时,设计良好的本地环境仍有一席之地。 这种架构证明,小型软件团队、SaaS 初创公司和认真的家庭实验室工程师可以构建隔离、合规、生产级的开发实验室,而无需烧钱或放弃自主权。 安全性、性能和独立性不必是权衡取舍。 它们可以通过设计共存。 ### 动机 #### 问题:Proxmox 中的“扁平网络”陷阱 当我需要通过 VPN 与团队成员共享我的 Proxmox 开发环境时,我遇到了一系列熟悉的问题: - **可见性与隐私**:典型的 VPN 设置往往会暴露太多。我希望每个团队成员看到他们自己的项目 VM,而不是我的个人实验室、其他客户的环境或主机基础设施。 - **管理开销**:跨多个项目为多个用户手动发放、撤销和组织 VPN 配置文件无法扩展。这既繁琐又容易出错。 - **隔离差距**:Proxmox 很强大,但在保持 VPN 访问简单的同时实现租户之间真正的 L2 隔离通常意味着手工打造 SDN + 防火墙规则。可靠地重复该设置很难。 #### 解决方案:构建“Multiverse” 我去寻找一个能够: - 为每个项目启动一个安全、隔离的“气泡”(租户) - 将专用 VPN 网关连接到该气泡 - 处理围绕 VPN 配置文件管理的繁琐工作 我找不到。 所以我构建了 **Zelogx MSL Setup**。 Zelogx 将单个 Proxmox VE 主机转变为多租户实验室提供商。它旨在为需要在不暴露其余基础设施的情况下提供对特定资源的安全、隔离访问的工程师提供服务。 ### 架构 (有关完整详细信息,请参阅本仓库中的高分辨率网络图。) ``` +----------------+ +------------------+ | VPN Client | ----> | Cloudflare / | | (Team Member) | | Internet | +----------------+ +------------------+ | | | VPN Tunnel (UDP/TCP) | Port Forwarding v v +=========================================================================+ | Proxmox VE Host (Physical Server) | | | | +----------------------------------------+ | | | Pritunl VM (VPN Gateway) | | | | [OpenVPN Servers] [WireGuard Servers]| | | | | | | | | +---------+------------------+-----------+ | | | VPN Traffic (Decrypted) | | v | | +----------------------------------------+ | | | SDN Zone: vpndmz (192.168.80.0/24) | | | +----------------------------------------+ | | | | | | (Routing & Firewalling) | | +=========v==============================+ | | | Nftables / Proxmox SDN Engine | <-- "Multiverse" | | | (L2/L3 Isolation Enforcement) | Enforcer | | +=========+====================+=========+ | | | | | | +---------v-------+ +-------v-------+ +-------v-------+ | | | Zone: devpj01 | | Zone: devpj02 | | Zone: devpjNN | | | | [Isolated Lab] | | [Isolated Lab]| ... | [Isolated Lab]| | | | 172.16.16.0/24 | | 172.16.17.0/24| | 172.16.xx.0/24| | | +-----------------+ +---------------+ +---------------+ | | | VM1 | VM2 | | VM1 | VM2 | | VMs... | | | +-----+-----+ +-----+-----+ +--------+ | | (🔒) (🔒) (🔒) | +=========================================================================+ LEGEND: ---> Traffic Flow, [🔒] Isolated Project Environment ``` ### 工程原则 #### 1. 预配置优于运行时开销 Zelogx MSL Setup 被设计为**预配置工具**。 - **无长期运行的 daemon**:所有 SDN 对象、隔离规则和 VPN 网关都是预先配置的。 - **静态安全态势**:设置完成后,环境被“固化”到 Proxmox 中。没有单独的“Zelogx 服务”会在运行时崩溃、漂移或引入自己的攻击面。 #### 2. 100% 原生 Proxmox 构建块 我们尽量坚持“无聊技术的力量”。 - **仅标准功能**:该工具使用原生 Proxmox VE 组件 —— `pvesh`、Proxmox SDN(Simple/VLAN zones)和内置 nftables 集成。 - **更新友好**:没有自定义内核模块或树外驱动程序。您可以继续获得常规的 Proxmox 更新,而不会背负额外的技术债务。 #### 3. Pritunl 自动化(VPN 配置) VPN 端使用官方 Pritunl HTTP API 完全自动化。 在 VPN 设置阶段,MSL Setup: 1. 通过 cloud-init 启动 Pritunl VM。 2. 等待 Pritunl 服务准备就绪。 3. 使用 Pritunl API(在 VM 内配置的 key/secret): - 创建一个或多个 **Organizations** - 创建所需的 **Servers** (OpenVPN / WireGuard) - **将 Organizations 连接到 Servers** - **启动**配置好的 Servers 不涉及 Web UI 自动化 —— 一切都通过文档化的 REST API 进行配置。 从 Proxmox 主机的角度来看,Pritunl VM 被视为黑盒 VPN 网关: - Proxmox SDN 和 nftables 处理路由和隔离。 - Pritunl 自己的 API 仅在该 VM 内部用于定义隧道端点和访问控制。 ## 故障排除:UDP 端口转发验证失败 在 `02_vpnSetup.sh` 期间,您可能会遇到如下错误: ``` ERROR: UDP port forwarding validation failed ``` 这意味着无法从外部访问 VPN 服务器的指定 UDP 端口。 在大多数情况下,这**不是** MSL Setup 的 bug。它通常是由**路由器设置、ISP/网络限制或网络路径问题**引起的。 ### 检查清单 1. **验证路由器端口转发设置** - 预期的 UDP 端口和目标 IP 显示在 `01_networkSetup.sh` 的末尾 - 确保配置的 UDP 端口被转发到 Pritunl VM 的 mainlan-side IP 2. **如果 `01_networkSetup.sh` 控制台日志不再可用** - 卸载后重新运行它以再次确认所需的值 ``` ./99_uninstall.sh ./01_networkSetup.sh ``` 3. **如果您想更改端口号并从头开始** - 从 `00_configNetwork.sh` 重新运行 ``` ./99_uninstall.sh ./00_configNetwork.sh ``` 4. **如果端口转发设置看起来正确但仍然失败** - 您的路由器可能不支持转发到另一个网络段中的 IP - 如果 Proxmox 没有直接连接在路由器下,转发可能会根据拓扑结构而失败 - 某些互联网环境(如 IPoE / MAP-E / DS-Lite / ND Proxy)可能会限制可用端口 5. **修复问题后重新运行** - 进行更正后,运行: ``` ./02_vpnSetup.sh ``` ### 如果您不需要 VPN 服务器 要删除已部署的 Pritunl VM: ``` ./0201_createPritunlVM.sh --destroy ``` ### 如果您想暂时跳过此验证 创建以下文件,然后再次运行 `02_vpnSetup.sh`: ``` touch /root/demo ./02_vpnSetup.sh ``` ### 注意 即使此验证失败,**VM 本身可能已经部署并仍在运行**。 如有需要,您可以手动检查它: ``` ssh root@ ping ```
标签:Hypervisor, JSONLines, MFA, Pritunl, Proxmox, SDN, VPN, Zelogx, 二层隔离, 企业安全, 基础架构即代码, 多因素认证, 安全实验室, 应用安全, 开发环境, 特权提升, 私有云, 网络分段, 网络虚拟化, 网络资产管理, 脚本工具, 自动化部署, 虚拟化, 远程办公, 远程访问, 防火墙, 零信任, 项目隔离