使用阿里云 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都有,应该不会出问题。获取阿里云的授权码也百度下即可,这里不说。下面是脚本内容(参考:http://zhangzr.com/2017/09/01/aliyunddns/):
#!/usr/bin/env python
# -*- coding: UTF-8 -*-import json
import os
import re
import sys
from datetime import datetimefrom aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest, DescribeDomainRecordsRequest, \DescribeDomainRecordInfoRequest
from aliyunsdkcore import client#请填写你的Access Key ID
access_key_id = "LTAIdR"#请填写你的Access Key Secret
access_key_secret = "lv535M"#如果选择yes,则运行程序后仅现实域名信息,并不会更新记录,用于获取解析记录ID。
#如果选择no,则运行程序后不显示域名信息,仅更新记录
#i_dont_know_record_id = 'yes'
i_dont_know_record_id = 'no'#请填写解析记录ID
rc_record_id = '3995858176'#请填写你的一级域名
rc_domain = 'beavermagic.com'#请填写你的解析记录,对应的主机记录
rc_rr = 'server'#请填写你的记录类型,DDNS请填写A,表示A记录
rc_type = 'A'#请填写解析有效生存时间TTL,单位:秒
#rc_ttl = '1'
rc_ttl = '600'#请填写返还内容格式,json,xml
rc_format = 'json'def my_ip():get_ip_method = os.popen('curl -s ip.cn')get_ip_responses = get_ip_method.readlines()[0]get_ip_pattern = re.compile(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 = 'beavermagic.com'是一级域名,rc_rr = 'server'是对应的二级域名,如我这里二者组合就是server.beavermagic.com。刚开始不知道record id,所以设置为yes,然后获取到后将其改为no。
程序有时候报异常,如后去ip失败数组越界,或者修改了记录写日志,这样会导致Linux上自己收到邮件,比较烦。那么就将其输出重定向即可,我的crontab设置如下:
* * * * * /home/ssss/bin/ddns_pi.py >> /tmp/ddns_output.txt 2>&1
看一下它修改dns记录成功的截图:
使用阿里云 dns sdk 解决电信公网ip自动变化问题;自己动手实现ddns相关推荐
- 阿里云弹性EIP和固定公网IP的区别
阿里云服务器可以绑定弹性公网IP(EIP)也可以使用固定公网IP,无论是EIP还是公网IP都可以对外提供外网服务,阿里云百科来详细说下阿里云EIP和固定IP的区别: 阿里云EIP和公网IP详解 什么是 ...
- 用阿里云 DNS SDK 实现动态域名解析
最近学 Java ,就将 Git 服,和测试服,直接放在家里的树莓派3和旧笔记本上, 为了在外网顺利访问,需要将域名动态的解析到家里的 IP 上, 网上了解了一番,觉得阿里云那套通过 sdk 来更新域 ...
- 家庭公网IP动态解析至阿里云DNS
家庭公网IP动态解析之阿里云DNS 此服务使用Java开发,每隔10分钟进行阿里云dns解析.如果解析地址未变更,则不出发修改解析操作. 代码 1. AliClient 代码 获取指定域名的解析记录和 ...
- 阿里云DNS动态解析:解决内网服务外网访问
阿里云DNS动态解析:解决内网服务外网访问 目录 注册阿里云账号获取AccessKeyId,AccessKeySecret并授权 阿里云关于DNS解析的SDK及API文档 代码实现 目录 注册阿里云账 ...
- 群晖域名解析 DDNS ——阿里云 DNS 脚本
背景 之前,为了远程访问群晖应用,且为了不使用弱智的ip访问模式,在阿里云上买了域名,将自己的公网ip绑定到该域名上.但是呢,由于我使用了路由器拨号,且设置了每周一凌晨重启路由器,保证路由器的性能.因 ...
- Python 实现动态解析阿里云DNS记录
一.背景 最近有一个需求,公司内网的IP地址会发生变化,导致阿里云域名不能解析到新的IP地址,此时我们需要对阿里云的域名进行更新 二.实现 2.1 获取本地出口的公网IP 2.1.1 通过命令或网页 ...
- 阿里云 DNS 新增云上线路的智能解析功能
传统解析 VS 智能解析 我们知道,传统DNS解析方式,无需判断访问者来源,会随机选择其中一个IP地址返回给访问者.然而,这样的方式,已经不能满足现今互联网用户的访问需求.因此,DNS智能解析应运而生 ...
- acme.sh使用阿里云DNS申请Let’s Encrypt的https证书
环境: centos7 前置条件: 域名(在阿里云购买一个最低的域名即可) acme 脚本 阿里云云账号AccessKey ID和AccessKey Secret(参考阿里云官方文档进行申请)如何获取 ...
- Python+阿里云DNS 搭建DDNS动态域名解析
家用的动态公网IP在断电以及一段时间后会变化,现在家宽公网IP开网盘以及代理管得越来越严格,已经有检测到被封的案例 上海检测web封停 这让我这种挂种子的PT党(迫真)感到害怕 以前我把国外的免费域名 ...
最新文章
- Silverlight与数据库的三种互操作[源代码]
- Tableau可视化分析实战系列浏览 Tableau 环境(五) -视图的部件
- Join的加强版CountDownLatch
- VMware linux 克隆机的配置
- Android开发之购物车加减按钮(附加源码)
- linux命令行如何上翻,Linux学习教程-获取可用命令行参数 or 文件上下翻转和左右翻转...
- 如何打造园本特色_如何打造一个可持续发展的特色观光园?
- Spark structured 记录一次kudu扩容导致无法写入数据的问题
- 计算机病毒是具有破坏性的程序6,2015年计算机二级MS Office习题及答案解析(6)
- 时间操作(JavaScript版)—页面显示格式:年月日星期几
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
- 修改别人服务器数据库,修改别人服务器数据库
- 紫猫插件-网络共享数据(7-15)
- Beyond compare4激活使用
- Unity3d调用Andriod
- 美国计算机硕士要读多久,去美国读研究生需要多久 各专业时长一览
- 给网站添加HTTPS(添加SSSL证书)
- [Linux] 如何在 Linux 电脑上制作专业的视频教程
- 惠普HP Prime可编程计算器之添加坐标表及写入与读取
- 电子科技大学信息与通信工程学院858考研上岸经验分享(一)