Files
Meshray-Manager/docs/DDNS 双模式架构设计.md
T
2026-06-30 15:14:37 +08:00

7.8 KiB
Raw Blame History

DDNS 双模式架构设计文档

📋 架构概述

DDNS(动态 DNS)在本系统中采用双模式设计,实现了配置与使用的完全解耦,支持两种不同的应用场景。


🎯 核心设计理念

1. 配置与使用分离

  • DDNS 配置:仅存储 DNS 服务商的对接信息(基础设施)
  • DDNS 使用:基于配置创建具体的 DNS 记录(应用层)

2. 双层架构

基础设施层(Tab 3: DDNS 配置)
└─ 配置 DNS 服务商信息
   ├─ 阿里云 DNS
   ├─ 腾讯云 DNSPod
   └─ Cloudflare

应用层(Tab 4: 增强 - DDNS 内网穿透)
└─ 基于配置创建完整服务
   ├─ A 记录(IPv4)
   ├─ AAAA 记录(IPv6)
   ├─ TXT 记录(文本)
   └─ CNAME 记录(别名)

🏗️ 两种配置模式详解

模式 A:基础设施配置 🏭

使用场景:组网同步 MeshSeed

入口位置:服务管理 → Tab 3 "DDNS"

配置字段

字段 说明 示例
DNS 服务商 选择云服务商 Cloudflare / 阿里云 / 腾讯云
根域名 主域名 example.com
API Token Cloudflare API 令牌 cf_abc123...
AccessKey ID 阿里云访问密钥 LTAI5t...
AccessKey Secret 阿里云密钥 ******
SecretId 腾讯云密钥 ID AKID...
SecretKey 腾讯云密钥 ******

特点

  • 只配置服务商对接信息
  • 不创建具体 DNS 记录
  • 可在组网创建时直接选用
  • 支持连通性测试

使用流程

1. 在 Tab 3 配置 Cloudflare + example.com
2. 创建组网时 → 启用 DDNS 同步 → 选择上述配置
3. 系统自动创建 TXT 记录:_meshray.{短 ID}.example.com
4. 设备加入时读取 TXT 记录获取 MeshSeed

模式 B:全功能 DDNS 服务 🚀

使用场景:NAS 内网穿透、家庭服务器暴露、自定义 DNS 记录

入口位置:服务管理 → Tab 4 "增强" → DDNS 内网穿透

配置字段

字段 说明 示例
选择 DDNS 配置 从已配置的服务商中选择 Cloudflare (example.com)
记录类型 DNS 记录类型 A / AAAA / TXT / CNAME
主机记录 子域目前前缀 nas, home, server
目标 IP IPv4/IPv6 地址 192.168.1.100 / ::ffff:192.168.1.100
检测端口 可达性检测端口 80, 443, 8080
TXT 记录名称 TXT 记录的键 _meshray, verification-code
TXT 记录值 TXT 记录的值 配置内容或验证信息
TTL DNS 缓存时间 600 (10 分钟)

特点

  • 完整的 DNS 记录管理
  • 支持多种记录类型
  • 定时检测 IP 变化并自动更新
  • 支持内网穿透等高级应用

使用流程

前置条件:已在 Tab 3 配置 DDNS 服务商

1. 切换到 Tab 4 "增强"
2. 点击 "DDNS 内网穿透" 卡片
3. 选择已配置的 DDNS 服务商
4. 填写记录信息:
   - 记录类型:AAAA (IPv6)
   - 主机记录:nas
   - 目标 IP::ffff:192.168.1.100
   - 检测端口:80
5. 系统开始工作:
   - 定时检测本地 IPv6 地址
   - 调用 DNS 服务商 API 更新记录
   - 用户可通过 nas.example.com 访问

🔄 两种模式对比

维度 基础设施配置 全功能服务
定位 基础设施层 应用层
用途 组网同步 内网穿透/自定义
入口 Tab 3 "DDNS" Tab 4 "增强"
配置复杂度 简单(仅对接信息) 复杂(完整记录)
记录类型 无(由 Usage 定义) A/AAAA/TXT/CNAME
依赖关系 独立 依赖基础设施配置
典型场景 MeshSeed 同步 NAS 远程访问

📁 页面结构

