利用阿里云域名管理API实现动态域名解析(ddns)

动态域名解析,缩写ddns,它不同于我们常用的DNS解析,而是专门用于对付那种没有固定公网IP的服务器地址解析的。

典型的使用情况就是:自家宽带构建小服务器,没有固定IP,想要上线,除了写脚本发邮件外,就只有ddns这一条路可以走了。

目前来说,国内最知名的可能就是出了名的难用不稳定的花生壳了。国外的话有一个dynu也很不错。

现在阿里云开放了 API,那么我们能否使用阿里云的 API 自行实现一个ddns呢?原理自然很简单,自己实现一个小客户端,然后定期获取自身外网 IP 然后通过 API 去修改一下对应的域名解析就好了!

当然,已经有人做了客户端这部分的工作(感谢rfancn),用 python2 实现,所以,它是跨平台的。

这里我们用 Ubuntu 16.04 的vps来做例子。

首先从 github 克隆项目到本地:

1
2
Ubuntu:# cd /opt
Ubuntu:/opt# git clone https://github.com/rfancn/aliyun-ddns-client.git

然后把配置文件拷贝到指定位置并编辑:

1
2
3
Ubuntu:/opt# cd aliyun-ddns-client/
Ubuntu:/opt/aliyun-ddns-client# cp ddns.conf.example /etc/ddns.conf
Ubuntu:/opt/aliyun-ddns-client# vi /etc/ddns.conf
1
2
3
4
5
6
7
8
9
10
11
12
[DEFAULT]
access_id = XUG8zYuSMNfieXYZ
access_key = qdksYdEFe5ScGgIDcj9hN8KUk2RTXX
interval = 600
debug = true

[DomainRecord1]
domain = logcg.com
sub_domain = home
type = A
id =
value =

这里,我们需要获取阿里云的 API 权限,获取方法则是登录阿里云;

在后台首页顶栏右边找到“Access Keys”;
通过短信验证之后点击页面右上边按钮创建一个新的 Access Key;
页面所显示的Access Key ID和 Access Key Secret 则为所需ID和Key。

获取到 API 权限之后,我们再继续来修改配置:

配置中的 interval 无效不用管, [DomainRecord1] 则是你的域名字段,可以改成对应的名称用来区别不同的子域而已,如果你要做多个子域的动态解析,那就写多个字段即可。

针对这个字段里, domain 为你的域名,主域; sub_domain 为要动态解析的子域,记得提前创建好,解析到任意 IP 即可。

比如说,要动态解析 home.logcg.com,那么就按照上文的例子填写。

type 为解析记录,比如 A 记录(例子中的记录);MX 记录等。

最后 id 和 value 留空,让程序自行完成即可。

编辑完成之后,可以执行Ubuntu:/opt/aliyun-ddns-client# python ddns.py 来运行,第一次运行会得到错误 [ERROR] You must specify domain record id.没关系,这是由于我们把 id 字段留空的结果,程序会自行获取完成,再执行一次试试看:

1
2
Ubuntu:~/aliyun-ddns-client# python ddns.py
2016-06-21 16:01:10 [INFO] Successfully sync done for record:DomainRecord1

去后台页面刷新看看,解析地址已经更新了。

自动同步

那么,现在我们来利用 Ubuntu 的任务管理来实现域名的动态解析:
Ubuntu:~# crontab -e

我们在文件内容末尾追加一行,输入:
*/1 * * * * cd /opt/aliyun-ddns-client && /usr/bin/python ddns.py

这句表示每隔一分钟,进入程序目录(我们之前克隆客户端的目录),然后执行程序进行一次更新。

好了,至此我们的 home.logcg.com 域名就成了动态解析。