OpenWrt 原生的 DDNS 并不支持 DNSPod,所以自行查了一下 DNSPod 的 API,自行写了一个shell脚本。

本脚本实现了简单的更新功能,体积极小,代码简单,可以用作参考来修改适合自己的脚本,后续我会根据需求再完善一下全部的功能。

实现步骤

脚本

首先新建一个shell文件,本文以 ddns_dnspod.sh 为例。将下面的代码复制到新建的shell脚本中。

ddns_dnspod.sh
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
33
34
35
36
37
38
#!/bin/sh

LOGIN_TOKEN='****,************'
DOMAIN='tidnotes.top'
RECORD_ID='****'
SUB_DOMAIN='www'
RECORD_TYPE=AAAA
RECORD_NAME=${SUB_DOMAIN}.${DOMAIN}

# 远端IP
if nslookup $RECORD_NAMEgrep Address >/dev/null; then
#IPV6
remote_ip=`nslookup ${RECORD_NAME}grep -Eo '[0-9a-f]+(:[0-9a-f:]+)+'`
#IPV4
#remote_ip=`nslookup ${RECORD_NAME}grep 'Address 'grep -Eo '[0-9]+(\.[0-9a-f\.]+)+' head -n1`
echo "Remote IP: "$remote_ip
else
exit 1
fi

# 本地IP
if ifconfig pppoe-wan>/dev/null ; then
#IPV6
local_ip=`ifconfig pppoe-wangrep 'inet6 addr: 24.*'grep -Eo '24[0-9a-f:]+'`
#IPV4
#local_ip=`ifconfig pppoe-wangrep 'inet'grep -Eo '[0-9]+(\.[0-9a-f\.]+)+' head -n1`
echo "Local IP : "$local_ip
else
echo "Command: 'ifconfig pppoe-wan' failed"
exit 1;
fi

if [ $remote_ip != $local_ip ]; then
curl -X POST https://dnsapi.cn/Record.Modify -d "login_token=${LOGIN_TOKEN}&format=json&domain=${DOMAIN}&record_id=${RECORD_ID}&sub_domain=${SUB_DOMAIN}&value=${local_ip}&record_type=${RECORD_TYPE}&record_line=%e9%bb%98%e8%ae%a4"
else
echo "Same IPs, skip unchanged"
exit 0
fi

将脚本中一些参数改为对应的内容:

  • LOGIN_TOKEN:由DnsPod密钥提供,由 ID,Token 组合而成,用英文的逗号分割,原本的账号密码鉴定方式已经弃用。
  • DOMAIN:根域名。
  • SUB_DOMAIN:子域名。
  • RECORD_TYPE:记录类型,ipv4用“A”,ipv6用“AAAA”。
  • RECORD_ID:需要更改的域名对应的ID,可以利用下面代码查询。
1
curl -X POST https://dnsapi.cn/Record.List -d 'login_token=${LOGIN_TOKEN}&format=json&domain=${DOMAIN}&sub_domain=${SUB_DOMAIN}'

本脚本用的是ipv6类型的,使用ipv4的记得改为ipv4相应的代码和内容。脚本主要实现了域名IP的更新,没有加入新增功能,后续有时间的话会进一步更新这个脚本,大家可以用这个脚本来做一个参考修改。

设置定时任务

利用 OpenWrt 的 crontab 实现定时更新。

对脚本文件更改权限,我的脚本文件放在 /root/crontab/ 中:

1
2
cd /root/crontable/
chmod +x ddns_dnspod.sh

然后进入在 OpenWrt 后台,选择 系统→计划任务,输入下面语句:

1
0 2 * * * /root/crontable/ddns_dnspod.sh

然后重启路由或者重启 cron 即可定时在每天凌晨2点执行一次脚本,想要其他时间可以按需更改。