本教程将指导如何通过宝塔面板计划任务结合 Cloudflare API,实现动态域名解析 (DDNS)。动态域名解析可在公网 IP 发生变化时,自动更新 DNS 解析记录。
一、服务器安装 jq
jq
是一个用于处理 JSON 数据的工具,需先安装:文章源自ERI博客-https://eriboke.one/123.html
sudo apt install jq
二、宝塔面板添加计划任务
- 任务类型设置:
- 进入宝塔面板,在计划任务中选择任务类型为
Shell 脚本
。 - 为任务命名,设置循环执行时间为 5 分钟(即每 5 分钟执行一次脚本)。
- 执行角色选择
root
。
- 进入宝塔面板,在计划任务中选择任务类型为
- 粘贴以下脚本:
#!/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_ID
和 RECORD_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
四、执行测试
- 在宝塔面板中手动执行计划任务,检查日志输出,确认公网 IP 和 Cloudflare DNS 记录是否一致。
- 登录 Cloudflare,查看对应域名的 DNS 记录是否已更新成功。
- 设置完成后,可等待 5 分钟再次观察任务自动执行结果。
完成以上步骤后,你的 DDNS 服务将成功运行,通过宝塔面板和 Cloudflare API 实现动态解析。文章源自ERI博客-https://eriboke.one/123.html 文章源自ERI博客-https://eriboke.one/123.html