使用 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日志输出中文问题》修改。
以下方法需要以下的插件支持,请先安装:
方法一:添加代码文件
编辑添加文件 /usr/lib/ddns/update_dnspod_cn.sh
。以下代码是根据nixonli的代码修改了一部分提示。
/usr/lib/ddns/update_dnspod_cn.sh1 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 "配置错误![密码]不能为空"
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: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/services1
| "dnspod.cn" "update_dnspod_cn.sh"
|
编辑文件 /etc/ddns/services_ipv6
,添加以下内容。
/etc/ddns/services_ipv61
| "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。