因为并没有用到 Unifi 中提供的 ddns 服务商:
而且 he 又提供一个非常方便的更新 ddns 记录的方法,所以这里尝试一个能及时更新 ddns 但又不至于请求接口太频繁的方法。
脚本
首先编辑一个更新 dns 的脚本,脚本的具体逻辑是读取拨号接口的 IP 并缓存,当 IP 发生变化时上报新的记录,这样不至于触发 he 的滥用限制,但是有可以通过定时任务将 ddns 延迟控制到1分钟以内:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #!/bin/bash # 确保自己的公网 IP 在这个接口上 INTERFACE="pppoe0" PRE_IP=`cat /tmp/ddns.ip` # 将 {hostname} {key} 改成自己的,参考 https://dns.he.net/docs.html URLS=( "https://{hostname}:{key}@dyn.dns.he.net/nic/update?hostname={hostname}" ) IP_RAW=`ip addr show dev $INTERFACE 2>&1`
if [ $? -ne 0 ]; then logger -t ddns "get pppoe0 ip failed: $IP_RAW" exit fi
IP=`echo -e "${IP_RAW}" | grep "inet\b" | awk '{print $2}' | cut -d/ -f1` if [ "$IP" != "$PRE_IP" ]; then logger -t ddns "ip change to $IP" for url in "${URLS[@]}"; do CURL_RES=`curl -sSf4 "${url}" 2>&1` # good ip address # nochg ip address if [ "${CURL_RES:0:4}" = "good" ] || [ "${CURL_RES:0:5}" = "nochg" ]; then logger -t ddns "update ddns success: $CURL_RES" else logger -t ddns "update ddns failed: $CURL_RES" exit fi done echo $IP > /tmp/ddns.ip fi
|
添加可执行权限后将其上传到 usg 的 /config/scripts/ddns.sh
备用。