我在之前的文章中写到过如何使用DNSPod进行DDNS动态解析:DNSPOD动态域名解析(LINUX服务器)。不过这篇文章其实重点是如何解析教育网的IP地址,因为很多教育网的IP是不暴露在公网的,而且学校的网络出口可能统一只对应着少量数个IP地址。那么想要在校园网内实现互访,则需要动态解析教育网地址。

今天这篇文章主要介绍如何在cloudflare实现动态解析,这次的代码默认直接支持解析教育网IP,也支持解析公网地址。

这里先把shell脚本贴出来

#!/bin/bash
  
# Cloudflare API key,你可以在Cloudflare的账户设置中找到
CFKEY=""
# Cloudflare email,你的Cloudflare账户邮箱地址
CFEMAIL=""
# Cloudflare Zone ID,你可以在Cloudflare的域名设置中找到
CFZONE=""
# 域名
DOMAIN=""
# 获取当前服务器的公网IP
IP=$(curl -s http://ip.ustc.edu.cn/myip.php | jq -r '.myip')
# 获取Cloudflare上当前的DNS解析记录
DNS_RECORD=$(curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$CFZONE/dns_records?type=A&name=$DOMAIN" \
-H "X-Auth-Email: $CFEMAIL" \
-H "X-Auth-Key: $CFKEY" \
-H "Content-Type: application/json")
# 获取DNS记录的ID
RECORD_ID=$(echo $DNS_RECORD | jq -r '.result[0].id')
# 获取DNS记录的IP
RECORD_IP=$(echo $DNS_RECORD | jq -r '.result[0].content')
# 如果当前服务器的公网IP和Cloudflare上的DNS解析记录不一致,则更新Cloudflare上的DNS解析记录
if [ "$IP" != "$RECORD_IP" ]
then
    curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$CFZONE/dns_records/$RECORD_ID" \
    -H "X-Auth-Email: $CFEMAIL" \
    -H "X-Auth-Key: $CFKEY" \
    -H "Content-Type: application/json" \
    --data "{\"type\":\"A\",\"name\":\"$DOMAIN\",\"content\":\"$IP\"}"
    echo "DNS record updated."
else
    echo "No changes needed."
fi

我们需要做的就是登录cloudflare,生成cf的api key。同时,把你的在cf解析的域名的CFZONE复制粘贴到上述位置,把你的注册邮箱同样粘贴上去。填写需要解析的域名,注意是具体域名,你需要先在cf创建到解析,才能使用该脚本更新解析。该脚本并不能自己创建新的解析。

最后,可以通过cron的方式使该脚本定时执行以起到动态解析的效果。