域名还能绑定动态IP?看完又涨知识了!!

点击上方蓝色“冰河技术”,关注并选择“设为星标”

持之以恒,贵在坚持,每天进步一点点!

作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:

https://github.com/sunshinelyz/mykit-delay

PS: 欢迎各位Star源码,也可以pr你牛逼哄哄的代码。      

写在前面

一般家庭网络的公网IP都是不固定的,而我又想通过域名来访问自己服务器上的应用,也就是说:需要通过将域名绑定到动态IP上来实现这个需求。于是乎,我开始探索实现的技术方案。通过在网上查阅一系列的资料后,发现阿里云可以做到实现动态域名解析DDNS。于是乎,一顿操作下来,我实现了域名绑定动态IP。这里,我们以Python为例实现。

Java版源码已提交到:https://github.com/sunshinelyz/mykit-ddns

阿里云DDNS前置条件

  • 域名是在阿里云购买的

  • 地址必须是公网地址,不然加了解析也没有用

通过阿里云提供的SDK,然后自己编写程序新增或者修改域名的解析,达到动态解析域名的目的;主要应用于pppoe拨号的环境,比如家里设置了服务器,但是外网地址经常变化的场景;再比如公司的pppoe网关,需要建立vpn的场景。

安装阿里云SDK

需要安装两个SDK库,一个是阿里云核心SDK库,一个是阿里云域名SDK库;

阿里云核心SDK库

pip install aliyun-python-sdk-core

阿里云域名SDK库

pip install aliyun-python-sdk-domain

阿里云DNSSDK库

pip install aliyun-python-sdk-alidns

设计思路

  • 获取阿里云的accessKeyId和accessSecret

  • 获取外网ip

  • 判断外网ip是否与之前一致

  • 外网ip不一致时,新增或者更新域名解析记录

实现方案

这里,我直接给出完整的Python代码,小伙伴们自行替换AccessKey和AccessSecret。

