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 的无私奉献