起因是在外有访问家庭内网的需求,但是家庭宽带所拥有的公网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