700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 使用阿里云 dns sdk 解决电信公网ip自动变化问题;自己动手实现ddns

使用阿里云 dns sdk 解决电信公网ip自动变化问题;自己动手实现ddns

时间:2020-10-03 12:39:11

相关推荐

使用阿里云 dns sdk 解决电信公网ip自动变化问题;自己动手实现ddns

首先说下情况,我的树莓派通过电信光猫dmz主机设置全端口映射得到了公网ip,ssh等连接都很迅速,ping值为60ms。上海电信200M宽带,上传25mbps。由于是动态公网ip,电信隔几天就换ip,这个差不多十天,不一定。我写了简单的脚本,用计划任务每分钟访问我的vultr服务器上的nginx服务(curl命令),nginx可以记录来访的ip,我就知道该树莓派的动态ip了。所以有时候访问不了了,ip变化了,我就看一下nginx日志后去阿里云手动修改dns解析。

以上的操作还是略麻烦的,后来百度下,得知阿里云dns有sdk,直接用脚本就能修改dns解析记录了。该方法比我原来手动的省事很多,而且能根据计划每分钟检查,所以可以说就算电信ip一天变一次也感觉不到。

下面记录如何设置的,安装配置sdk就不说了,github都有,应该不会出问题。获取阿里云的授权码也百度下即可,这里不说。下面是脚本内容(参考://09/01/aliyunddns/):

#!/usr/bin/env python# -*- coding: UTF-8 -*-import jsonimport osimport reimport sysfrom datetime import datetimefrom aliyunsdkalidns.request.v0109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \DescribeDomainRecordInfoRequestfrom aliyunsdkcore import client#请填写你的Access Key IDaccess_key_id = "LTAIdR"#请填写你的Access Key Secretaccess_key_secret = "lv535M"#如果选择yes,则运行程序后仅现实域名信息,并不会更新记录,用于获取解析记录ID。#如果选择no,则运行程序后不显示域名信息,仅更新记录#i_dont_know_record_id = 'yes'i_dont_know_record_id = 'no'#请填写解析记录IDrc_record_id = '3995858176'#请填写你的一级域名rc_domain = ''#请填写你的解析记录,对应的主机记录rc_rr = 'server'#请填写你的记录类型,DDNS请填写A,表示A记录rc_type = 'A'#请填写解析有效生存时间TTL,单位:秒#rc_ttl = '1'rc_ttl = '600'#请填写返还内容格式,json,xmlrc_format = 'json'def my_ip():get_ip_method = os.popen('curl -s ')get_ip_responses = get_ip_method.readlines()[0]get_ip_pattern = pile(r'\d+\.\d+\.\d+\.\d+')get_ip_value = get_ip_pattern.findall(get_ip_responses)[0]return get_ip_valuedef check_records(dns_domain):clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()request.set_DomainName(dns_domain)request.set_accept_format(rc_format)#result = clt.do_action(request)result = clt.do_action_with_exception(request)return resultdef old_ip():clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')request = DescribeDomainRecordInfoRequest.DescribeDomainRecordInfoRequest()request.set_RecordId(rc_record_id)request.set_accept_format(rc_format)#result = clt.do_action(request)result = clt.do_action_with_exception(request)result = json.JSONDecoder().decode(result)result = result['Value']return resultdef update_dns(dns_rr, dns_type, dns_value, dns_record_id, dns_ttl, dns_format):clt = client.AcsClient(access_key_id, access_key_secret, 'cn-hangzhou')request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()request.set_RR(dns_rr)request.set_Type(dns_type)request.set_Value(dns_value)request.set_RecordId(dns_record_id)request.set_TTL(dns_ttl)request.set_accept_format(dns_format)#result = clt.do_action(request)result = clt.do_action_with_exception(request)return resultdef write_to_file():time_now = datetime.now().strftime('%Y-%m-%d %H:%M:%S')#current_script_path = sys.path[7]current_script_path = sys.path[0]print current_script_pathlog_file = current_script_path + '/' + 'aliyun_ddns_log.txt'write = open(log_file, 'a')write.write(time_now + ' ' + str(rc_value_old) + '--->' + str(rc_value) + '\n')write.close()returnif i_dont_know_record_id == 'yes':pass#print check_records(rc_domain)elif i_dont_know_record_id == 'no':rc_value = my_ip()rc_value_old = old_ip()if rc_value_old == rc_value:pass#print 'The specified value of parameter Value is the same as old'else:#print update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format)update_dns(rc_rr, rc_type, rc_value, rc_record_id, rc_ttl, rc_format)write_to_file()

这里rc_domain = ''是一级域名,rc_rr = 'server'是对应的二级域名,如我这里二者组合就是。刚开始不知道record id,所以设置为yes,然后获取到后将其改为no。

程序有时候报异常,如后去ip失败数组越界,或者修改了记录写日志,这样会导致Linux上自己收到邮件,比较烦。那么就将其输出重定向即可,我的crontab设置如下:

* * * * * /home/ssss/bin/ddns_pi.py >> /tmp/ddns_output.txt 2>&1

看一下它修改dns记录成功的截图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。