文章目录

  • DDNS 是什么
  • 前期准备
  • 第一步:使用腾讯云 DNS 服务
  • 第二步:查看腾讯云的相关接口文档
  • 第三步:获取解析记录的 ID
  • 第四步:获取本地 IP 地址
  • 第五步:通过接口更新解析记录
  • 第六步:定期执行更新任务
  • 总结

DDNS 是什么

DDNS(Dynamic Domain Name Server,动态域名服务)是将用户的动态IP地址映射到一个固定的域名解析服务上
——百度百科

前段时间,我有个需求:家里 NAS 的 IP 不固定,而我需要一个域名,怎么样才能通过域名动态访问这个变化的 IP 呢?查了资料才知道,变化的 IP 和静态的域名作绑定,这就是 DDNS。看起来 DDNS 也不怎么高深。
目前提供 DDNS 服务的厂家非常多,比较注明的像 noip,花生壳 等等,有不少 OpenWRT 的路由器都有集成他们的服务,花生壳甚至有自己的硬件来解决 DDNS 和内网穿透的问题。但是如果要用他们的 DDNS 服务,就意味着需要使用他们的 DNS 服务。
我之前从腾讯云买了一个域名,所以打算直接腾讯云全家桶,直接用腾讯的 DNS 服务。腾讯云虽然没有现成的 DDNS 服务,但是提供了 DNS 解析记录查询、修改的接口,于是我觉得自己写一个小工具来解决 DDNS 的问题。

前期准备

这个文档是针对使用了腾讯云 DNS 服务的用户准备的,当然如果你使用了阿里云,相关的操作就要遵循阿里云的文档了,但是道理其实是相通的。

  • 在腾讯云平台进行注册,网址
  • 生成 API 密钥,会有一个 SecretId 和一个 SecretKey,网址
  • 我用的是 Python,当然你也可以选择别的编程语言

第一步:使用腾讯云 DNS 服务

可以先在平台上手动添加一个域名,并创建一个解析记录,当然也可以通过接口来创建,但是我觉得手动创建一条比接口创建还要快。
链接在这里

第二步:查看腾讯云的相关接口文档

如果想快点看结论,这一步可以跳过,直接进入下一步。
相关说明主要来自于腾讯云的官方文档,大家可以跟着腾讯云的官方教程具体了解

  • 首先是腾讯云的“公共参数”,是每个应用都需要添加的参数。原文链接
  • 其中最麻烦的是 Signature 这个参数的生成,可以参考原文链接,官网中说的还是很清楚的。
  • 我们再来看看两个我们需要用到的接口说明,一个是查询解析记录接口,一个是修改解析记录接口。

第三步:获取解析记录的 ID

我们在第一步中手动添加了域名,并且添加了一条解析记录,这条解析记录会有自己的 ID,我们需要获取这个 ID 才能通过接口来更新它。

import hmac # 用于签名加密,参考第二步中,腾讯 Signature 生成的说明
import base64 # 用于生成 base64 字符串,参考第二步中,腾讯 Signature 生成的说明
from hashlib import sha1 # 签名加密算法,参考第二步中,腾讯 Signature 生成的说明
from urllib.parse import urlencode, quote # url 编码相关操作,参考第二步中,腾讯 Signature 生成的说明
from urllib import request # 网络请求
from datetime import datetime # 用于公共参数中时间戳的生成
import json# 生成时间戳
ts = str(int(datetime.timestamp(datetime.now())))# 填写你自己的 Id、Key 和域名
secretId = 'AKIDixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
secretKey = 'ZLs9rxxxxxxxxxxxxxxxxxxxxxxxxxxx'
domain = 'abc.com'
subdomian = 'www'# 请求地址和参数
baseUrl = 'cns.api.qcloud.com/v2/index.php?'
para = {'Action': 'RecordList','Nonce': '18357','SecretId': secretId,'Timestamp': ts,'domain': domain, 'subDomain': subdomain
}# 签名使用的原始字符串
sigSrcStr = 'GET' + baseUrl + urlencode(para)
# 经过签名加密和
para['Signature'] = base64.b64encode(hmac.new(secretKey.encode('utf-8'), sigSrcStr.encode('utf-8'), digestmod=sha1).digest())url = 'https://' + baseUrl + urlencode(para, safe='')response = request.urlopen(url).read().decode('utf-8')
result = json.loads(response)
print(result['data']['records'][0]['id'])

结果形如 555xxxxxx,这一步只要做一次,查询到这个 ID 即可

