一般家庭网络的公网IP都是不固定的,而我又想通过域名来访问自己服务器上的应用,也就是说:需要通过将域名绑定到动态IP上来实现这个需求。

一般家庭网络的公网IP都是不固定的,而我又想通过域名来访问自己服务器上的应用,也就是说:需要通过将域名绑定到动态IP上来实现这个需求。于是乎,我开始探索实现的技术方案。

通过在网上查阅一系列的资料后,发现阿里云可以做到实现动态域名解析DDNS。于是乎,一顿操作下来,我实现了域名绑定动态IP。这里,我们以Python为例实现。

好了,说干就干,我们开始吧,走起~~

阿里云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地址。

域名绑定动态IP实战案例相关推荐

  1. 域名绑定动态IP最佳实践

    大家好,我是冰河~~ 一般家庭网络的公网IP都是不固定的,而我又想通过域名来访问自己服务器上的应用,也就是说:需要通过将域名绑定到动态IP上来实现这个需求.于是乎,我开始探索实现的技术方案. 通过在网 ...

  2. python实现阿里云域名绑定动态IP

    一般家庭网络的公网IP都是不固定的,而我又想通过域名来访问自己服务器上的应用,也就是说:需要通过将域名绑定到动态IP上来实现这个需求.于是乎,我开始探索实现的技术方案.通过在网上查阅一系列的资料后,发 ...

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

    写在前面 一般家庭网络的公网IP都是不固定的,而我又想通过域名来访问自己服务器上的应用,也就是说:需要通过将域名绑定到动态IP上来实现这个需求.于是乎,我开始探索实现的技术方案.通过在网上查阅一系列的 ...

  4. 将域名绑定到ip上,并实现访问不同二级子域名对应不同目录

    一.将域名绑定到ip上 1.环境介绍:阿里云服务器ESC(美国硅谷) 2.购买域名 3.备案 注:由于我买的是美国地区服务器,所以不用备案,如果买的国内服务器,这里需要添加一个备案操作. 4.域名实名 ...

  5. 一文搞懂常用的网络概念:域名、动态IP、DNS、DDNS

    人呐,眼光放得长远一些,看到的东西也会多一些,生活也就会过得更有意义一点. 本文已被https://yourbatman.cn收录:女娲Knife-Initializr工程可公开访问啦:程序员专用网盘 ...

  6. 服务器域名绑定公网IP地址

    阿里云服务器进行域名与公网IP的绑定,首先选择域名选项 点击解析: 点击添加纪录: 添加两条记录: 配置完成以后可以坐下测试: 成功解析.配置完成以后,可能并不会马上就可以访问,大概是有延时,配置好以 ...

  7. 更改阿里云域名解析台里某个域名绑定的IP之后不能解析到新IP

    1.由于要撤销一组负载均衡,所以需要更改阿里云域名解析台里某个域名由原来绑定的负载均衡公网IP换到服务器公网IP 2.在服务器上nginx指定了域名访问,开启nginx服务 3.暂时关闭该组负载均衡服 ...

  8. 一篇文章教你正确解锁 代理ip 的使用方式,包含两个实战案例

    前言 一.代理ip 1.1 代理ip简介 1.2 代理ip分类 1.3 代理ip的优点 1.4 代理ip的必要性 二.选择合适的平台 2.1 IPIDEA 介绍 2.2 IPIDEA 应用场景 2.3 ...

  9. 新浪SAE开放独立域名绑定功能

    自从半年前写了一篇关于新浪SAE(Sina App Engine)的文章以后,周良就再也没有登入过它了.今天心血来潮进去折腾了一些应用,结果发现Sina App Engine已经可以绑定独立域名了! ...

最新文章

  1. Microbiome:南京农大团队在粘细菌捕食的生态学功能方面取得重要进展
  2. 用WPS表格轻松设计工资条
  3. 工控攻防演示——从外网到内网控制系统设备的入侵
  4. 阿里云云计算服务 备案期间服务器免费
  5. 如何计算MP3总时长的问题(二)
  6. 【通知】深度学习之模型设计书籍勘误汇总!附赠资源和代码开源问题
  7. 深度神经网络的反向传播算法数学推导
  8. JVM调优系列:(二)JVM运行时数据区域
  9. mysql 压力测试知乎_MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0
  10. java查看 被应用_java – 如何查看应用程序正在使用的当前堆大小?
  11. win10 python免安装_使用Python编写免安装运行时、以Windows后台服务形式运行的WEB服务器...
  12. Android中你可能忽略的知识点(1)-分辨率那些事
  13. 【Tensorflow深度学习】Tensorflow2.0GPU版极简安装
  14. Scrapy爬取美女图片第四集 突破反爬虫(上)
  15. oracle中对于TableSpace理解
  16. VASP学习笔记--简单的VASP运行实例:CrI3做非磁的优化
  17. 基于JAVA的SM4文件加密解密,可以直接使用
  18. 2006年9月15日
  19. edge如何导入html文件收藏夹,Edge浏览器如何导入导出收藏夹(目录位置)
  20. Steam账号被盗后,账号找回,PUBG解封经验分享

热门文章

  1. docker中的Volume
  2. ethos-专用系统 升级公告!
  3. python井号键怎么打_#井号键#——你怎么念?
  4. Zabbix监控平台安装教程,Zabbix入门教程
  5. 2023华为od统一考试B卷【经典屏保】C语言 实现
  6. android应用教程试题,ANDROID应用开发试题
  7. uniapp 手机号码登录验证
  8. c语言 ascii 和 压缩bcd 码之间的相互转换
  9. 学生管理系统(链表+数据库)学习小结
  10. L部署lvs+keepalived实现负载均衡