一个 DNSPod DDNS 比较完善的方案

该脚本方案以前已经在OPENWRT上长时间稳定运行。现稍加改动移植到UBNT路由器上,测试通过

该脚本原作者: http://www.vinoca.org/2013/05/31/linuxfreebsd%E4%B8%8B%E7%9A%84dnspod%E5%8A%A8%E6%80%81%E5%9F%9F%E5%90%8D%E5%AE%A2%E6%88%B7%E7%AB%AF/

其实该脚本方案通用LINUX/BSD等系统,特点是先取得本地PPPOE的IP写入本地CACHE,在使用TOKEN去更新DNSPOD上的域名IP前会先比对本地,如果不同才去修改,从而避免短时间内多次修改DNSPOD会被禁止访问的问题。
附件包含三个文件
sddns.cache ===>本地cache文件,记录目前路由器外网IP
sddns.conf ===> 配置文件
sddns ====> 可执行脚本

使用方法:
将三个文件放到路由器 /config/scripts/dnspod-ddns 目录下,并给sddns脚本可执行权 chomd 775 /config/scripts/dnspod-ddns/sddns

(注意:其实DNSPOD官方有客户端方便查询domain id和record id 下载地址 https://support.dnspod.cn/Support/api)

修改sddns.cache 为适合自己域名的参数
domain_id=3730377 //这个用上面的DNSPOD客户端获得,或可参考 https://bbs.ui.com.cn/t/edgerouter-dnspod-dns/43483/1
num_sub_domain=1
sd1=myrouter //自己的子域名是什么就写什么
record_id1=251945437 //这个用上面的DNSPOD客户端获得,或参考 https://bbs.ui.com.cn/t/edgerouter-dnspod-dns/43483/1 获得
cur_ip=123.123.123.123 //可先随便写一个IP地址

修改sddns.conf 为适合自己域名的参数
token=‘13615,859eeb0e1aeffc6e0737f1192588757a42b9340d457770c2bf8de404262a82’
//可参考 https://bbs.ui.com.cn/t/edgerouter-dnspod-dns/43483/1 获得
main_domain=‘abc.com’ //你的域名
sub_domain=‘myrouter’ //你的子域名称
#port=eth0.2
port=pppoe0 //你的WAN口是用那个端口的IP , 通常都是pppoe0吧
#wanip=‘c.lexun.com/ip’ //另一种方法获得WAN口IP,就是路由器去访问这个网址 ,不过一般不用该方法,所以屏蔽
refresh=1 // 启用先比对本地,如果不同才去DNSPOD服务器更新
#addon_opt=’–cacert /config/scripts/dnspod-ddns/cert.crt’ //这个没什么作用了,屏蔽掉了,参看原作者网站说明
runtime_file=’/config/scripts/dnspod-ddns/sddns.cache’ //定义cache文件路径
224726ojgejezjvj68ggon.png

修改sddns脚本里的配置文件路径
15行
-f “$HOME/.sddns.conf” ] && config_file="$HOME/.sddns.conf" || config_file="/config/scripts/dnspod-ddns/sddns.conf" //如果你放脚本的位置不是/config/scripts/dnspod-ddns,需要改一下自己的

注意32行 cur_wanip=/sbin/ifconfig $port | sed -n '/inet addr:/s/.*inet addr:\([0-9.]\+\).*/\1/p'
因为脚本调用ifconfig来确定PPPOE0的IP ,所以请确保你的路由器已经安装了该命令,还有CURL也已经安装。不过EDGEOS好像默认都是安装的
注意ifconfig 使用绝对路径

以上完成后,执行下 看返回结果是否有错误
225132taopk0s1jx270nqs.jpg

如果没有就可以加入路由器的计划任务里了。每30分钟运行一次
configure
set system task-scheduler task DNSPod-DDNS executable path “/config/scripts/dnspod-ddns/sddns”
set system task-scheduler task DNSPod-DDNS interval 30m
commit
save

最后在/config/scripts/post-config.d 里做个软连接指向sddns脚本,保证在路由器重启时候自动运行一下,去获取新IPln -s /config/scripts/dnspod-ddns/sddns /config/scripts/post-config.d/sddns

sddns.rar (2.04 KB)

请问运行/config/scripts/dnspod-ddns/sddns报
ERROR: Please check “/config/scripts/dnspod-ddns/sddns.conf”, “port” is invalid .
错误,请问怎么解决?期待您的帮助与解答。

已经搞定,与主要的原因是我的系统版本是2.x的,楼主的脚本是1.x的。

sddns v1.x.zip (1.6 KB)

sddns v2.x.zip (1.6 KB)

我这里都上传上来,供大家参考。

1赞

sddns的代码有些瑕疵,比如开始这一句:
QQ截图20210930162757
这句中的错误信息重定向写的不对,应该是下面这样子才对:
QQ图片20210930162924
再比如get_record_id()这个函数的定义中,正则表达式不对(不清楚刚开发时是否是对的,但至少目前对于DNSPod是错误的)。


应该是:

第一处问题,改不改无关紧要,只是不严谨罢了;但第二处很关键,如果这个地方修改正确,那么只须sddns.cache文件保持空白直接运行sddns就行。
楼主之所以得修改sddns.cache文件,正是因为程序不能自动获取record_id所致。domain_id和record_id在程序中都是能够自动获取的!
楼上这位搞出的v1.x和v2.x,实际上也是一个正则表达式的差异,因为EdgeOS中两个版本的IP信息变了,1.x版本是 inet addr: 后跟IP,2.x版本是inet 后直接跟IP。