第四步:获取本地 IP 地址

通过 Python 获取外网 IP 地址,其实有两个思路:

  • 比较简单的方案使用一些 IP 查询的服务,但这个方法比较慢
  • 比较快的方案是直接查询本机的网卡,这里我默认需要有公网 IP,否则是需要先搞定内网穿透的

第一种方案两行代码就能搞定

from urllib import request
IP = request.urlopen("https://api.ipify.org").read().decode('utf8')

第二种方法可以使用 Popen,相当于在命令行使用 ip aifconfig 的方法来查询;或者使用 Python 提供的 socket 服务。这篇文章 有非常详细的说明,代码是从 StackOverflow 上撸的

import socket
import fcntl
import structdef get_ip_address(ifname):s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)return socket.inet_ntoa(fcntl.ioctl(s.fileno(),0x8915,struct.pack('256s', ifname[:15]))[20:24])IP = get_ip_address('eth0') # 这里的 eth0 需要改成你自己的外网网卡名,例如 ppp0、en0

第五步:通过接口更新解析记录

通过

  • 本机的 IP
  • 腾讯云解析记录 ID

我们就可以通过腾讯云提供的接口来更新解析记录了。

import hmac
import base64
from hashlib import sha1
from urllib.parse import urlencode, quote
from urllib import request
from datetime import datetime
import socket
import jsondef update_dns(IP):ts = str(int(datetime.timestamp(datetime.now())))# 填写你自己的 Id、Key 和域名secretId = 'AKIDixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'secretKey = 'ZLs9rxxxxxxxxxxxxxxxxxxxxxxxxxxx'domain = 'abc.com'subDomian = 'www'baseUrl = 'cns.api.qcloud.com/v2/index.php?'# 请求的参数para = {'Action': 'RecordModify','Nonce': '18358','SecretId': secretId,'Timestamp': ts,'domain': domain,'recordId': '555xxxxxx','recordLine': '默认','recordType': 'A', # "A","CNAME","MX","TXT","NS","AAAA","SRV"'subDomain': subDomain,'value': IP}sigSrcList = []# urlencode 会对中文进行编码,导致验证失败,因此这里手动组装签名原始字符串for k in para.keys():sigSrcList.append(k + '=' + para[k])sigSrcStr = 'GET' + baseUrl + '&'.join(sigSrcList)para['Signature'] = base64.b64encode(hmac.new(secretKey.encode('utf-8'), sigSrcStr.encode('utf-8'), digestmod=sha1).digest())url = 'https://' + baseUrl + urlencode(para, safe='')response = request.urlopen(url)print(response.read())update_dns(IP)

第六步:定期执行更新任务

以上是腾讯 DDNS 服务的基本思路,你还可以增加一些额外的判断,例如 IP 不变时,不对记录进行更新。
定期执行更新任务,不同系统提供的服务可能不同。在 Linux 和 Mac 上可以使用 crond 服务。
你需要通过 crontab 对定期任务进行编辑,可以参考这篇教程。

总结

以上针对腾讯云的 DDNS 服务搭建提供了一个思路和方法,希望对大家有所帮助

参考文档

1 详解 Python 获取网卡 IP 地址 https://www.cnblogs.com/my_life/articles/9187714.html
2 Linux crontab 命令 https://www.runoob.com/linux/linux-comm-crontab.html