#!/usr/bin/env python
#coding=utf-8# 加载核心SDK
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException# 加载获取 、 新增、 更新、 删除接口
from aliyunsdkalidns.request.v20150109 import DescribeSubDomainRecordsRequest, AddDomainRecordRequest, UpdateDomainRecordRequest, DeleteDomainRecordRequest# 加载内置模块
import json,urllib# AccessKey 和 Secret  建议使用 RAM 子账户的 KEY 和 SECRET 增加安全性
ID = 'xxxxxxx'
SECRET = 'xxxxxx'# 地区节点 可选地区取决于你的阿里云帐号等级,普通用户只有四个,分别是杭州、上海、深圳、河北,具体参考官网API
regionId = 'cn-hangzhou'# 配置认证信息
client = AcsClient(ID, SECRET, regionId)# 设置主域名
DomainName = 'binghe.com'# 子域名列表  列表参数可根据实际需求增加或减少值
SubDomainList = ['a', 'b', 'c']# 获取外网IP   三个地址返回的ip地址格式各不相同,3322 的是最纯净的格式, 备选1为 json格式  备选2 为curl方式获取  两个备选地址都需要对获取值作进一步处理才能使用
def getIp():# 备选地址:1, http://pv.sohu.com/cityjson?ie=utf-8    2,curl -L tool.lu/ipwith urllib.request.urlopen('http://www.3322.org/dyndns/getip') as response:html = response.read()ip = str(html, encoding='utf-8').replace("\n", "")return ip# 查询记录
def getDomainInfo(SubDomain):request = DescribeSubDomainRecordsRequest.DescribeSubDomainRecordsRequest()request.set_accept_format('json')# 设置要查询的记录类型为 A记录   官网支持A / CNAME / MX / AAAA / TXT / NS / SRV / CAA / URL隐性(显性)转发  如果有需要可将该值配置为参数传入request.set_Type("A")# 指定查记的域名 格式为 'test.binghe.com'request.set_SubDomain(SubDomain)response = client.do_action_with_exception(request)response = str(response, encoding='utf-8')# 将获取到的记录转换成json对象并返回return json.loads(response)# 新增记录 (默认都设置为A记录,通过配置set_Type可设置为其他记录)
def addDomainRecord(client,value,rr,domainname):request = AddDomainRecordRequest.AddDomainRecordRequest()request.set_accept_format('json')# request.set_Priority('1')  # MX 记录时的必选参数request.set_TTL('600')       # 可选值的范围取决于你的阿里云账户等级,免费版为 600 - 86400 单位为秒 request.set_Value(value)     # 新增的 ip 地址request.set_Type('A')        # 记录类型request.set_RR(rr)           # 子域名名称  request.set_DomainName(domainname) #主域名# 获取记录信息,返回信息中包含 TotalCount 字段,表示获取到的记录条数 0 表示没有记录, 其他数字为多少表示有多少条相同记录,正常有记录的值应该为1,如果值大于1则应该检查是不是重复添加了相同的记录response = client.do_action_with_exception(request)response = str(response, encoding='utf-8')relsult = json.loads(response)return relsult# 更新记录
def updateDomainRecord(client,value,rr,record_id):request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()request.set_accept_format('json')# request.set_Priority('1')request.set_TTL('600')request.set_Value(value) # 新的ip地址request.set_Type('A')request.set_RR(rr)request.set_RecordId(record_id)  # 更新记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值response = client.do_action_with_exception(request)response = str(response, encoding='utf-8')return response# 删除记录
def delDomainRecord(client,subdomain):info = getDomainInfo(subdomain)if info['TotalCount'] == 0:print('没有相关的记录信息,删除失败!')elif info["TotalCount"] == 1:print('准备删除记录')request = DeleteDomainRecordRequest.DeleteDomainRecordRequest()request.set_accept_format('json')record_id = info["DomainRecords"]["Record"][0]["RecordId"]request.set_RecordId(record_id) # 删除记录需要指定 record_id ,该字段为记录的唯一标识,可以在获取方法的返回信息中得到该字段的值result = client.do_action_with_exception(request)print('删除成功,返回信息:')print(result)else:# 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误print("存在多个相同子域名解析记录值,请核查后再操作!")# 有记录则更新,没有记录则新增
def setDomainRecord(client,value,rr,domainname):info = getDomainInfo(rr + '.' + domainname)if info['TotalCount'] == 0:print('准备添加新记录')add_result = addDomainRecord(client,value,rr,domainname)print(add_result)elif info["TotalCount"] == 1:print('准备更新已有记录')record_id = info["DomainRecords"]["Record"][0]["RecordId"]cur_ip = getIp()old_ip = info["DomainRecords"]["Record"][0]["Value"]if cur_ip == old_ip:print ("新ip与原ip相同,不更新!")else:update_result = updateDomainRecord(client,value,rr,record_id)print('更新成功,返回信息:')print(update_result)else:# 正常不应该有多条相同的记录,如果存在这种情况,应该手动去网站检查核实是否有操作失误print("存在多个相同子域名解析记录值,请核查删除后再操作!")IP = getIp()# 循环子域名列表进行批量操作
for x in SubDomainList:setDomainRecord(client,IP,x,DomainName)# 删除记录测试
# delDomainRecord(client,'b.jsoner.com')# 新增或更新记录测试
# setDomainRecord(client,'192.168.3.222','a',DomainName)# 获取记录测试
# print (getDomainInfo(DomainName, 'y'))# 批量获取记录测试
# for x in SubDomainList:
#     print (getDomainInfo(DomainName, x))# 获取外网ip地址测试
# print ('(' + getIp() + ')')

Python脚本的功能如下:

  • 获取外网ip地址。

  • 获取域名解析记录。

  • 新增域名解析记录。

  • 更新域名解析记录。

  • 删除域名解析记录 (并不建议将该功能添加在实际脚本中)。

  • 批量操作,如果记录不存在则添加记录,存在则更新记录。

