ACQUIRING IMAGE…

LOG ENTRYCAT / 教程

国内动态IP自动更新到Cloudflare DNStitle: 国内动态IP自动更新到Cloudflare DNS

使用 Cloudflare API 和 Bash 脚本实现家庭动态 IP 自动更新到 DNS 记录,配合 crontab 定时执行。

教程经验分享DNS

LOADING DATABASE
Cloudflare为我们提供了非常丰富的API,我们可以通过API实现对DNS记录的增删改查。这里我们使用Cloudflare的API来实现动态IP的更新。
首先,我们需要一个Cloudflare的账号,并且在Cloudflare上添加一个域名。
访问 https://dash.cloudflare.com/profile/api-tokens 获取你的API Key,注意给予该API Key适当的权限(区域资源)。
然后,我们需要一个脚本来实现动态IP的更新。这里我们使用bash脚本来实现,脚本如下:
#!/usr/bin/env bash
set -o errexit
set -o nounset
set -o pipefail
# 配置
CFKEY=<请修改为你的CFKEY>
CFUSER=<请修改为你的CFUSER>
CFZONE_NAME=<请修改为你的CFZONE_NAME 如cunoe.com>
CFRECORD_NAME=<请修改为你的CFRECORD_NAME 如blog.cunoe.com>
CFRECORD_TYPE=<根据你的DNS类型修改 A or AAAA>
CFTTL=120
# 通过该网站获取WAN IP
WANIPSITE="<http://ipv4.icanhazip.com>"
if [ "$CFRECORD_TYPE" = "A" ]; then
  :
elif [ "$CFRECORD_TYPE" = "AAAA" ]; then
  WANIPSITE="<http://ipv6.icanhazip.com>"
else
  echo "$CFRECORD_TYPE DNS类型无效(只支持 A or AAAA)"
  exit 2
fi
# 检查是否有必要的配置
if [ "$CFKEY" = "" ]; then
  echo "ApiKey无效,请查看: <https://dash.cloudflare.com/profile/api-tokens>"
  exit 2
fi
if [ "$CFUSER" = "" ]; then
  echo "用户名无效"
  exit 2
fi
if [ "$CFRECORD_NAME" = "" ]; then
  echo "记录名无效"
  exit 2
fi
# 域名不合法
if [ "$CFRECORD_NAME" != "$CFZONE_NAME" ] && ! [ -z "${CFRECORD_NAME##*$CFZONE_NAME}" ]; then
  CFRECORD_NAME="$CFRECORD_NAME.$CFZONE_NAME"
  echo " => 域名不合法 $CFRECORD_NAME"
fi
# 获取WAN IP
WAN_IP=`curl -s ${WANIPSITE}`
# 获取 Cloudflare 的 zone_identifier & record_identifier
CFZONE_ID=$(curl -s -X GET "<https://api.cloudflare.com/client/v4/zones?name=$CFZONE_NAME>" -H "X-Auth-Email: $CFUSER" -H "X-Auth-Key: $CFKEY" -H "Content-Type: application/json" | jq -r ".result[0].id" )
CFRECORD_ID=$(curl -s -X GET "<https://api.cloudflare.com/client/v4/zones/$CFZONE_ID/dns_records?name=$CFRECORD_NAME>" -H "X-Auth-Email: $CFUSER" -H "X-Auth-Key: $CFKEY" -H "Content-Type: application/json"  | jq -r ".result[0].id" )
echo "CFZONE_ID=$CFZONE_ID"
echo "CFRECORD_ID=$CFRECORD_ID"

echo "Updating DNS to $WAN_IP"
RESPONSE=$(curl -s -X PUT "<https://api.cloudflare.com/client/v4/zones/$CFZONE_ID/dns_records/$CFRECORD_ID>" \\
  -H "X-Auth-Email: $CFUSER" \\
  -H "X-Auth-Key: $CFKEY" \\
  -H "Content-Type: application/json" \\
  --data "{\\"id\\":\\"$CFZONE_ID\\",\\"type\\":\\"$CFRECORD_TYPE\\",\\"name\\":\\"$CFRECORD_NAME\\",\\"content\\":\\"$WAN_IP\\", \\"ttl\\":$CFTTL}")
if [ "$RESPONSE" != "${RESPONSE%success*}" ] && [ "$(echo $RESPONSE | grep "\\"success\\":true")" != "" ]; then
  echo "成功更新"
  exit
else
  echo '响应错误'
  echo "Response: $RESPONSE"
  exit 1
fi
你可能需要安装jq来解析JSON数据。
sudo apt install jq
填入相关信息,保存为cf-ddns.sh,并添加执行权限。
chmod +x cf-ddns.sh
./cf-ddns.sh
这样,你的DNS记录就会自动更新到你的动态IP了。
通过 crontab 定时执行该脚本,实现动态IP的自动更新。
crontab -e
添加一行:
0 4 * * * /path/to/cf-ddns.sh
这样,每天凌晨4点,你的DNS记录就会自动更新到你的动态IP了。