个人博客

cloudflare ddns脚本

16 08月
作者:西洪室|分类:技术

这两天发现动态域名不能解析到自家的nas,各种折腾,发现是由两个原因引起的;

1、cloudflare升级,openwrt的cloudflare ddns脚本无法更新ip,github走了一圈,测试了多个脚本,都没法自动更新域名ip,无奈之下,参考官方的API接口(https://api.cloudflare.com/#dns-records-for-a-zone-list-dns-records)重新写了个脚本,放在自家的树莓派上运行。

脚本的处理方式:① 检查子域名没有创建-->创建子域名

                           ② 检查ip变化-->更新子域名ip

#!/bin/bash
# cloudflare账号信息
auth_email="popyone@qq.com"
auth_key="xxxxxxxxxxxx91fecf2e6xxxxxxxxxxxxxxxxxe" # found in cloudflare account settings
zone_name="popyone.com"
record_name="www.popyone.com"
# 可配置参数
ip=$(curl -s http://ipv4.icanhazip.com)
ip_file="ip.txt"
log_file="cloudflare.log"
# 日志记录
log() {
    if [ "$1" ]; then
        echo -e "[$(date)] - $1" >> $log_file
    fi
}
# 开始脚本
log "Check Initiated"

#获取根域名zone_id
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_id
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":")[^"]*')

#如果获取子域名信息为空,创建子域名,并获取子域名record_id
if [[ $record_identifier = "" ]]; then
    #创建子域名
    create=$(curl -s -X POST "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records" \
    -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\",\"proxied\":false}")
    #获取子域名record_id
    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":")[^"]*')
fi

#获取子域名ip
cf_ip=$(curl -s -X GET "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" \
|grep -Po '(?<="content":")[^"]*')

#如果子域名ip变化,更改域名记录
if [[ $ip == $cf_ip ]]; then
    echo "IP has not changed."
    exit 0
    else
    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\",\"proxied\":false}")
fi

#记录日志
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


浏览241 评论3
返回
目录
返回
首页
kubernetes 安装Traefik2.3

发表评论

  • 评论列表
  • comet 于 2021-08-25 00:04:01  回复
  • 这篇文章还不错,最起码让人看懂大概的配置流程了,而不是很多人就只给一行代码
  • comet 于 2021-08-25 01:48:05  回复
  • 这个脚本是什么语言的呢?python?