另外,有几点需要特别说明:

  • 建议不要将删除记录添加进实际使用的脚本当中。

  • 相同记录是同一个子域名的多条记录,比如 test.binghe.com。

  • 脚本并没有验证记录类型,所以同一子域名下的不同类型的记录也会认为是相同记录,比如:有两条记录分别是 test.binghe.com  的  A 记录  和 test.binghe.com 的 AAAA 记录,会被认为是两条相同的 test.binghe.com 记录.如果需要判定为不同的记录,小伙伴们可以根据上述Python脚本自行实现。

  • 可以通过判断获取记录返回的 record_id 来实现精确匹配记录。

最后,可以将以上脚本保存为文件之后,通过定时任务,来实现定期自动更新ip地址。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/271448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 及时释放内存_JMM(一):初识Java内存模型

在并发编程中,线程之间的通信是一个很关键的问题,而该问题解决方案主要可分为两大类:消息传递、共享内存。前者有以Erlang语言为代表的Actor模型,而后者中典型的则是Java语言。对于消息传递机制而言,线程之间必须通过发…

电脑维修知识:电脑常见故障维修大全及解决方法

电脑已经成为我们学习生活娱乐必不可少的设备了,用得时间久了难免会遇到小故障,今天我们一起来看下遇到常见的电脑方面的小故障,我们应该如何去自己检测和维修吧。电脑检测故障我们还是要从电脑的几大硬件开始检查起。1、CPU打开机箱查看CPU风…

工程图样中粗实线的用途_图纸天天画,粗实线和细实线的线宽比例是多少?2:1还是3:1?...

点击上方头条号“机械设计一点通”关注我们,每天学习一个机械设计相关知识点我们知道:机械制图中为了表示不同内容,并能分清主次,必须使用不同线型。图线的线型由线宽和线素长度等构成,机械制图中各种线型都有相应宽度…

STM32F4_USART配置及细节描述

Ⅰ、概述 关于USART串口通信,可以说是MCU的标配。不管是在实际项目应用中,还是在开发过程中,它都起着很重要的作用。 在项目应用中我们常常使用UART串口进行通信,根据通信的距离及稳定性,还选择添加RS232、RS485等对UA…

腾讯面试:SaaS多租户,如何设计?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业网易、美团、字节、如阿里、滴滴、极兔、有赞、希音、百度、美团的面试资格,遇到很多很重要的面试题: 多租户设计,如何 技术选型&#xff…

Mac中Finder是什么?怎么打开?

很多人都知道windows系统中的资源管理器,不过不知道什么是finder。finder和资源管理器一样,都是用来管理文件,finder存在于mac统中,那么finder有什么作用呢?下面下班就为大家分享关于mac系统中finder的相关内容。   1、怎么打开…

phpstudy页面不存在_网站的404页面对于SEO的重要作用

随着网站建设的需求和要求越来越多,网站的新形式也逐渐成为人们改版的方向,但是在网站的改版中难免会出现一些小差错,导致网站的运行不顺畅,这很有可能就是网站建设中忘记设计404页面,那么4040页面能给网站带来哪些好处…

计算机系统基础:虚拟存储管理知识笔记

1、虚拟存储管理概念 一个计算机任务只需要部分装入主存便可以启动运行,其余部分留在磁盘上,在需要的时候装入主存,这样可以提高主存空间的利用率。这样该系统所具有的主存容量会比实际主存容量大很多,这样的存储器称为虚拟存储器…

git推送指令配置_git 常用命令

git 简介在实际开发中,会使用git作为版本控制工具来完成团队协作。因此,对基本的git操作指令进行总结是十分有必要的,本文对一些术语或者理论基础,不重新码字,可以参考廖雪峰老师的博文,本文只对命令做归纳…

