使用EdgeOne安全开放本地WEB服务

痛点分析

对于许多家庭服务器(HomeLab)玩家来说,在拥有动态公网 IPv6 的前提下,利用 DDNS 和自定义端口对外提供 Web 服务并非难事。然而,在实际使用中,我们往往面临两个棘手的“最后一公里”问题:

  1. 连通性盲区:虽然移动端网络 IPv6 普及率很高,但许多办公网络或老旧 WiFi 依然仅支持 IPv4。如果客户端处于纯 IPv4 环境,将无法直接访问以 IPv6 部署的家庭服务。
  2. 安全性隐忧:直接在路由器防火墙放行端口,将 PVE 宿主机或虚拟机暴露在公网,无异于“裸奔”。一旦单点被破,整个内网集群的安全都将岌岌可危。

在探索解决方案的过程中,我曾尝试过多种方案。最常见的是使用 端口映射(如 fatedier/frp)。这确实解决了连通性问题,但为了维持服务,需要租赁一台公网 VPS 进行流量中转。这不仅带来了带宽瓶颈和额外成本,且中转服务器本身也可能成为攻击跳板。

基于“低成本、高安全、易维护”的原则,我最终锁定了 腾讯云 EdgeOne 方案。

方案选型

EdgeOne 是腾讯云推出的一站式边缘安全加速平台。简单来说,可以将其视为一个“同时也支持安全防护的 CDN”。与直接暴露 IP 或使用 FRP 相比,EdgeOne 完美契合了家庭宽带建站的需求。

以下是主流方案的对比:

特性 FRP 内网穿透 Cloudflare CDN 腾讯云 EdgeOne
访问连通性 取决于 VPS 带宽 大陆地区访问不稳定 国内节点优化,低延迟
IPv4/v6 双栈 需 VPS 支持 支持 完美支持(IPv4 入/IPv6 回)
源站安全性 较差 (端口暴露) 好 (隐藏 IP) 极高 (隐藏 IP + IPSet 白名单)
配置复杂度 高 (需维护 VPS) 低 (域名回源 + PVE统一防护)
成本 VPS 租赁费 免费版功能受限 个人版价格亲民/有免费额度

EdgeOne 的核心优势在于:

  • 双栈无缝转换:EdgeOne 节点同时提供 IPv4/v6 入口。客户端即使只有 IPv4,也能访问 EdgeOne,再由 EdgeOne 通过 IPv6 回源到家庭 PVE 内部的服务。
  • 域名回源支持:新版 EdgeOne 支持直接填写域名作为源站(配合 DDNS),消除了动态 IP 变更的维护焦虑。
  • 节点级防护:只需在 PVE 防火墙放行 EdgeOne 的节点 IP段,即可屏蔽所有非经 CDN 的恶意扫描。

架构原理

整个请求的流转过程非常清晰。我们不再需要复杂的脚本来监测 IP 变动,而是利用标准的 DDNS 工具维护一条“源站域名”解析记录,EdgeOne 负责从这个域名获取最新的 IPv6 地址进行回源。

Error parsing Mermaid diagram!

Parse error on line 10:
...         LXC[LXC/VM (Web服务)]           
-----------------------^
Expecting 'SQE', 'DOUBLECIRCLEEND', 'PE', '-)', 'STADIUMEND', 'SUBROUTINEEND', 'PIPE', 'CYLINDEREND', 'DIAMOND_STOP', 'TAGEND', 'TRAPEND', 'INVTRAPEND', 'UNICODE_TEXT', 'TEXT', 'TAGSTART', got 'PS'

部署实战

这里以 Proxmox VE 8.x(宿主机或 LXC 容器中运行 Docker)环境为例,演示如何搭建这套系统。

1. 本地服务准备

假设你在 PVE 中运行了一个 LXC 容器(或 VM),里面部署了你的 Web 服务(例如 Halo 博客、Nextcloud 等)。

  • 服务端口:60023
  • IPv6 连通性:确保该 LXC/VM 能够获取到公网 IPv6 地址(SLAAC 或 DHCPv6)。

2. DDNS 配置 (ddns-go)

