使用openwrt可以自定义安装原生的动态dns插件(Dynamic DNS),但是并不支持DNSPod的ddns自动更新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的代码修改了一部分提示。
#!/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”,添加以下内容。
"dnspod.cn" "update_dnspod_cn.sh"
编辑文件“/etc/ddns/services_ipv6″,添加以下内容。
"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。
本文由 小TiD笔记 发布在小TiD笔记,转载此文请保持文章完整性,并请附上文章来源(小TiD笔记)及本页链接。
原文链接: https://www.tidnotes.ga/2020/06/openwrt-ddns-dnspod.html