传统的线性降维方法效果不佳。_机器学习西瓜书简明笔记(11)降维与度量学习...

上篇主要介绍了几种常用的聚类算法,首先从距离度量与性能评估出发,列举了常见的距离计算公式与聚类评价指标,接着分别讨论了K-Means、LVQ、高斯混合聚类、密度聚类以及层次聚类算法。K-Means与LVQ都试图以类簇中心作为原型指导聚类&#xff0…

计算机系统基础:设备管理知识笔记

1、设备管理介绍 设备管理主要包括设备分配、缓冲区管理、实际物理I/O设备操作、通过管理提高设备利用率和方便用户使用的目的。 设备属于计算机系统和外界交互的工具,不要负责计算机和外部的输入/输出工作,通常称为外设。 2、设备分类 2.1 按数据组织分…

灌篮高手微信登录是什么服务器,灌篮高手微信登录版本

这款《灌篮高手》手游游戏是由同名的火爆动漫改写而成的,里边的游戏角色都是有极致的复原和保存,足球运动员特点都是有一定的展现。也有经典的动漫故事情节和每个高等院校足球队的复原。现阶段为大伙儿出示的是灌篮高手微信登录版本,能够和小…

华为发布岳云鹏手机_刚刚,华为发布鸿蒙2.0!手机可用!

不凡的2020年激动人心的时刻终于到来今天下午3时华为开发者大会2020在正式开幕鸿蒙2.0发布!本次大会包含主题演讲、技术论坛、松湖对话、Codelabs、Teach.Hour、互动体验等系列环节,大会将持续3天,众多活动也将于线上同步直播。技术论坛环节在…

Mac下安装jdk8

直接点击dmg文件 安装成功 在终端输入 Java -vesion 提供百度云链接方便大家下载 链接: https://pan.baidu.com/s/1n2SY-61KFb6-c1UcshZt1Q 链接: https://pan.baidu.com/s/1n2SY-61KFb6-c1UcshZt1Q 密码: g0mj

硬件基础:嵌入式物联网系统软硬件基础知识大全

本文主要介绍嵌入式系统的基础知识,涉及嵌入式软件和硬件的方方面面,希望对各位有帮助。嵌入式系统基础1、嵌入式系统的定义(1)定义:以应用为中心,以计算机技术为基础,软硬件可裁剪,…

ctrl z撤销后如何恢复_回收站清空后数据如何恢复?

回收站清空后数据如何恢复?怎么恢复回收站误删除文件?很多人为了电脑的更好运行以及其它的原因,都会定期清理一下桌面的回收站里的文件,有时候会一键清空,可能是想全部删除又或者是想特定删除一些而不小心全清理了&…

jh锂电保护电路_锂电池过充电、过放电、过流及短路保护电路原理及电路图

下图为一个典型的锂离子电池保护电路原理图。该保护回路由两个MOSFET(V1、V2)和一个控制IC(N1)外加一些阻容元件构成。控制IC负责监测 电池电压与回路电流,并控制两个MOSFET的栅极,MOSFET在电路中起开关作用,分别控制着充电回路与放电回路的导…

一个串口接2个设备_重庆市有2个大观镇,一个乡村旅游发达,一个特产柚子

同名的乡镇是很常见的现象,就连一个市里就有很多同名的乡镇,在之前的文章里说过,重庆市有2个临江镇、2个义和镇等。今天继续看看,重庆市内两个同名乡镇——大观镇,一个属于南川区,一个属于梁平区&#xff0…

计算机系统基础:设备管理采用的相关技术知识笔记

1、通道技术 设备管理的通道技术是为了数据传输可以独立于CPU,让CPU从繁琐的I/O工作中解脱出来。设置通道后,CPU、只需要向通道发I/O指令,通道接收到指令后,从主存中取出本次要执行的通道程序并执行,只有完成了I/O任何后才会向CPU…