服务管理(Service Management
├── Tab 1: TUN - 虚拟网络接口配置
├── Tab 2: TURN - 中继服务配置
├── Tab 3: DDNS - 基础设施配置 ← 🏭
└── Tab 4: 增强 - 应用服务扩展 ← 🚀
    ├── DDNS 内网穿透
    └── 自定义服务(预留)

🔧 技术实现

前端关键代码

1. 模式切换

<el-form-item label="配置模式" prop="config_mode">
  <el-radio-group v-model="formData.config_mode">
    <el-radio value="infrastructure">
      🏗️ 基础设施配置
      <span class="radio-desc">仅配置 DNS 服务商用于组网同步等场景</span>
    </el-radio>
    <el-radio value="fullservice">
      🚀 全功能 DDNS 服务
      <span class="radio-desc">创建完整的 DDNS 记录支持内网穿透等应用</span>
    </el-radio>
  </el-radio-group>
</el-form-item>

2. 表单字段区分

<!-- 基础设施模式 -->
<template v-if="formData.config_mode === 'infrastructure'">
  <el-form-item label="DNS 服务商" prop="provider">
    <el-select v-model="formData.provider">
      <el-option label="阿里云 DNS" value="aliyun" />
      <el-option label="Cloudflare" value="cloudflare" />
    </el-select>
  </el-form-item>
  
  <el-form-item label="根域名" prop="domain">
    <el-input v-model="formData.domain" placeholder="example.com" />
  </el-form-item>
</template>

<!-- 全功能服务模式 -->
<template v-else-if="formData.config_mode === 'fullservice'">
  <el-form-item label="选择 DDNS 配置" prop="ddns_config_id">
    <el-select v-model="formData.ddns_config_id" filterable>
      <el-option
        v-for="config in ddnsConfigs"
        :key="config.id"
        :label="`${config.name} (${config.config?.domain})`"
        :value="config.id"
      />
    </el-select>
  </el-form-item>
  
  <el-form-item label="记录类型" prop="record_type">
    <el-select v-model="formData.record_type">
      <el-option label="A (IPv4)" value="A" />
      <el-option label="AAAA (IPv6)" value="AAAA" />
    </el-select>
  </el-form-item>
  
  <!-- 更多字段... -->
</template>

3. 验证规则区分

if (formData.value.type === 'DDNS') {
  if (formData.value.config_mode === 'infrastructure') {
    // 只校验服务商信息
    rules.provider = [{ required: true }]
    rules.domain = [{ required: true }]
  } else if (formData.value.config_mode === 'fullservice') {
    // 校验完整记录
    rules.ddns_config_id = [{ required: true }]
    rules.record_type = [{ required: true }]
    
    if (['A', 'AAAA'].includes(formData.value.record_type)) {
      rules.subdomain = [{ required: true }]
      rules.target_ip = [{ required: true, pattern: IP_REGEX }]
      rules.port = [{ required: true }]
    }
  }
}

💡 用户体验优化

1. 清晰的引导文案

  • Tab 3 明确标注为"基础设施"
  • 提示可在组网创建时直接选用
  • 提示可在"增强"页创建完整服务

2. 智能的级联选择

  • 全功能模式下,下拉框只显示已配置的 DDNS 服务商
  • 未配置服务商时,提示用户先到 Tab 3 配置

3. 直观的视觉反馈

  • 使用 Emoji 图标区分两种模式(🏗️ vs 🚀
  • 描述文字清晰说明用途差异
  • 卡片式设计展示增强服务

🔮 未来扩展

Tab 4 "增强"页预留了扩展能力,未来可以添加:

  1. DDNS 高级应用

    • 多记录联动(同时更新 A 和 AAAA)
    • 批量 DNS 记录管理
    • DNS 解析统计
  2. 其他服务类型

    • 反向代理配置
    • SSL 证书自动申请
    • 端口转发规则
  3. 自动化场景

    • 条件触发器(如:仅在检测到 IPv6 变化时更新)
    • Webhook 通知(更新后回调通知)

📝 总结

通过双模式设计,本系统实现了:

配置与使用解耦 - 基础设施与应用层分离
灵活复用 - 一次配置,多处使用
场景覆盖 - 同时支持组网同步和内网穿透
易于扩展 - 增强页预留未来能力

这种设计既保证了架构的清晰性,又提供了强大的功能性,为用户提供了最佳的使用体验。