OpenWRT/LEDE自带DDNS完美嵌入阿里云脚本

2年前(2018年)已经在Windows系统 实现了阿里云 DDNS ,运行了两年多了,非常稳定,完美。最近想尝试不依赖Windows系统,也能够完美的使用阿里云DDNS,想着如果能在 CentOS 实现的话应该挺香的。

于是关于 CentOS 使用阿里云DDNS的方法我百度了很久,使用 python,Java,…,各种方法来实现,方法太多,都不知道哪些方法是好用,眼花缭乱,也就没有折腾欲望了。但却无意中发现,OpenWRT/LEDE 自带的 DDNS 功能也可以嵌入阿里云DDNS脚本!

这个难道不更香吗!如果能够成功的在 OpenWRT/LEDE 上嵌入阿里云DDNS脚本,那才是真香!我之前在Windows系统里运行的阿里云DDNS服务,就可以列入备用方案了。

在Windows系统稳定运行了2年多的阿里云DDNS服务折腾记录:

无意中发现了一位大神的方案适用于OpenWRT/LEDE自带DDNS功能的阿里云脚本,完美嵌入

https://www.right.com.cn/forum/thread-267501-1-1.html

这位sensel大神的方法实在太完美了,马上测试。

LEDE自带DDNS完美嵌入阿里云脚本

我现在用的是LEDE17,虽然OpenWRT与LEDE又合并为OpenWRT了。新版本不断发布,现在最新版本OpenWrt 19.07,但我不喜欢新版本,u1s1不想折腾了,折腾太累人。

下面开始记录此次LEDE嵌入阿里云DDNS脚本的折腾过程

1、需要拥有阿里云的域名,并创建 AccessKey (子用户即可)

2、安装sensel大神的 ddns-scripts_aliyun_1.0.0-1_all.ipk (OpenWRT/LEDE全平台适用)

ddns-scripts_aliyun_1.0.0-1_all.ipk 软件依赖:

ddns-scripts(即自带DDNS管理脚本)

luci-app-ddns(可选,自带功能的LUCI界面)

wget(GNU Wget 完成与服务器通信)

openssl-util(openssl工具用于生成签名)

可以网页登录 LEDE 把依赖安装好之后,重启LEDE。

把 ddns-scripts_aliyun_1.0.0-1_all.ipk 使用 WinSCP 上传到 LEDE 的 root 目录

使用 putty 连上 LEDE 执行命令安装:

root@LEDE:~# cd /root/
root@LEDE:~# ls
ddns-scripts_aliyun_1.0.0-1_all.ipk
root@LEDE:~# opkg install ddns-scripts_aliyun_1.0.0-1_all.ipk
Installing ddns-scripts_aliyun (1.0.0-1) to root...
Configuring ddns-scripts_aliyun.

安装完成,重启 LEDE

网页登录 LEDE 安装中文包 luci-i18n-ddns-zh-cn

安装一切顺利完成,下面进入参数配置

配置LEDE动态DNS

首先需要注意的是,ddns-scripts_aliyun_1.0.0-1 这个脚本有点点BUG,我们如果不注意或设置不正确,它会覆盖解析记录。如下图:它居然把MX记录给修改覆盖了。

因为当初没有弄明白如何配置 Lookup Hostname 与 Domain 。

在运行 ddns-scripts_aliyun_1.0.0-1 之前,我们必需在域名解析里重新分别新建主机记录:@ 与 www 并且必需把这两个记录排在前面。(避免覆盖已有的解析记录)

网页登录 LEDE → 动态DNS → 总览

分别添加主机记录:@ 与 www (因为单个 PID 只能修改单个记录值)

aliyun_a 主机记录:@ 对应的是 sxxxz.top

aliyun_www 主机记录:www 对应的是 www.sxxxz.top

如下图:

进入 aliyun_a 详细配置 → 基本设置 ,如下图:

注意:用户名(AccessKeyId),密码(AccessKeySecret)

进入 aliyun_www 详细配置 → 基本设置 ,如下图:

为了安全,推荐使用HTTPS。至于CA证书路径,这个没有搞明白,那么必需填上IGNORE

进入 aliyun_a 详细配置 → 高级设置 ,如下图:

