首页 > 代码库 > Synology DDNS 配置
Synology DDNS 配置
记录下,自己折腾了半天。
首先方案1:
我使用的是synology自己的DDNS,那个简单。注册填写即可。
方案2:
使用自己的域名,我使用的是dnspod.cn的。
没有可以直接注册的地方,也没有可以直接使用的。
查看DNSPOD的资料后,发现是可以通过命令来执行的。但是本人比较懒,不想每次开机执行或者别的方式。
所以最终结合Synology的计划任务来执行。
以下Synology操作均在admin(管理员)下进行;
为了节约时间,在Synology中先开始安装Python(Python/Python3 自己选择,我安装的是Python3);
首先,
没有疑问的是注册dnspod,拥有自己的域名,比如:g.cn;修改域名解析,添加A记录啥的,我就不详细写了。(不会的可以翻墙google)
最终结果,域名下面增加的是:
然后,看资料都说需要使用XX命令,来获取域名ID,子域名ID,但发现API好像有修改;所以,我又偷懒了,使用了DNSPOD的工具;
dnspod的api地址: https://support.dnspod.cn/Support/api
我下载的是:官方客户端 。
然后就是简单的登陆。
登陆后:
找到相应域名(g.cn),后面的id就是我们的域名id(29)。
编辑g.cn。找到我们要配置的子域名(nas);
nas域名的id为49.
以上记录留下。
不管python有没有安装好。我们都可以继续下面的事情。
保存Python的脚本,保存文件名为DnspodDDns.py:
安装Python的保存:
#!/usr/bin/env python #-*- coding:utf-8 -*- import httplib, urllib import socket import time params = dict( login_email="g@gmail.com", # 替换你的邮箱帐号 login_password="GoogleBye", # 替换你的密码 format="json", domain_id=29, # 替换你的DomainID record_id=49, # 替换你的RecordID sub_domain="nas", # 替换你的子域名 record_line="默认", ) current_ip = None def ddns(ip): params.update(dict(value=ip)) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"} conn = httplib.HTTPSConnection("dnsapi.cn") conn.request("POST", "/Record.Ddns", urllib.urlencode(params), headers) response = conn.getresponse() print response.status, response.reason data = response.read() print data conn.close() return response.status == 200 def getip(): sock = socket.create_connection((‘ns1.dnspod.net‘, 6666)) ip = sock.recv(16) sock.close() return ip if __name__ == ‘__main__‘: try: ip = getip() print ip if current_ip != ip: if ddns(ip): current_ip = ip except Exception, e: print e pass
安装Python3的保存:
#!/usr/bin/env python #-*- coding:utf-8 -*- import http.client, urllib from urllib.parse import urlencode import socket import time params = dict( login_email="g@gmail.com", # 替换你的邮箱帐号 login_password="GoogleBye", # 替换你的密码 format="json", domain_id=29, # 替换你的DomainID record_id=49, # 替换你的RecordID sub_domain="nas", # 替换你的子域名 record_line="默认", ) current_ip = None def ddns(ip): params.update(dict(value=ip)) headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"} conn = http.client.HTTPSConnection("dnsapi.cn") conn.request("POST", "/Record.Ddns", urlencode(params), headers) response = conn.getresponse() print (response.status, response.reason) data = response.read() print (data) conn.close() return response.status == 200 def getip(): sock = socket.create_connection((‘ns1.dnspod.net‘, 6666)) ip = sock.recv(16) sock.close() return ip if __name__ == ‘__main__‘: try: ip = getip() print (ip) if current_ip != ip: if ddns(ip): current_ip = ip except Exception as e: print (e) pass
保存成功后,上传至Synology,我这边就保存在了admin的home根目录,所以路径为(/volume1/homes/admin/DnspodDDNS.py)。
如过上传至其他目录,右击文件名->查看属性,可以查看到所在位置,记录下来备用:
打开,Synology的“控制面板”,找到”计划任务"
打开后,新增“用户定义的脚本”。
任务名称:任意,这里输入的是(DNSPOD DDNS);
用户账户:默认;
用户定义的脚本: python + 路径(就是上午记录的py所在位置)
如过Synology安装的是Python 。命令为:python /volume1/homes/admin/DnspodDDNS.py
如过安装的是Python3。命令为:python3 /volume1/homes/admin/DnspodDDNS.py
图为Python3的例子:
修改计划:
确定,保存成功。在“计划任务”上,选择我们的任务,点击顶部导航的“运行”。
运行完成后,到dnspod上查看,我们子域名的ip是否已经修改为我们所期望的ip。
注:
因为,我的Python代码内部并没有重复。所以每小时只会运行一次。
也就是说,可能出现IP变动一小时后才能更新上DNSPOD;
如过又需要,可以在Python中,增加死循环脚本:
最后Python3 版,最后部分代码如下:
if __name__ == ‘__main__‘: while True: try: ip = getip() print (ip) if current_ip != ip: if ddns(ip): current_ip = ip except Exception as e: print (e) pass time.sleep(30)
完。