动态域名解析DDNS

什么是DDNS

由于使用的宽带的ip不是固定的,把域名指向动态的ip地址就是动态域名解析DDNS。

方案

一般路由器都会支持,如果路由器不支持的话就需要自己写脚本了:

  • 脚本获取外网ip地址,并与之前的记录进行对比,如果改变了则修改记录并调用自己域名的名字服务商的api变更DNS。
  • 加到crontab里自动执行,根据需要设置执行间隔,我设置的是5分钟。

代码

python 代码ddns.py,其中修改域名解析的函数部分根据不同的DNS服务商去完善,后面有阿里云和cloudflare的change_DNS函数的代码,如果是其他服务商的话就只能自己查文档编写了。第一次执行是要创建.myip.ip,然后随便写个ip进去,不然会报错。

# -*- coding: utf-8 -*-

import requests
import time
from json import load

def change_DNS(ip):
    # 此函式是调用域名的DNS服务器的api修改DNS的函数,根据服务商来补充此处代码

my_ip = requests.get('https://checkip.amazonaws.com').text.strip()
fo = open(".myip.ip", mode='r+')
oldip = fo.readline().split()[0]
if my_ip != oldip:
    print oldip
    print my_ip
    fo.seek(0, 0)
    fo.write(my_ip)
    fo.truncate()
    change_DNS(my_ip)
fo.clise

#记录日志
flog = open(".ddnslog", mode='a')
flog.write(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())  + "    IP:" + my_ip + "\r\n")
flog.close

阿里云修改DNS

文档:https://help.aliyun.com/document_detail/124923.html

在阿里云买的域名默认都是在他们那里托管,在他们网站创建好AccessKey,拿到AccessKey ID 和 AccessKey Secret, 然后安装阿里的python工具包(如果之前没安装过的话) pip install aliyunsdkcore。(因为我迁移到cloudflare,这个代码很久没用了,如果执行有问题参考上面的官方文档。)

$AccessKeyID,$AccessKeySecret替换,$YourDomainNamePrefix是你要修改的子域名的前缀,比如example.tickell.top,$YourDomainNamePrefix就填写example,$YourDomainName填写tickell.top

from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109.UpdateDomainRecordRequest import UpdateDomainRecordRequest

def change_DNS(ip):
    client = AcsClient('$AccessKeyID', '$AccessKeySecret', 'cn-hangzhou')
    request = UpdateDomainRecordRequest()
    request.set_accept_format('json')
    request.set_Value("3.0.3.0")
    request.set_RR("$YourDomainNamePrefix")
    request.set_DomainName("$YourDomainName")
    request.set_Type("A")
    request.set_Value(ip)
    response = client.do_action_with_exception(request)
    # python2:  print(response)
    print(response)

cloudflare修改DNS

文档:https://developers.cloudflare.com/dns/manage-dns-records/

先去dash.cloudflare.com的DNS里创建个域名解析,脚本需要的参数除了邮箱和Token之外,还需要两个ID,母域名ID和子域名ID,因为这个ID不会变,获取到之后写到脚本就行。 获取母域名ZoneId $MyEmail替换成你注册api.cloudflare.com的邮箱,$MyToken替换成你申请的api密钥

curl -X GET "https://api.cloudflare.com/client/v4/zones" \
    -H "X-Auth-Email: $MyEmail" \
    -H "X-Auth-Key: $MyToken" \
    -H "Content-Type: application/json"

返回结果里你托管的域名的第一个参数id就是我们想要的参数。

获取RecordId $MyZoneId替换成上面的获取的Id

curl -X GET "https://api.cloudflare.com/client/v4/zones/$MyZoneId/dns_records?page=1&per_page=20&order=type&direction=asc" \
    -H "X-Auth-Email: $MyEmail" \
    -H "X-Auth-Key: $MyToken" \
    -H "Content-Type: application/json"

返回结果json可以先拿去格式化,找到自己配置的子域名项的id就是RecordId

修改域名解析 $MyRecordId替换成上面获取的RecordId,$DomainName,$IP换成你的域名和IP

curl -X PUT "https://api.cloudflare.com/client/v4/zones/$MyZoneId/dns_records/$MyRecordId" \
    -H "X-Auth-Email: $MyEmail" \
    -H "X-Auth-Key: $MyToken" \
    -H "Content-Type: application/json "\
    --data '{"type":"A", "name":"$DomainName","content":"$IP","ttl":120, "proxied":false}'

确定操作正常后,把最后一步改成python脚本加到之前脚本的change_DNS函数中

$MyID, $MyRecordId,$MyEmail, $MyToken替换成你的参数


    def change_DNS(ip):
        MyId = "$MyID"
        MyRecordId = "$MyRecordId"

        headers = {
            'X-Auth-Email': '$MyEmail',
            'X-Auth-Key': '$MyToken',
            'Content-Type': 'application/json'
        }
        data = '{"type":"A", "name":"$YourDomainName","content":"' + ip +'","ttl":120, "proxied":false}'
        url = "https://api.cloudflare.com/client/v4/zones/" + MyZoneId + "/dns_records/" + MyRecordId
        response = requests.put(url, headers = headers, data = data)
        print(response)

加入到定时任务

编写定时任务crontab -e*/5 * * * * cd /data/tool/tickell && python3 cfddns.py加到最后,即每 5分钟执行一次。

Last Updated:
Contributors: Tickell