首先说下情况,我的树莓派通过电信光猫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相关推荐

  1. 阿里云弹性EIP和固定公网IP的区别

    阿里云服务器可以绑定弹性公网IP(EIP)也可以使用固定公网IP,无论是EIP还是公网IP都可以对外提供外网服务,阿里云百科来详细说下阿里云EIP和固定IP的区别: 阿里云EIP和公网IP详解 什么是 ...

  2. 用阿里云 DNS SDK 实现动态域名解析

    最近学 Java ,就将 Git 服,和测试服,直接放在家里的树莓派3和旧笔记本上, 为了在外网顺利访问,需要将域名动态的解析到家里的 IP 上, 网上了解了一番,觉得阿里云那套通过 sdk 来更新域 ...

  3. 家庭公网IP动态解析至阿里云DNS

    家庭公网IP动态解析之阿里云DNS 此服务使用Java开发,每隔10分钟进行阿里云dns解析.如果解析地址未变更,则不出发修改解析操作. 代码 1. AliClient 代码 获取指定域名的解析记录和 ...

  4. 阿里云DNS动态解析:解决内网服务外网访问

    阿里云DNS动态解析:解决内网服务外网访问 目录 注册阿里云账号获取AccessKeyId,AccessKeySecret并授权 阿里云关于DNS解析的SDK及API文档 代码实现 目录 注册阿里云账 ...

  5. 群晖域名解析 DDNS ——阿里云 DNS 脚本

    背景 之前,为了远程访问群晖应用,且为了不使用弱智的ip访问模式,在阿里云上买了域名,将自己的公网ip绑定到该域名上.但是呢,由于我使用了路由器拨号,且设置了每周一凌晨重启路由器,保证路由器的性能.因 ...

  6. Python 实现动态解析阿里云DNS记录

    一.背景 最近有一个需求,公司内网的IP地址会发生变化,导致阿里云域名不能解析到新的IP地址,此时我们需要对阿里云的域名进行更新 二.实现 2.1 获取本地出口的公网IP 2.1.1 通过命令或网页 ...

  7. 阿里云 DNS 新增云上线路的智能解析功能

    传统解析 VS 智能解析 我们知道,传统DNS解析方式,无需判断访问者来源,会随机选择其中一个IP地址返回给访问者.然而,这样的方式,已经不能满足现今互联网用户的访问需求.因此,DNS智能解析应运而生 ...

  8. acme.sh使用阿里云DNS申请Let’s Encrypt的https证书

    环境: centos7 前置条件: 域名(在阿里云购买一个最低的域名即可) acme 脚本 阿里云云账号AccessKey ID和AccessKey Secret(参考阿里云官方文档进行申请)如何获取 ...

  9. Python+阿里云DNS 搭建DDNS动态域名解析

    家用的动态公网IP在断电以及一段时间后会变化,现在家宽公网IP开网盘以及代理管得越来越严格,已经有检测到被封的案例 上海检测web封停 这让我这种挂种子的PT党(迫真)感到害怕 以前我把国外的免费域名 ...

最新文章

  1. Silverlight与数据库的三种互操作[源代码]
  2. Tableau可视化分析实战系列浏览 Tableau 环境(五) -视图的部件
  3. Join的加强版CountDownLatch
  4. VMware linux 克隆机的配置
  5. Android开发之购物车加减按钮(附加源码)
  6. linux命令行如何上翻,Linux学习教程-获取可用命令行参数 or 文件上下翻转和左右翻转...
  7. 如何打造园本特色_如何打造一个可持续发展的特色观光园?
  8. Spark structured 记录一次kudu扩容导致无法写入数据的问题
  9. 计算机病毒是具有破坏性的程序6,2015年计算机二级MS Office习题及答案解析(6)
  10. 时间操作(JavaScript版)—页面显示格式:年月日星期几
  11. 阶段3 2.Spring_03.Spring的 IOC 和 DI_2 spring中的Ioc前期准备
  12. 修改别人服务器数据库,修改别人服务器数据库
  13. 紫猫插件-网络共享数据(7-15)
  14. Beyond compare4激活使用
  15. Unity3d调用Andriod
  16. 美国计算机硕士要读多久,去美国读研究生需要多久 各专业时长一览
  17. 给网站添加HTTPS(添加SSSL证书)
  18. [Linux] 如何在 Linux 电脑上制作专业的视频教程
  19. 惠普HP Prime可编程计算器之添加坐标表及写入与读取
  20. 电子科技大学信息与通信工程学院858考研上岸经验分享(一)

热门文章

  1. 微软扩大知识产权保护范围 划清与 Linux 界线
  2. Program type already present问题解决
  3. 网络分层模型TCP/IP
  4. 清理vmware 拖拽缓存
  5. 从零开始学 Python 之 初识 Python 多线程
  6. 监控线上服务器运行情况脚本
  7. 用Foxmail for Mac客户端登录网易163邮箱
  8. 什么蓝牙耳机好用?盘点2021年最值得入手的蓝牙耳机
  9. 阿里云服务器续费流程(2023年新版教程)
  10. 学生信息管理系统—优化错误篇