动态域名解析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分钟执行一次。
