Zavier's Blog

基于CloudFlare API的纯Shell动态DNS(DDNS)脚本

家庭宽带的IP是不固定的,当出门在外,人不在家时,一旦IP变动,就给接入家中的设备(如监控)带来许多麻烦,于是我编写了一个能在Linux系统下运行,基于cloudflare API的动态DNS脚本,虽然国内已有花生壳之类的ddns服务,但是那些实在是太坑爹,比如只能使用它提供的二级域名,而该脚本能够配置顶级域名的动态DNS解析。
使用前提:局域网内有Linux主机(如openwrt路由设备)、有一个顶级域名、域名解析必须由CloudFlare托管。

使用方法:

步骤一:到CloudFlare官网注册一个帐号,找到DNS选项,如下图箭头指向,根据其要求,到你的域名注册商处将DNS服务器修改为CloudFlare提供的地址,修改完验证成功后就可以开始解析了。

image.png

步骤二:先添加一个二级域名解析,按照图示方法添加后点击Add Record保存

image.png

步骤三:获取三个Key值,其中APIKey和ZoneID可在官网登录后的Overview页面获得,而DNSID获取较为复杂,具体命令如下(需要安装curl):

curl -X GET "https://api.cloudflare.com/client/v4/zones/输入你的ZoneID/dns_records?type=A&name=刚才设置的记录值(比如xxx.yourdomain.com)" \
-H "X-Auth-Email:你注册时的邮箱" \
-H "X-Auth-Key:你的APIKEY" \
-H "Content-Type: application/json"

运行该命令后会输出结果,找到"id":"xxx"这个选项,其中的xxx即对应你的DNSID值

下方为shell脚本(需要设备安装curl),配置好后可利用crontab命令定时执行,(1-2分钟执行一次最佳)具体操作如下:

crontab -e
*/2 * * * * 脚本存放目录

cfddns.sh

#!/bin/sh
CF_API_KEY=输入你的APIKEY
CF_ZONE_ID=输入你的ZONEID
CF_DNS_ID=输入你的解析记录值对应的DNSID
EMAIL=输入你注册时的邮箱
ROUTER_NETWORK_DEVICE=你的设备拨号的网卡,openwrt一般是pppoe,可使用ifconfig命令查看
TEMP_FILE_PATH=/tmp/cloudflare-ddns/DNS_RECORD=填写用于ddns的DNS记录,要完整填写,比如:xxx.yourdomain.com
mkdir -p ${TEMP_FILE_PATH}curl -k -X GET "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_DNS_ID}" \
-H "X-Auth-Email:${EMAIL}" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "Content-Type: application/json" |awk -F '"' '{print $26}'>${TEMP_FILE_PATH}/current_resolving.txt
ifconfig $ROUTER_NETWORK_DEVICE | awk -F'[ ]+|:' '/inet /{print $4}'>${TEMP_FILE_PATH}/current_ip.txt
if [ "$(cat ${TEMP_FILE_PATH}/current_ip.txt)" == "$(cat ${TEMP_FILE_PATH}/current_resolving.txt)" ]; 
then
exit 1
else
CURRENT_IP="$(cat ${TEMP_FILE_PATH}/current_ip.txt)"
curl -k -X PUT "https://api.cloudflare.com/client/v4/zones/${CF_ZONE_ID}/dns_records/${CF_DNS_ID}" \
-H "X-Auth-Email:${EMAIL}" \
-H "X-Auth-Key:${CF_API_KEY}" \
-H "Content-Type: application/json" \
--data '{"type":"A","name":"'$DNS_RECORD'","content":"'$CURRENT_IP'","ttl":1,"proxied":false}'
fi


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

Copyright © 2017-2023 Zavier的博客.网站地图