使用阿里云的域名API实现动态域名解析DDNS脚本
只要拨号有公网IP地址,我们就可以使用脚本免费实现动态域名解析,相比免费的花生壳稳定性有很大的提升。使用dnspod实现ddns的脚本可以参考:https://zhangnq.com/2334.html 。
首先是需要定义的几个参数:
rc_rr = "home" # 指代二级域名(子域名,空则使用 @ 代替)
rc_domain = "zhangnq.com" # 指代完整域名,若未配置阿里云 NameServer 解析修改也无效
rc_format = "json" # 指定返回数据格式,目前本例使用 JSON 数据
rc_type = "A" # 指定修改记录类型,目前本例使用 A 记录
rc_ttl = "600" # 指定修改 TTL 值,目前本例使用 600 秒
rc_format = "json" # 使用 JSON 返回数据,也可以填写为 XML
data_pkl='/tmp/ddns_ip.pkl' # 保存ip临时文件
# 定义邮箱参数,修改或者异常后邮件通知
smtp_server = "smtp.zhangnq.com"
smtp_port = 465
smtp_username = "noreply@zhangnq.com"
smtp_password = "123456"
smtp_ssl = True
to_emails = "admin@zhangnq.com"
email_error_log = "/tmp/mail_error.log"
access_key_id = "xxxxxxxxxxxxxxxx" # 这里为 Aliyun AccessKey 信息
access_key_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" # 这里为 Aliyun AccessKey 信息
脚本实现ddns的步骤主要如下
一、获取本地公网IP地址
def my_ip_direct(): opener = urllib.urlopen('http://tool.sijitao.net/network/ip/myip?type=html') strg = opener.read() return strg
二、获取本地保存的IP
def get_local_ip(): try: f=file(data_pkl,'rb') data_dict=pickle.load(f) f.close() except: data_dict={"ip":""} return data_dict["ip"]
三、获取DNS解析出来的IP
def host2ip(hostname): ip =socket.gethostbyname(hostname) return ip
四、获取阿里云域名解析中记录的IP
def check_record_id(dns_rr, dns_domain): times = 0 # 用于检查对应子域名的记录信息 check = 0 # 用于确认对应子域名的记录信息 request = CommonRequest() request.set_accept_format('json') # 设置返回格式 request.set_domain('alidns.aliyuncs.com') # 阿里云服务 request.set_method('POST') request.set_protocol_type('https') request.set_version('2015-01-09') request.set_action_name('DescribeDomainRecords') request.add_query_param('DomainName', rc_domain) # 设置请求域名 request.add_query_param('RRKeyWord', rc_rr) request.add_query_param('TypeKeyWord', rc_type) response = loads(clt.do_action(request)) # 接受返回数据 result = response['DomainRecords']['Record'] # 缩小数据范围 for record_info in result: # 遍历返回数据 if record_info['RR'] == dns_rr: # 检查是否匹配 check = 1; break; # 确认完成结束 else: times += 1 # 进入下个匹配 if check: result = result[times]['RecordId'] # 返回记录数值 else: result = -1 # 返回失败数值 return result def old_ip(dns_record_id): request = CommonRequest() request.set_accept_format('json') # 设置返回格式 request.set_domain('alidns.aliyuncs.com') request.set_method('POST') # 设置记录值 request.set_protocol_type('https') request.set_version('2015-01-09') request.set_action_name('DescribeDomainRecordInfo') request.add_query_param('RecordId', dns_record_id) result = loads(clt.do_action(request)) # 接受返回数据 return result['Value'] # 返回记录数值 # 调用方法 rc_record_id = check_record_id(rc_rr, rc_domain) o_ip = old_ip(rc_record_id)
五、比较检查出来的IP,不一致的话修改
def update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl): request = CommonRequest() request.set_accept_format('json') # 设置返回格式 request.set_domain('alidns.aliyuncs.com') request.set_method('POST') request.set_protocol_type('https') request.set_version('2015-01-09') request.set_action_name('UpdateDomainRecord') request.add_query_param('RecordId', dns_record_id) # 设置记录值 request.add_query_param('RR', dns_rr) # 设置子域名信息 request.add_query_param('Type', dns_type) # 设置 DNS 类型 request.add_query_param('Value', dns_value) # 设置解析 IP response = loads(clt.do_action(request)) # 发送请求内容 return response #调用 rc_value = '1.2.3.4' rc_record_id = check_record_id(rc_rr, rc_domain) resp = update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl)
六、添加计划任务
*/1 * * * * /usr/bin/python /root/scripts/ali4ddns.py >>/tmp/ali4ddns.log 2>&1
详细的脚本下载地址:https://github.com/zhangnq/scripts/blob/master/python/ali4ddns.py
-
还没有Trackbacks
学习了