AutoForward Hub从CF域名接口调用-服务器健康检测 + 故障切换到备用机

一、核心原理:为什么完全可行?

Cloudflare 提供了完整的 DNS 管理 API,支持用程序直接:

  1. 实时查询当前域名的解析 IP
  2. 一键修改 A/AAAA 记录,把域名指向新的服务器 IP
  3. 控制是否开启 Cloudflare 代理(橙色云 / 灰色云)
  4. 免费套餐就支持,无额外费用,API 调用无限制(有合理的速率限制,完全满足你的场景)

你只需要在现有面板的「服务器故障告警」逻辑里,加一段 API 调用代码,就能实现:

检测到主服务器离线 → 自动切换转发到备用服务器 → 自动调用 Cloudflare API,把域名解析 IP 从主服务器 IP 改成备用服务器 IP → 流量无缝切到备用机,全程无需人工操作


二、你需要准备的 3 个关键信息(Cloudflare 后台获取)

1. API Token(核心权限凭证,推荐用这个,比 Global API Key 安全)

  • 路径:Cloudflare 后台 → 右上角头像 → My ProfileAPI TokensCreate Token
  • 权限配置(最小权限原则,只给 DNS 编辑权限):
    • ZoneZoneRead(读取域名信息)
    • ZoneDNSEdit(编辑 DNS 解析)
    • 区域范围:选择你要管理的域名(比如 example.com
  • 生成后复制保存,只显示一次,后续用这个 Token 调用 API

2. Zone ID(域名的唯一 ID)

  • 路径:Cloudflare 后台 → 选中你的域名 → 首页右下角 API 区域,直接能看到 Zone ID

3. Record ID(要修改的解析记录的 ID)

  • 可以用 API 一次性获取,也可以在 Cloudflare 后台 → DNS → 找到你要修改的记录(比如 www.example.com)→ 点击编辑 → 浏览器地址栏最后一段就是 Record ID(也可以用 API 批量获取)

三、和你现有面板对接的完整实现方案

方案 1:直接在现有面板加 API 调用(最省事,无缝集成)

你现在的 AutoForward Hub 已经有「服务器状态检测」逻辑,只需要在检测到主服务器离线、切换到备用服务器的代码分支里,加一段 Cloudflare API 调用即可。

核心 API 接口(直接用)

1. 获取当前解析记录的 Record ID(首次运行用,后续可以缓存)

http

GET https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records?name={要修改的域名}&type=A
Headers:
Authorization: Bearer {CF_API_TOKEN}

返回结果里 result[0].id 就是 Record ID,result[0].content 是当前解析的 IP。

2. 更新解析 IP(核心接口,故障切换时调用)

http

PUT https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{RECORD_ID}
Headers:
Authorization: Bearer {CF_API_TOKEN}
Content-Type: application/json
Body:
{
  "type": "A",
  "name": "你的域名",
  "content": "备用服务器的IP",
  "ttl": 60,
  "proxied": false
}
  • ttl: 60:解析生效时间设为 1 分钟,最快切换(Cloudflare 免费版最小 TTL 是 60s)
  • proxied: false:灰色云,直接解析到真实 IP(适合你的转发面板,不经过 Cloudflare 代理,直连速度快;如果是网站可以设为 true 开代理)

2. 不同语言的示例代码(直接复制改参数就能用)

Python 版(适合你用 Flask 写的 YYZQ 转发面板,无缝集成)

python

运行

import requests

# 配置信息(从面板配置里读取,不要硬编码)
CF_API_TOKEN = "你的Cloudflare API Token"
ZONE_ID = "你的Zone ID"
RECORD_NAME = "你的域名,比如 proxy.example.com"
MASTER_IP = "主服务器IP 38.190.245.62"
BACKUP_IP = "备用服务器IP 149.30.247.213"

headers = {
    "Authorization": f"Bearer {CF_API_TOKEN}",
    "Content-Type": "application/json"
}

def get_current_record_id():
    """获取当前解析记录的ID"""
    url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records?name={RECORD_NAME}&type=A"
    res = requests.get(url, headers=headers).json()
    if res["success"]:
        return res["result"][0]["id"], res["result"][0]["content"]
    return None, None

def update_dns_ip(new_ip):
    """更新域名解析IP"""
    record_id, _ = get_current_record_id()
    if not record_id:
        print("获取Record ID失败")
        return False
    url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{record_id}"
    data = {
        "type": "A",
        "name": RECORD_NAME,
        "content": new_ip,
        "ttl": 60,
        "proxied": False
    }
    res = requests.put(url, json=data, headers=headers).json()
    if res["success"]:
        print(f"域名解析已成功切换到 {new_ip}")
        return True
    else:
        print(f"切换失败: {res['errors']}")
        return False

# 你现有面板的故障检测逻辑里调用:
# 检测到主服务器离线 → 调用 update_dns_ip(BACKUP_IP)
# 检测到主服务器恢复 → 调用 update_dns_ip(MASTER_IP) 切回
Shell 版(适合在服务器上跑定时脚本,和 AutoForward Hub 联动)

bash

运行

#!/bin/bash
# 配置
CF_API_TOKEN="你的API Token"
ZONE_ID="你的Zone ID"
RECORD_NAME="proxy.example.com"
MASTER_IP="38.190.245.62"
BACKUP_IP="149.30.247.213"

# 检测主服务器是否在线(和你面板的检测逻辑一致,比如ping端口)
nc -zv $MASTER_IP 53020 > /dev/null 2>&1
if [ $? -ne 0 ]; then
    echo "主服务器离线,切换到备用服务器"
    # 调用API更新IP
    RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME&type=A" \
        -H "Authorization: Bearer $CF_API_TOKEN" | jq -r '.result[0].id')
    curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
        -H "Authorization: Bearer $CF_API_TOKEN" \
        -H "Content-Type: application/json" \
        --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$BACKUP_IP\",\"ttl\":60,\"proxied\":false}"
else
    echo "主服务器在线,确保解析指向主服务器"
    # 可选:定期检查,确保解析正确,防止异常
    CURRENT_IP=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME&type=A" \
        -H "Authorization: Bearer $CF_API_TOKEN" | jq -r '.result[0].content')
    if [ "$CURRENT_IP" != "$MASTER_IP" ]; then
        echo "解析异常,切回主服务器"
        RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME&type=A" \
            -H "Authorization: Bearer $CF_API_TOKEN" | jq -r '.result[0].id')
        curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
            -H "Authorization: Bearer $CF_API_TOKEN" \
            -H "Content-Type: application/json" \
            --data "{\"type\":\"A\",\"name\":\"$RECORD_NAME\",\"content\":\"$MASTER_IP\",\"ttl\":60,\"proxied\":false}"
    fi
fi

四、和你现有 AutoForward Hub 面板的联动逻辑(完整流程)

你现在的面板已经有这些能力,只需要串联起来:

  1. 健康检测:面板定时检测主服务器(38.190.245.62)的端口(比如 53020)是否连通
  2. 故障判定:连续 N 次检测失败 → 判定主服务器离线
  3. 转发切换:自动把转发规则切到备用服务器(149.30.247.213),这一步你已经完成
  4. DNS 自动切换:在这一步之后,调用上面的 Cloudflare API,把域名解析 IP 从主服务器改成备用服务器
  5. 恢复切回:后续检测到主服务器恢复在线 → 自动把转发切回主服务器,同时调用 API 把域名解析切回主服务器 IP
  6. 日志记录:在面板的「运行日志」里记录 DNS 切换的时间、原因、新旧 IP,方便排查

五、关键注意事项(避坑指南)

1. 解析生效时间

  • Cloudflare 的 DNS 全球节点同步需要时间,TTL 设为 60s 后,全球大部分地区 1-3 分钟内生效,国内可能稍慢(5 分钟内)
  • 不要频繁调用 API 切换,避免触发 Cloudflare 的速率限制(免费版 API 调用限制是 1200 次 / 5 分钟,完全够用)

2. 代理状态(proxied)的选择

  • proxied: false(灰色云):推荐你的转发面板用,直接解析到真实 IP,不经过 Cloudflare 节点,延迟低、速度快,适合端口转发、SSH、游戏等直连场景
  • proxied: true(橙色云):适合网站,隐藏源站 IP,防攻击,但会增加延迟,不适合端口转发

3. 安全防护

  • API Token 一定要用最小权限,只给 DNS 编辑权限,不要用 Global API Key(权限太大,泄露风险高)
  • 不要把 API Token 硬编码在代码里,用面板的配置文件存储,加密保存
  • 限制 API 调用的来源 IP(Cloudflare 后台可以设置 Token 的 IP 白名单,只允许你面板服务器的 IP 调用)

4. 多域名 / 多记录支持

  • 如果你的面板有多个域名,只需要循环调用 API 即可,每个域名对应一个 Zone ID 和 Record ID
  • 可以在面板里加一个「Cloudflare 配置」页面,让用户自己填 API Token、Zone ID、域名,实现自助配置

六、进阶优化(可选,让方案更完善)

1. 健康检测优化

  • 不仅检测端口连通性,还要检测转发服务是否正常(比如模拟一次转发请求,确认服务可用)
  • 增加「连续失败次数」阈值,避免单次网络波动导致误切换

2. 多备用服务器支持

  • 支持主 → 备 1 → 备 2 多级切换,API 逻辑不变,只需要修改切换的 IP 即可
  • 自动轮询健康服务器,把域名解析到当前最健康的服务器

3. 邮件 / 告警通知

  • 切换 DNS 后,给你发邮件 / Telegram 告警,通知你服务器故障和 DNS 切换情况
  • 可以在 API 调用成功后,加一段邮件发送代码(用 Python 的 smtplib 实现)

4. 面板可视化配置

  • 在 AutoForward Hub 里加一个「Cloudflare 自动切换」配置页,让用户可视化配置域名、主备 IP、API 信息,不用改代码
  • 加一个「手动切换」按钮,支持人工一键切换域名解析 IP

七、一句话总结

你的需求 100% 可实现,技术上完全成熟,免费就能落地。只需要在现有面板的故障切换逻辑里,加一段 Cloudflare API 调用代码,就能实现「服务器故障 → 自动切转发 → 自动改域名解析」的全流程自动化,完美解决你现在的瓶颈。

世界树

一步一步来

您可能还喜欢...