腾讯云 DDNS 方案相关推荐

  1. 群晖设置腾讯云ddns显示认证失败的两种解决办法【实测第二种成功了】

    群晖腾讯云ddns显示认证失败 背景: 问题: 前提条件 解决办法一:群晖自带的ddns解析 步骤1:获取 API 密钥信息 步骤2:群晖(Synology)NAS 配置 DDNS 解决办法二:利用D ...

  2. OpenWrt安装腾讯云DDNS插件

    1.插件介绍 OpenWRT TencentDDNS插件是一款腾讯云研发的,自动映射动态公网IP至用户指定的DNSPod域名解析记录的官方插件. 标题 名称 中文名称 腾讯云DDNS插件 英文名称 l ...

  3. 家庭宽带 动态公网IP,使用腾讯云DDNS实现实时更新DNS解析记录

    解决DDNS问题 动态公网IP 环境说明: 我是家庭宽带 只能申请到动态的公网ip,好处是不花钱,弊端是每次重启光猫,都会重新获取一个新的公网IP 为解决此办法,我尝试了很多个DDNS的方案. 包括但 ...

  4. 【基础问题】微信小程序 - 腾讯云 - 一站式方案 - PHP - wafer 和 wafer2的区别和wafer2的实践

    前言: 项目目前选择了腾讯小程序一站式部署,反而有点懵了,服务器怎么配置呢?好像接口没有,查询后,发现有的Demo有服务器配置有的没有,折腾观察了一会,原来有两个版本wafer.我把关键的地方高亮了, ...

  5. 腾讯云SOC方案入选CIC工信安全优秀解决方案

    近日,国家工业信息安全发展研究中心(CIC工信安全)公布了第二届信息技术应用创新安全优秀解决方案. 腾讯"云原生安全Cloud SOC智能安全检测响应预测全局态势感知解决方案 "( ...

  6. 入围教育装备展“金奖产品”,升腾威讯云学区做真正教育桌面云

    教育桌面云化是大势所趋 云计算随时随地便捷访问的特性,有助于教育资源共享的落地,促进教育信息化的实现. 2014年至今,教育行业桌面云化趋势越演越烈,已形成大规模应用,目前教育桌面云方案形态有三大类: ...

  7. 阿里云oss数据迁移到腾讯云cos 方法二(强烈推荐)

    迁移工具使用方法 迁移工具支持将S3, OSS, Qiniu,文件列表等文件迁移到COS对象存储.工具只支持在 linux/macos 下运行,系统自带的Python版本在2.6以上. 系统依赖 工具 ...

  8. 全球企业KVM开源贡献榜发布,腾讯云、华为、阿里巴巴等入围

    9月16日晚,在全球虚拟化顶级技术峰会 KVM Forum 上,2021年度全球企业 KVM 开源贡献榜正式发布,华为.腾讯云.阿里巴巴等中国公司纷纷入围.其中,腾讯云更是连续第五年入围,成为唯一取得 ...

  9. 释放技术的想象-解码腾讯云软件架构与应用

    欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 关于腾讯 你可能玩过"王者荣耀" 你可能用过"微信"和它的"小程序" 你可能看过& ...

  10. AI资讯 | 人工质检太“繁”了?腾讯云让AI成为工业生产的守门员

    腾讯云化繁为简 基于腾讯云AI技术能力的工业质检仪: 1)增效:仅需几秒就能完成对目标零件360度无死角的采图.分析.分类的工作,而原来人工质检则需要大概一分钟,相对人工质检速度提升10倍. 2)提质 ...

最新文章

  1. 科研实习 | 约翰霍普金斯大学Alan Yuille教授招收计算机视觉暑期科研实习生
  2. 7-28 超市贴花 (5 分)
  3. KVM脚本批量添加删除虚拟机
  4. 【英语学习】4000 Words 【V1】【U02】The Laboratory
  5. utilities——比较与排序规则(C++)
  6. pymssql的简单使用
  7. MIPI DSI的linux kernel驱动原理 | 基于RK3399
  8. ASCII码表和常见键盘码
  9. Interval数据类型
  10. 【基础】什么是网关以及网关作用
  11. vi与gedit的区别
  12. 迁移C盘到SSD硬盘后启动系统黑屏只有鼠标
  13. 成都java培训,尽在传智播客成都中心
  14. python使用BeautifulSoup爬取2345电影网
  15. 3分钟掌握自给IP地址
  16. 搜索引擎优化(SEO),通向成功十步
  17. 测视力距离5米还是3米_3米视力表,5米视力表和3米的有什么不同吗?得出来的结果有什......
  18. 2018年世界科技发展回顾
  19. mmdetection报错:ImportError: /home/user/repos/mmdetection/mmdet/ops/dcn/deform_conv_cuda.cpython-37m-x
  20. 循循善诱,幽默风趣,弦歌不辍,润物无声---AP计算机惊喜的逆袭之路

热门文章

  1. 计算机visio流程图,系统流程图和Visio
  2. 23Exchange Server 2010跨站点部署-公网邮箱系统配置及公网记录
  3. 【Python数据分析-8】:Numpy常用操作-arange函数、linspace函数与运算
  4. mysql省市县表设计_表设计(省市县)
  5. ANSYS 有限元分析 接触分析
  6. Java-前后端分离-单点登录(SSO二级跨域和跨一级域名)
  7. 原型图与Axure基础
  8. iis访问服务器文件夹权限设置,Windows中合理设置共享文件夹访问权限
  9. 虚拟机VirtualBox中Ubuntu和windows共享文件夹访问权限问题
  10. msvcr71.dll等dll丢失的解决方法