通过API动态更新Cloudflare的DNS记录

准备相关信息

在cloudflare上面获取相关的Key ID,包括Zone ID 、Accout ID、DNS Record ID,以及API KEY ID;
https://dash.cloudflare.com/
在页面最下边的右面。

Openwrt配置修改

在Openwrt路由器上创建两个文件。

file1:/etc/hotplug.d/iface/90-ddns

## /etc/hotplug.d/iface/90-ddns
#!/bin/sh 
[ "$ACTION" = ifup ] || exit 0
[ "$INTERFACE" = wan ] || exit 0
/usr/lib/ddns/new_cloudflare_v4.sh

file2:/usr/lib/ddns/new_cloudflare_v4.sh

!/bin/ash
 CHANGE THESE
 auth_email="you@domain.com"
 auth_key="This is you Key" # found in cloudflare account settings
 zone_name="youdomain.com"
 record_name="gw-private.ghdog.com"
 bauth_key=You API KEY
 zone_identifier=You Zone ID
 record_identifier=You Record ID
 MAYBE CHANGE THESE
 ip=$(curl -s http://ipv4.icanhazip.com)
 ip=$(ip address show dev pppoe-wan | grep inet | sed 's/^[ \t]*//g' | cut -d ' ' -f2)
 ip_file="ip.txt"
 id_file="cloudflare.ids"
 log_file="/var/log/ddns_gw-private.ghdog.com.cloudflare.log"
 LOGGER
 log() {
     if [ "$1" ]; then
         echo -e "[$(date)] - $1" >> $log_file
     fi
 }
 SCRIPT START
 log "Check Initiated"
 if [ -f $ip_file ]; then
 old_ip=$(cat $ip_file)
 if [ $ip == $old_ip ]; then
 echo "IP has not changed."
 exit 0
 fi
 fi
 if [ -f $id_file ] && [ $(wc -l $id_file | cut -d " " -f 1) == 2 ]; then
 zone_identifier=$(head -1 $id_file)
 record_identifier=$(tail -1 $id_file)
 else
 zone_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=$zone_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*' | head -1 )
 record_identifier=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records?name=$record_name" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json"  | grep -Po '(?<="id":")[^"]*')
 echo "$zone_identifier" > $id_file
 echo "$record_identifier" >> $id_file
 fi
 update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" --data "{\"id\":\"$zone_identifier\",\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\"}")
 update=$(curl -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "Authorization: Bearer $bauth_key" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\",\"ttl\":1,\"proxied\":false}")
 if [[ $update == "\"success\":false" ]]; then
     message="API UPDATE FAILED. DUMPING RESULTS:\n$update"
     log "$message"
     echo -e "$message"
     exit 1 
 else
     message="IP changed to: $ip"
     echo "$ip" > $ip_file
     log "$message"
     echo "$message"
 fi
 !/bin/sh
 [ "$ACTION" = ifup ] || exit 0
 [ "$INTERFACE" = wan ] || exit 0
 /usr/lib/ddns/new_cloudflare_v4.sh

这样每当路由器重新获取了IP后,系统就会自动修改该域名的IP。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据