使用 openwrt 可以自定义安装原生的动态 dns插件(Dynamic DNS),但是并不支持
DNSPodddns 自动更新ip。

对于目前这个问题,一般可以通过编写脚本来实现,或者可以添加 DNSPod 的功能支持。

目前发现,L大的LEDE源码中已经集成了该插件源码(https://github.com/coolsnowwolf/lede/tree/master/package/lean/ddns-scripts_dnspod),并且做了优化集成了 .cn.com 的脚本维护者是:Small_5。还有nixonli也编写了一个简单的代码支持(https://github.com/nixonli/ddns-scripts_dnspod)。

下面是介绍以nixonli的代码使用方法。

注意:如果ddns显示的日志中文部分出现问题,可以参考《关于DDNS日志输出中文问题》修改。

以下方法需要以下的插件支持,请先安装:

  • ddns
  • curl
  • sed

方法一:添加代码文件

编辑添加文件 /usr/lib/ddns/update_dnspod_cn.sh 。以下代码是根据nixonli的代码修改了一部分提示。

/usr/lib/ddns/update_dnspod_cn.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/bin/sh

#检查传入参数
[ -z "$username" ] && write_log 14 "配置错误![用户名]不能为空"
[ -z "$password" ] && write_log 14 "配置错误![密码]不能为空"

#检查外部工具curl,sed
command -v curl >/dev/null 2>&1 write_log 13 "需要curl支持,请先安装"
command -v sed >/dev/null 2>&1 write_log 13 "需要 sed 支持,请先安装"

# 变量声明
local __HOST __DOMAIN __TYPE __RECIP __RECID DATFILE

# 从 $domain 分离主机和域名
[ "${domain:0:2}" == "@." ] && domain="${domain/./}" # 主域名处理
[ "$domain" == "${domain/@/}" ] && domain="${domain/./@}" # 未找到分隔符,兼容常用域名格式
__HOST="${domain%%@*}"
__DOMAIN="${domain#*@}"
[ -z "$__HOST" -o "$__HOST" == "$__DOMAIN" ] && __HOST="@"

# 设置记录类型
[ $use_ipv6 -eq 0 ] && __TYPE="A" __TYPE="AAAA"

#添加解析记录
add_domain() {
DATFILE=`curl -s -d "login_token=$username,$password&format=json&domain=$__DOMAIN&sub_domain=$__HOST&record_type=$__TYPE&record_line_id=0&value=${__IP}" "https://dnsapi.cn/Record.Create"`
value=`jsonfilter -s "$DATFILE" -e "@.status.code"`
if [ $value == 1 ];then
write_log 7 "添加新解析记录IP:[$__HOST],[$__TYPE],[${__IP}]成功!"
else
write_log 13 "添加解析记录IP:[$__HOST],[$__TYPE],[${__IP}]失败! 返回code:$value"
fi
}

#修改解析记录
update_domain() {
DATFILE=`curl -s -d "login_token=$username,$password&format=json&domain=$__DOMAIN&record_id=$__RECID&value=${__IP}&record_type=$__TYPE&record_line_id=0&sub_domain=$__HOST" "https://dnsapi.cn/Record.Modify"`
value=`jsonfilter -s "$DATFILE" -e "@.status.code"`
if [ $value == 1 ];then
write_log 7 "修改解析记录host:[$__HOST],type:[$__TYPE],ip:[${__IP}]成功!"
else
write_log 13 "修改解析记录host:[$__HOST],type:[$__TYPE],ip:[${__IP}]失败! 返回code:$value"
fi
}

#获取域名解析记录
describe_domain() {
DATFILE=`curl -s -d "login_token=$username,$password&format=json&domain=$__DOMAIN" "https://dnsapi.cn/Record.List"`
value=`jsonfilter -s "$DATFILE" -e "@.records[@.name='$__HOST'].name"`
if [ "$value" == "" ]; then
write_log 4 "解析记录:[$__HOST]不存在,类型: HOST"
ret=1
else
value=`jsonfilter -s "$DATFILE" -e "@.records[@.name='$__HOST'].type"`
if [ "$value" != "$__TYPE" ]; then
write_log 4 "当前解析类型:[$__TYPE], 获得不匹配类型: TYPE"
ret=2; continue
else
__RECID=`jsonfilter -s "$DATFILE" -e "@.records[@.name='$__HOST'].id"`
write_log 7 "获得解析记录ID:[$__RECID], 类型: ID"
__RECIP=`jsonfilter -s "$DATFILE" -e "@.records[@.name='$__HOST'].value"`
if [ "$__RECIP" != "${__IP}" ]; then
write_log 6 "地址需要修改,本地地址:[${__IP}]"
ret=2
fi
fi
fi
return $ret
}
describe_domain
ret=$?
if [ $ret == 1 ];then
sleep 3 && add_domain
elif [ $ret == 2 ];then
sleep 3 && update_domain
else
write_log 15 "本地IP:“${__IP}” 解析记录IP:“$__RECIP”地址不需要修改"
fi

return 0

编辑文件 /etc/ddns/services ,添加以下内容。

/etc/ddns/services
1
"dnspod.cn"		"update_dnspod_cn.sh"

编辑文件 /etc/ddns/services_ipv6 ,添加以下内容。

/etc/ddns/services_ipv6
1
"dnspod.cn"		"update_dnspod_cn.sh"

完成上述操作就可以在ddns内选择dnspod进行域名解析了。

注意:update_dnspod_cn.sh文件必须有可执行权限;services和services_ipv6文件最后一行必须是空行,所以上面的内容必须是倒数第二行往上。

方法二:直接安装插件

下载插件的安装包(opwnwrt x86 ddns-scripts_dnspod),或者通过自行编译,编译代码见原作者的github:https://github.com/nixonli/ddns-scripts_dnspod

得到安装包后,到openwrt的后台,进入 系统→软件包(Software) ,上传文件包(Upload Package)等安装完即可。

本文根据Nixonli博客的openwrt 原生动态DNS(DDNS) 支持DnsPod解析编写,其中更改了部分的代码问题。

对于update_dnspod_cn.sh中的代码可以根据自己需要更改,复杂功能可以查看LEDE的源码,那个更加符合ddns的原来设计,不过代码大小会多一点。想要简单实现可以参考[Linux]自定义脚本实现DNSPod DDNS