有些时候vps或者家宽ip不是固定的,此时就需要一个简单的ddns服务
如果你有一个托管在cloudflare的域名,就可以通过脚本来自建ddns
要快速设置基于 Cloudflare 的 DDNS 服务,可以按以下步骤操作,这里以ddns.example.com为例:
1. 准备环境
这里以debian和ubuntu为例,其余linux发行版安装curl和fq即可
确保你的系统已安装以下工具:
- curl:用于与 Cloudflare API 交互。
- jq:用于解析 JSON 格式的数据。
debian和ubuntu下的安装命令:
sudo apt update
sudo apt install curl jq -y
2. 创建 Cloudflare API 令牌
- 登录到你的 Cloudflare Dashboard.
- 进入 API Tokens页面,点击 创建令牌。
- 使用 编辑区域 DNS 模板。
- 这里Select选择你的域名
example.com
,其余照填,创建令牌并复制它,备用。
3. 编写 DDNS 脚本
创建一个脚本文件 ddns.sh
:
注意将Cloudflare API 配置部分替换为你的域名和令牌
#!/bin/bash
# Cloudflare API 配置
ZONE_NAME="example.com" # 域名
RECORD_NAME="ddns.example.com" # DDNS 记录
CF_API_TOKEN="your_cloudflare_api_token" # 替换为你的 Cloudflare API 令牌
# 获取 Zone ID
ZONE_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=${ZONE_NAME}" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" | jq -r '.result[0].id')
# 获取记录 ID
RECORD_ID=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/dns_records?name=${RECORD_NAME}" \
-H "Authorization: Bearer ${CF_API_TOKEN}" \
-H "Content-Type: application/json" | jq -r '.result[0].id')
# 获取当前公网 IP
CURRENT_IP=$(curl -s https://ipv4.icanhazip.com)
# 更新 DNS 记录
UPDATE=$(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\":\"${CURRENT_IP}\",\"ttl\":120,\"proxied\":false}")
# 检查结果
if echo "$UPDATE" | grep -q '"success":true'; then
echo "[$(date)] DNS 记录更新成功: ${CURRENT_IP}"
else
echo "[$(date)] DNS 记录更新失败!"
echo "$UPDATE"
fi
4. 设置脚本权限
将脚本设置为可执行:
chmod +x ddns.sh
5. 设置定时任务
使用 cron
每 30 分钟运行一次脚本:
编辑
crontab
:crontab -e
添加以下内容:
*/30 * * * * /path/to/ddns.sh >> /var/log/ddns.log 2>&1
如果需要其他间隔时间,例如十分钟一次,则将30改为10即可。
测试脚本
直接运行脚本以测试:
./ddns.sh
查看 /var/log/ddns.log
确保日志记录正确。
完成后,DDNS 会每 30 分钟更新一次你的 ddns.example.com
记录。
其他记录同理,只需修改脚本中RECORD_NAME="ddns.example.com"的域名即可。