起因是在外有访问家庭内网的需求,但是家庭宽带所拥有的公网IP又时常自动刷新,因此需要ddns服务,自己Google学习了一下,通过定时任务解析网卡上的ipv4,去更新Cloudflare上的域名dns解析。

前提条件

  • 我是直接解析在软路由上的,因此我是直接解析软路由上的网卡中wan口的ipv4地址。如果你是内网设备的话,可以尝试通过curl命令请求一些公共服务,以获取自己的IP。下面是部分服务网址:
# 国内/国外都可以访问
curl ipinfo.io
curl cip.cc
curl ident.me
curl v4.ident.me
# 仅国内可以访问
curl myip.ipip.net
# 仅国外可以访问
curl ifconfig.me
curl inet-ip.info
  • 需要你有一个域名,并且域名的解析服务器迁移到Cloudflare中
  • 如果需要你家的宽带有公网的ipv4(ipv6更新待定);

动态DNS代码

  • 这是动态DNS代码主体(存放于/home/ddns.sh)
#!/bin/ash

# 设置网络接口控制器,这是VWAN(多拨接口)的第一个
# networkInterface='pppoe-vwan1'
# 设置网络接口控制器,这是WAN(单播接口)
networkInterface='pppoe-wan'

# 获取IPv6地址
# ipv6Address=$(ifconfig "$networkInterface" | grep 'inet6 addr' | grep -v fe80 | awk '{print $3}' | cut -d'/' -f1)

# 获取IPv4地址
ipv4Address=$(ifconfig "$networkInterface" | awk '/inet addr/{print substr($2,6)}' | cut -d'/' -f1)



lastIPFilePath=/home/last_public_ip.txt
logFilePath=/home/public_ip.log

# 错误处理
set -e

# 验证IP地址格式的函数
validateIP() {
    local ip=$1
    if ! echo "$ip" | grep -E -q '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$'; then
        echo "$(date "+%F %T"), Invalid IP address: $ip" >&2
        exit 1
    fi
}

# 检查并记录IP地址变化
checkAndRecordIPChange() {
    local currentIP=$1
    local lastIP=$2

    if [ "$currentIP" != "$lastIP" ]; then
        # IP地址发生变化
        echo "$currentIP" > "$lastIPFilePath"
        echo "$(date "+%F %T"), $currentIP" >> "$logFilePath"
        updateDNSRecord "$currentIP"
    fi
}

# 更新DNS记录
updateDNSRecord() {
    local ip=$1
    local apiEndpoint="https://api.cloudflare.com/client/v4/zones/1bxxxxxxxxxxxxxxxxxxxxxxxx1f/dns_records/31xxxxxxxxxxxxxxxxxxxxxxxxxxb5"
    local authEmail="xxxxxxxxxxxxxx@qq.com"
    local authKey="1dxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx5d"

    curl -s -X PUT "$apiEndpoint" \
        -H "X-Auth-Email:$authEmail" \
        -H "X-Auth-Key:$authKey" \
        -H "Content-Type: application/json" \
        --data '{"type":"A","name":"你的域名网址,例如:home.dashixiong.com","content":"'"${ip}"'","ttl":120,"proxied":false}' \
        >/dev/null
}

# 判断当前是否有网卡设备IP,且为标准的IP格式
if [ -z "$ipv4Address" ] || ! validateIP "$ipv4Address"; then
    echo "$(date "+%F %T"), Bad IPv4 address: $ipv4Address" >> "$logFilePath"
    exit 1
fi

# 如果存在上次记录的IP地址文件
if [ -s "$lastIPFilePath" ]; then
    lastIP=$(cat "$lastIPFilePath")
    checkAndRecordIPChange "$ipv4Address" "$lastIP"
else
    echo "$ipv4Address" > "$lastIPFilePath"
    echo "$(date "+%F %T"), $ipv4Address" >> "$logFilePath"
    updateDNSRecord "$ipv4Address"
fi
  • Linux cron 定时任务执行
# 每五分钟执行一次,及时发现家庭IP变化所导致的ddns错误
*/10 * * * * sh /home/ddns.sh 1>/dev/null 2>>/home/error_ddns.log