Cloudflare的DDNS功能使用,通过Linux定时任务配合shell脚本,完成动态IP的域名解析。适用于家庭网络公网IP不固定的情况。

创建一个API密钥

登录Cloudflare之后 -> 点击页面右上角的个人中心 -> 进入My Profile -> 进入API token
也可以直接访问链接:https://dash.cloudflare.com/profile/api-tokens

创建一个Token,选择模板Edit zone DNS

点击 提交确认之后,复制token并保存起来. (注意这个Token只会展示这一次,忘记了就只能重新创建一个Token)

编写脚本,验证流程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
# Cloudflare API令牌
API_TOKEN="填token"
# Cloudflare Zone ID
ZONE_ID="填Zone ID"
# DNS记录ID(需要更新的记录ID)
RECORD_ID="填DNS记录ID"
# 需要更新的域名,subdomain.example.com
RECORD_NAME="填域名"

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

# 获取现有的DNS记录IP
DNS_RECORD_RESPONSE=$(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地址
DNS_RECORD_IP=$(echo "$DNS_RECORD_RESPONSE" | sed -n 's/.*"content":"\([^"]*\)".*/\1/p')
echo "提取到的DNS记录IP: $DNS_RECORD_IP"

# 检查IP是否需要更新
if [ "$CURRENT_IP" == "$DNS_RECORD_IP" ]; then
echo "IP地址未改变,无需更新"
else
echo "IP地址已改变,开始更新DNS记录"

# 更新DNS记录
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\":\"${RECORD_NAME}\",\"content\":\"${CURRENT_IP}\",\"ttl\":120,\"proxied\":false}")

# 检查更新结果
if echo "$RESPONSE" | grep -q "\"success\":true"; then
echo "DNS记录已成功更新为新IP: ${CURRENT_IP}"
else
echo "更新DNS记录失败:$RESPONSE"
fi
fi

首先在控制台新增一条对应的域名DNS解析记录,用于后续API动态修改。

解释一下脚本中的几个变量:

  1. API_TOKEN:就是上面创建的token
  2. ZONE_ID:在控制台websites列表页面-进入你的域名页面-在右侧可以看到API Zone ID
  3. RECORD_ID:就是你需要更新的那一条解析记录的ID,可以用下面的API接口查看
    1
    2
    3
    curl -X GET "https://api.cloudflare.com/client/v4/zones/你的ZONE_ID/dns_records?type=A&name=你的解析域名" \
    -H "Authorization: Bearer 你的API_TOKEN" \
    -H "Content-Type: application/json"
    1
    2
    // 返回的响应结果如下,第一个id字段,就是这条域名解析记录的ID
    {"result":[{"id":"3995e7cd0ee84056abe3e0c2d191cf62","zone_id":"04dbfb40755d415ba7c2f40f562e357e","zone_name":"dollcode.cn","name":"blog.dollcode.cn","type":"A","content":"114.114.114.114","proxiable":true,"proxied":false,"ttl":120,"settings":{}..............
  4. RECORD_NAME:填自己的域名就行了

根据实际情况替换变量为自己的,然后保存脚本。命名为cfddns.sh,然后执行如下命令验证效果

1
2
3
4
# 赋予可执行权限
chmod +x /opt/ddns/cfddns.sh
# 执行验证
/opt/ddns/cfddns.sh

就可以看到对应的日志信息了!

注册为定时任务

接下来就是注册定时任务,每十分钟执行一次,完成自动动态更新解析

使用 cron 定时执行该脚本。编辑 cron 配置:

1
crontab -e

添加如下内容,使其每10分钟执行一次:

1
*/10 * * * * /opt/ddns/cfddns.sh >> /opt/ddns/ddnsupdate.log 2>&1

wq保存退出

注意目录替换为实际路径。并检查/opt/ddns/ddnsupdate.log 中的日志输出即可!