在群晖上使用DNSPod的DDNS功能

为什么用 DNSPod 的 DDNS 服务

家里用的进户路由器是『极路由1S』,可以安装很多 DDNS 服务厂家的插件。之前用的是老牌服务商『花生壳』免费版,但是会有路由器固件升级后就不能解析的问题。 DNSPod 可以绑定自己域名,而且有 DDNS 的 API。只要把自己的域名放在 DNSPod 上解析,就可以使用他家的 DDNS 服务了。

添加需要解析的域名

注册帐号登录之后,添加自己的域名。接着添加一个子域名,用来做 DDNS。

  • 主机记录:xxxxx
  • 记录类型:A
  • 记录值:1.1.1.1
  • 其他默认

在群晖上访问 DNSPod 的 API

获取 domain_id 和 record_id

点击进入Github,这是一个现成的 python 小程序,可以访问 DNSPod 的 API,保持 IP 地址试试更新。不过在此之前,需要先做写准备工作。

获取 domain_id:

    curl -k https://dnsapi.cn/Domain.List -d "login_email=xxx&login_password=xxx"

根据 domain_id, 获取相应子域名的 record_id:

    curl -k https://dnsapi.cn/Record.List -d "login_email=xxx&login_password=xxx&domain_id=xxx"

注意:以上返回的都是 json 文件,下的对应就是该域名的 domain_id

运行程序

复制以下程序, 命名为 pypod.py, 并保存到群晖的/root/文件夹下

注意: 替换 domain_id ,record_id 和 sub_domain

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import httplib, urllib
import socket
import time

params = dict(
    login_email="email", # replace with your email
    login_password="password", # replace with your password
    format="json",
    domain_id=100, # replace with your domain_od, can get it by API Domain.List
    record_id=100, # replace with your record_id, can get it by API Record.List
    sub_domain="www", # replace with your sub_domain
    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__':
    while True:
        try:
            ip = getip()
            print ip
            if current_ip != ip:
                if ddns(ip):
                    current_ip = ip
        except Exception, e:
            print e
            pass
        time.sleep(30)

在群晖上后台运行该程序,需要输入以下命令:

nohup python /root/pypod.py &

完成

Aug 5th, 2015

Comments