为了应对家庭宽带 IPv6 地址的动态变化,我们不再手写脚本,而是使用成熟的开源工具 ddns-go

  1. 部署:建议在 PVE 的某个常驻容器(如 Docker CT)中部署 ddns-go
  2. 配置:在 ddns-go 后台配置腾讯云 DNSPod(或其他服务商)。
  3. 设置回源域名:设置一个专门用于回源的子域名(例如 origin.yoursite.com)。
  4. 接口选择关键点,启用 IPv6,选择“通过网卡获取”,并指定你 Web 服务所在的网卡接口。如果服务在另一台机器,也可以选择“通过接口获取”模式。
  5. 验证:确保 origin.yoursite.com 始终解析到你 Web 服务当前的 IPv6 地址(AAAA 记录)。

3. EdgeOne 配置

登录 腾讯云 EdgeOne 控制台,新建或选择已有站点。

  1. 添加服务域名:在 EdgeOne 域名管理中,添加对外服务的子域名(如 blog.yoursite.com)。
  2. 配置回源
    • 回源类型:选择 “域名”
    • 源站地址:填写上一步配置的 DDNS 域名(origin.yoursite.com)。
    • 回源协议:选择 IPv6协议跟随
    • 端口:填写本地服务的公网映射端口(在 PVE 环境通常就是容器的直通端口,如 60023)。

4. PVE 安全防护 (重点)

这是 PVE 环境下的高光时刻。大多数人习惯在 OpenWrt 或硬路由上做防火墙,其实直接在 PVE 层做防护更加精细,且不受路由设备更换影响。

第一步:获取 EdgeOne 节点 IP

在 EdgeOne 控制台侧边栏找到 “源站防护”“安全防护” 模块,开启功能并复制 EdgeOne 回源节点 IP 列表

第二步:创建 datacenter 级 IPSet

  1. 登录 PVE 管理页面,点击 Datacenter (数据中心) -> Firewall (防火墙) -> IP Sets
  2. 点击 Create,名称填写 edgeone-ips
  3. 选中创建好的 IP Set,点击右侧的 Add
  4. 将 EdgeOne 提供的 IP 段依次添加进去。
    • 提示:如果 IP 段较多,可以使用 PVE 的 Shell 进行批量添加,或者使用 Terraform/Ansible 管理。手动添加一次通常也足够,因为 CDN 节点 IP 变动频率较低。

PVE IPSet (示意图)

第三步:对 Web 服务容器应用防火墙

  1. 选中运行 Web 服务的 LXC 容器或 VM
  2. 点击 Firewall (防火墙) -> Options,将 Firewall 设为 Yes(启用)。
  3. 点击 Firewall -> Add 添加规则:
    • Direction: IN (入站)
    • Action: ACCEPT (允许)
    • Macro: 可以选 Web 相关或者留空。
    • Protocol: TCP
    • Source Filter: 选择我们刚刚创建的 IP Set +edgeone-ips
    • Dest. Port: 填写你的服务端口 60023
    • Enable: 勾选。
  4. 确保该界面没有其他允许 Any 来源访问 60023 的规则。

效果:现在,只有来自 EdgeOne 节点列表的流量能通过防火墙进入你的容器。即便有人扫描到了你的公网 IPv6 地址,只要他不是通过 EdgeOne 来的,都会被 PVE 直接丢弃。

结语

方案经过调整,在 PVE 环境下实施显得更加专业和规整。

  • ddns-go 解决了 IP 变动的后顾之忧。
  • EdgeOne 提供了极佳的访问速度和双栈入口。
  • PVE IPSet 提供了数据中心级别的安全隔离。

通过这套组合拳,我们用极低的成本(不仅是金钱成本,还有维护精力的成本),在家庭数据中心构建了一套媲美企业级防护的公网服务架构。

Web 服务 (LXC/VM)PVE 防火墙EdgeOne用户 (User)Web 服务 (LXC/VM)PVE 防火墙EdgeOne用户 (User)支持 IPv4/IPv6 双栈访问alt[IP 在白名单 (EdgeOne 节点)][IP 不在白名单 (恶意扫描)]1. 发起 HTTPS 请求 (blog.site.com)2. 查询源站 IP (origin.site.com)3. IPv6 回源请求 (TCP 60023)4. 检查 Source IP 是否在 IPSet 白名单5. 放行请求6. 返回数据7. 返回数据8. 返回响应5. DROP (丢弃包)