动态域名解析,缩写ddns,它不同于我们常用的DNS解析,而是专门用于对付那种没有固定公网 IP 的服务器地址解析的。
典型的使用情况就是:自家宽带构建小服务器,没有固定IP,想要上线,除了写脚本发邮件外,就只有ddns这一条路可以走了。
目前来说,国内最知名的可能就是出了名的难用不稳定的花生壳了。国外的话有一个dynu也很不错。
现在阿里云开放了 API,那么我们能否使用阿里云的 API 自行实现一个ddns呢?原理自然很简单,自己实现一个小客户端,然后定期获取自身外网 IP 然后通过 API 去修改一下对应的域名解析就好了!
当然,已经有人做了客户端这部分的工作(感谢
),用 python 2 实现,所以,它是跨平台的。这里我们用 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 的任务管理来实现域名的动态解析:
1 |
Ubuntu:~# crontab -e |
我们在文件内容末尾追加一行,输入:
1 |
*/1 * * * * cd /opt/aliyun-ddns-client && /usr/bin/python ddns.py |
这句表示每隔一分钟,进入程序目录(我们之前克隆客户端的目录),然后执行程序进行一次更新。
好了,至此我们的 home.logcg.com 域名就成了动态解析✌️
本文由 落格博客 原创撰写:落格博客 » 利用阿里云域名管理 API 实现 动态域名解析 ddns
转载请保留出处和原文链接:https://www.logcg.com/archives/1768.html
这个蛮好的,对linux新手来说没那么复杂。一次就成功了
感谢。。。。
不能解析泛域名啊
我感觉这个对我有用,先马克个
搞定了, 打上了PY的几个Requests的包,就解决了 ,谢谢。
哈哈好吧,使用 python 的时候一定要注意版本和缺失包, No module named xxx
碰到新问题,,,,
ubuntu@ubuntu:/opt/aliyun-ddns-client$ python ddns.py
Failed to get valid Domain Records Info
2016-07-08 23:30:14 [ERROR] Failed to match remote domain record for http://www.wixxz.com
2016-07-08 23:30:14 [ERROR] Failed doing the first time sync for record:DomainRecord1
在找原因中,,,,
不应该加 http://,直接写域名,哦, www.也不应该加的呀!哦对了,这个脚本不是我写的哈,是rfancn
把阿里云的返回数据打印出来看看
我的情况是时间错误
或者试试这个
https://github.com/shellc/aliyun-ddns
后来用原软件解决了,是权限问题 3Q。
我也是这种问题,想请问一下怎么解决的啊?谢谢
leolindaming@hotmail.com
Git了你的Aliyun-DDNS-client这个东东在应用的时候 出现了以下错误,博主有空的话帮看看哟, 我邮箱3117821@qq.com
ubuntu@ubuntu:/opt/aliyun-ddns-client$ python ddns.py
Traceback (most recent call last):
File “ddns.py”, line 21, in
from helper import DDNSHelper
File “/opt/aliyun-ddns-client/helper.py”, line 20, in
from utils import DDNSUtils
File “/opt/aliyun-ddns-client/utils.py”, line 20, in
import requests
ImportError: No module named requests
结束