首页 > 代码库 > 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
    
Python

 

  安装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
    
Python3

 

 

  保存成功后,上传至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)
Python3 死循环最后部分

 

  

  完。