DNS服务器 (强烈推荐自己填上,我这里填的是阿里云公共DNS地址

以下是 aliyun_a 日志文件:

 221348       : ************ ************** ************** **************
 221348  note : PID '2645' started at 2020-07-09 22:13
 221348       : ddns version  : 2.7.6-13
 221348       : uci configuration:
ddns.aliyun_a.cacert='IGNORE'
ddns.aliyun_a.dns_server='223.5.5.5'
ddns.aliyun_a.domain='@sxxxxz.top'
ddns.aliyun_a.enabled='1'
ddns.aliyun_a.interface='wan2'
ddns.aliyun_a.ip_interface='pppoe-wan2'
ddns.aliyun_a.ip_source='interface'
ddns.aliyun_a.lookup_host='sxxxxz.top'
ddns.aliyun_a.password='Mxxxxxxxxxxxxxxxxxxxxs'
ddns.aliyun_a.service_name='aliyun.com'
ddns.aliyun_a.use_https='1'
ddns.aliyun_a.username='Lxxxxxxxxxxy'
ddns.aliyun_a=service
 221348       : verbose mode  : 0 - run normal, NO console output
 221348       : check interval: 600 seconds
 221348       : force interval: 259200 seconds
 221348       : retry interval: 60 seconds
 221348       : retry counter : 0 times
 221348       : No old process
 221348       : last update: never
 221348       : Verify DNS server '223.5.5.5'
 221348       : #> timeout 2 -- /usr/bin/nc 223.5.5.5 53 </dev/null >/var/run/ddns/aliyun_a.dat 2>/var/run/ddns/aliyun_a.err
 221348       : Detect registered/public IP
 221348       : #> /usr/bin/nslookup sxxxxz.top 223.5.5.5 >/var/run/ddns/aliyun_a.dat 2>/var/run/ddns/aliyun_a.err
 221348       : Registered IP '1xx.2x.1xx.x6' detected
 221348  info : Starting main loop at 2020-07-09 22:13
 221348       : Detect local IP on 'interface'
 221348       : #> ip -o addr show dev pppoe-wan2 scope global >/var/run/ddns/aliyun_a.dat 2>/var/run/ddns/aliyun_a.err
 221348       : Local IP '1x2.2x.1xx.16' detected on interface 'pppoe-wan2'
 221348       : Update needed - L: '1x2.2x.1xx.16' <> R: '1xx.2x.1xx.x6'
 221348       : parsing script '/usr/lib/ddns/update_aliyun_com.sh'
 221348       : #> /usr/bin/wget-ssl -nv -t 1 -O /var/run/ddns/aliyun_a.dat -o /var/run/ddns/aliyun_a.err --no-check-certificate --no-proxy 'https://alidns.aliyuncs.com/?Action=DescribeSubDomainRecords&SubDomain=%40.sxxxxz.top&Format=JSON&Version=2015-01-09&AccessKeyId=Lxxxxxxxxxxy&SignatureMethod=HMAC-SHA1&Timestamp=2020-07-09T14%3A13%3A48Z&SignatureVersion=1.0&SignatureNonce=88976dd5-4dfd-4811-aefc-390a72788dfd&Signature=222uxnhvKHL0WscEo%2BN7fbzDmv4%3D'
 221349       : 获得解析记录ID: 20014243980380160
 221349       : 地址或类型需要修改
 221352       : #> /usr/bin/wget-ssl -nv -t 1 -O /var/run/ddns/aliyun_a.dat -o /var/run/ddns/aliyun_a.err --no-check-certificate --no-proxy 'https://alidns.aliyuncs.com/?Action=UpdateDomainRecord&RecordId=20014243980380160&RR=%40&Type=A&Value=1x2.2x.1xx.16&Format=JSON&Version=2015-01-09&AccessKeyId=Lxxxxxxxxxxy&SignatureMethod=HMAC-SHA1&Timestamp=2020-07-09T14%3A13%3A52Z&SignatureVersion=1.0&SignatureNonce=1eb82ff4-4f3e-41c0-b91b-0d7ee5389dd4&Signature=2LZVURyMZxGl0N57WF3%2FnO3fBwM%3D'
 221352       : 修改解析记录成功
 221352  info : Update successful - IP '1x2.2x.1xx.16' send
 221352  info : Forced update successful - IP: '1x2.2x.1xx.16' send
 221352       : Waiting 600 seconds (Check Interval)

以下是 aliyun_www 日志文件

 221348       : ************ ************** ************** **************
 221348  note : PID '2646' started at 2020-07-09 22:13
 221348       : ddns version  : 2.7.6-13
 221348       : uci configuration:
ddns.aliyun_www.cacert='IGNORE'
ddns.aliyun_www.dns_server='223.6.6.6'
ddns.aliyun_www.domain='www.sxxxxz.top'
ddns.aliyun_www.enabled='1'
ddns.aliyun_www.interface='wan2'
ddns.aliyun_www.ip_interface='pppoe-wan2'
ddns.aliyun_www.ip_source='interface'
ddns.aliyun_www.lookup_host='www.sxxxxz.top'
ddns.aliyun_www.password='Mxxxxxxxxxxxxxxxxxxxxs'
ddns.aliyun_www.service_name='aliyun.com'
ddns.aliyun_www.use_https='1'
ddns.aliyun_www.username='Lxxxxxxxxxxy'
ddns.aliyun_www=service
 221348       : verbose mode  : 0 - run normal, NO console output
 221348       : check interval: 600 seconds
 221348       : force interval: 259200 seconds
 221348       : retry interval: 60 seconds
 221348       : retry counter : 0 times
 221348       : No old process
 221348       : last update: never
 221348       : Verify DNS server '223.6.6.6'
 221348       : #> timeout 2 -- /usr/bin/nc 223.6.6.6 53 </dev/null >/var/run/ddns/aliyun_www.dat 2>/var/run/ddns/aliyun_www.err
 221348       : Detect registered/public IP
 221348       : #> /usr/bin/nslookup www.sxxxxz.top 223.6.6.6 >/var/run/ddns/aliyun_www.dat 2>/var/run/ddns/aliyun_www.err
 221348       : Registered IP '1xx.2x.1xx.x6' detected
 221348  info : Starting main loop at 2020-07-09 22:13
 221348       : Detect local IP on 'interface'
 221348       : #> ip -o addr show dev pppoe-wan2 scope global >/var/run/ddns/aliyun_www.dat 2>/var/run/ddns/aliyun_www.err
 221348       : Local IP '1x2.2x.1xx.16' detected on interface 'pppoe-wan2'
 221348       : Update needed - L: '1x2.2x.1xx.16' <> R: '1xx.2x.1xx.x6'
 221348       : parsing script '/usr/lib/ddns/update_aliyun_com.sh'
 221348       : #> /usr/bin/wget-ssl -nv -t 1 -O /var/run/ddns/aliyun_www.dat -o /var/run/ddns/aliyun_www.err --no-check-certificate --no-proxy 'https://alidns.aliyuncs.com/?Action=DescribeSubDomainRecords&SubDomain=www.sxxxxz.top&Format=JSON&Version=2015-01-09&AccessKeyId=Lxxxxxxxxxxy&SignatureMethod=HMAC-SHA1&Timestamp=2020-07-09T14%3A13%3A48Z&SignatureVersion=1.0&SignatureNonce=ac0bdb60-be1c-45bf-ae8a-070656cff2d2&Signature=XiWj7HxuIFDh1034%2BJKStNE2R4Y%3D'
 221349       : 获得解析记录ID: 20014328286902272
 221349       : 地址或类型需要修改
 221352       : #> /usr/bin/wget-ssl -nv -t 1 -O /var/run/ddns/aliyun_www.dat -o /var/run/ddns/aliyun_www.err --no-check-certificate --no-proxy 'https://alidns.aliyuncs.com/?Action=UpdateDomainRecord&RecordId=20014328286902272&RR=www&Type=A&Value=1x2.2x.1xx.16&Format=JSON&Version=2015-01-09&AccessKeyId=Lxxxxxxxxxxy&SignatureMethod=HMAC-SHA1&Timestamp=2020-07-09T14%3A13%3A52Z&SignatureVersion=1.0&SignatureNonce=c56cd4ed-95ba-413a-8355-a60b349c7a95&Signature=sQ1d0Um94Grwqg8ga2bGWlUpXGU%3D'
 221352       : 修改解析记录成功
 221352  info : Update successful - IP '1x2.2x.1xx.16' send
 221352  info : Forced update successful - IP: '1x2.2x.1xx.16' send
 221352       : Waiting 600 seconds (Check Interval)

假如 DNS服务器 此参数不填

就会使用默认DNS服务器(mydns.lan,这个默认dns难道是LEDE里的lan侧dns ?),会导致 Lookup Hostname(已注册的IP地址)更新非常缓慢,慢到可能30至40分钟之后,都没有更新正确的IP地址。我分析这个默认dns,应该就是使用LEDE里的lan侧dns,我这里默认的是电信的dns,更新慢得无法接受。

查看日志发现,如果侦测到 已注册的IP地址 (Registered IP ‘1xx.2x.1xx.x6’ detected)对比 本地公网IP地址不同,就会一直请求修改解析 Update needed – L: ‘1×2.2x.1xx.16’ <> R: ‘1xx.2x.1xx.x6’。

然而登录到阿里云控制台,你会发现实际上解析早已经修改成功。由于使用默认dns侦测到的是之前缓存的旧的IP地址,是错误的已注册的IP地址。所以一而再再而三重复提交给阿里云api修改请求,导致报错修改失败。但不影响第一次已经成功修改的解析,只是重复提交修改被拒绝,日志报错而已。

进入 aliyun_a 详细配置 → 计时器设定 ,如下图:保持默认设置即可

检查时间周期,10分钟,可以了,检查的周期时间没必要再短。

好了,所有设置已完成,已经完美工作了1天,很稳定。

我相信这个运行在 OpenWRT/LEDE 的阿里云脚本,会一直稳定运行下去的。

非常感谢大神级作者:sensel 的无私奉献

原帖地址https://www.right.com.cn/forum/thread-267501-1-1.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注