只要拨号有公网IP地址,我们就可以使用脚本免费实现动态域名解析,相比免费的花生壳稳定性有很大的提升。使用dnspod实现ddns的脚本可以参考:http://blog.nbqykj.cn/?p=2334.html 。
首先是需要定义的几个参数:
rc_rr = “home” # 指代二级域名(子域名,空则使用 @ 代替)
rc_domain = “blog.nbqykj.cn” # 指代完整域名,若未配置阿里云 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.blog.nbqykj.cn”
smtp_port = 465
smtp_username = “noreply@blog.nbqykj.cn”
smtp_password = “123456”
smtp_ssl = True
to_emails = “admin@blog.nbqykj.cn”
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('https://tool.nbqykj.cn/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
