使用宝塔计划任务和 Cloudflare 实现 DDNS

本教程将指导如何通过宝塔面板计划任务结合 Cloudflare API,实现动态域名解析 (DDNS)。动态域名解析可在公网 IP 发生变化时,自动更新 DNS 解析记录。

一、服务器安装 jq

jq 是一个用于处理 JSON 数据的工具,需先安装:文章源自ERI博客-https://eriboke.one/123.html

sudo apt install jq

二、宝塔面板添加计划任务

  1. 任务类型设置:
    • 进入宝塔面板,在计划任务中选择任务类型为 Shell 脚本
    • 为任务命名,设置循环执行时间为 5 分钟(即每 5 分钟执行一次脚本)。
    • 执行角色选择 root
  2. 粘贴以下脚本:
    #!/bin/bash

    # Cloudflare API 配置
    API_TOKEN="改为你的API_TOKEN"
    ZONE_ID="改为你的ZONE_ID"
    RECORD_ID="改为你的RECORD_ID"
    DOMAIN="你的ddns域名"

    # 获取当前公网IP
    CURRENT_IP=$(curl -s http://ipv4.icanhazip.com)

    # 获取 Cloudflare 上的记录
    DNS_RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \\
    -H "Authorization: Bearer $API_TOKEN" \\
    -H "Content-Type: application/json")

    # 从 DNS 记录中提取 IP
    EXISTING_IP=$(echo $DNS_RECORD | jq -r .result.content)

    # 显示当前 IP 和已存在 IP
    echo "当前公网 IP: $CURRENT_IP"
    echo "已存在的 DNS 记录 IP: $EXISTING_IP"

    # 如果当前 IP 和已存在 IP 不同,更新 DNS 记录
    if [ "$CURRENT_IP" != "$EXISTING_IP" ]; then
    UPDATE_RESPONSE=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \\
    -H "Authorization: Bearer $API_TOKEN" \\
    -H "Content-Type: application/json" \\
    --data "{\\"type\\":\\"A\\",\\"name\\":\\"$DOMAIN\\",\\"content\\":\\"$CURRENT_IP\\",\\"ttl\\":60,\\"proxied\\":false}")

    # 检查更新是否成功
    SUCCESS=$(echo $UPDATE_RESPONSE | jq -r .success)

    if [ "$SUCCESS" == "true" ]; then
    echo "IP已更新为: $CURRENT_IP"
    else
    echo "IP更新失败: $UPDATE_RESPONSE"
    fi
    else
    echo "IP没有变化: $CURRENT_IP"
    fi
    • API_TOKEN:在 Cloudflare 账户中生成的 API Token。
    • ZONE_ID:域名的唯一标识,可在 Cloudflare 网站概述页面找到。
    • RECORD_ID:需要动态更新的 DNS 记录 ID。
    • DOMAIN:需要更新的域名或子域名。

三、获取 Cloudflare API 信息

要获取 ZONE_IDRECORD_ID,可以在终端中运行以下命令:文章源自ERI博客-https://eriboke.one/123.html

curl -X GET "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records" \\
-H "Authorization: Bearer API_TOKEN" \\
-H "Content-Type: application/json"

或者使用下面这个 Python 脚本:文章源自ERI博客-https://eriboke.one/123.html

import requests
import json
import logging

# 配置日志文件
logging.basicConfig(filename='dns_records_log.txt', level=logging.INFO, format='%(asctime)s - %(message)s')

# Cloudflare API 信息
url = "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records"
headers = {
    "Authorization": "Bearer API_TOKEN",
    "Content-Type": "application/json"
}

# 发送 GET 请求到 Cloudflare API
response = requests.get(url, headers=headers)

# 检查请求是否成功
if response.status_code == 200:
    # 解析 JSON 响应数据
    data = response.json()

    # 检查是否有 DNS 记录
    if data.get("success"):
        dns_records = data.get("result", [])

        if dns_records:
            for record in dns_records:
                # 获取每个 DNS 记录的详细信息
                record_id = record.get("id")
                record_type = record.get("type")
                record_name = record.get("name")
                record_content = record.get("content")

                # 格式化后的 DNS 记录信息
                record_info = f"Record ID: {record_id}, Type: {record_type}, Name: {record_name}, Content: {record_content}"

                # 将记录写入日志文件
                logging.info(record_info)

            print("DNS 记录信息已写入日志文件 'dns_records_log.txt'。")
        else:
            print("没有找到任何 DNS 记录。")
    else:
        print("API 请求成功,但返回的结果不正确。")
else:
    print(f"请求失败,状态码: {response.status_code}")

运行后会在日志文件中记录相关信息,包括 RECORD_ID文章源自ERI博客-https://eriboke.one/123.html

四、执行测试

  1. 在宝塔面板中手动执行计划任务,检查日志输出,确认公网 IP 和 Cloudflare DNS 记录是否一致。
  2. 登录 Cloudflare,查看对应域名的 DNS 记录是否已更新成功。
  3. 设置完成后,可等待 5 分钟再次观察任务自动执行结果。

完成以上步骤后,你的 DDNS 服务将成功运行,通过宝塔面板和 Cloudflare API 实现动态解析。文章源自ERI博客-https://eriboke.one/123.html 文章源自ERI博客-https://eriboke.one/123.html

匿名

发表评论

匿名网友

拖动滑块以完成验证