Python实现阿里云动态域名解析

摘要:前段时间买了个树莓派,打电信客服开通了外网ip,相当于在家里搭了一个云服务器。今天有时间记录一下当时的搭建过程。

开通外网IP地址

我家用的电信宽带,拨打电话10000,找人工客服,就说开通外网IP业务,等待办理成功即可。

办理成功后,便可通过外网IP访问到你的天翼网关。(注意:80、443端口会被屏蔽,其它端口可以正常使用。)

再到阿里云配置一下域名解析,即可通过域名访问。操作方法见文档

天翼网关端口映射

输入超级管理员的账号密码,注意不是普通用户的账户密码。

如果没改过的话,账号:telecomadmin 密码:nE7jA%5m

如果密码不对,那就只能问电信工作人员了。

登录成功之后,进入【应用】-【高级NAT配置】-【虚拟服务器设置】,添加端口映射规则。即将你外网ip的端口映射到内网ip的端口。

这里两种情况:

  1. 如果家里装了路由器,所有设备(手机、电脑、树莓派)都是连的路由器,这里就映射到路由器的IP,然后再在路由器设置一次端口映射。

  2. 如果家里没装路由器,设备直接连接的天翼网关,那么这里就直接映射设备的ip。注意这里要给设备设置为固定ip地址。

路由器设置IP与MAC绑定

路由器端口转发

最终转发效果

graph LR
用户 --> http://domain.com:10000 --> 天翼网关10000端口 --> TPLink路由器10000端口 --> 树莓派80端口

动态域名解析(DDNS)

这一套搞好之后,刚开始用着还比较舒服,用了一段时间后,问题暴露出来了。电信的外网IP是不固定的,隔一段时间就会变。虽然我可以上阿里云控制台,去修改域名对应的ip地址,但是手动去改是很烦的。能不能实现自动修改呢?答案是肯定的。

阿里云提供了修改域名解析的APISDK。我们可以根据这些自己写程序来实现动态域名解析。

思路大概就是,定时(每隔15分钟)查询一下当前的外网IP,看是否发生了变化,如果变化了,则调用阿里云API修改域名解析。

废话少说,python代码如下,只需加入系统定时任务即可。

1
2
3
4
root@raspberrypi:~ # crontab -e

# 每隔15分钟检查一次公网ip是否发生变化
0,15,30,45 * * * * /opt/alidns/main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
#!/usr/bin/env python
#-*- coding: utf-8 -*-

import os
import json
import logging
from urllib2 import urlopen
from aliyunsdkcore.client import AcsClient
from aliyunsdkcore.acs_exception.exceptions import ClientException
from aliyunsdkcore.acs_exception.exceptions import ServerException
from aliyunsdkalidns.request.v20150109 import DescribeDomainRecordsRequest
from aliyunsdkalidns.request.v20150109 import UpdateDomainRecordRequest
import sys

reload(sys)
sys.setdefaultencoding('utf8')

logging.basicConfig(level=logging.INFO,format = '%(asctime)s - %(name)s - %(levelname)s - %(message)s',filename='/opt/alidns/log/alidns.log')

class DnsHandler:
# 从阿里云开发者后台获取Access_Key_Id和Access_Key_Secret
access_key_id = " "
access_key_secret = " "

# 填入自己的域名
domain_name = "domain.com"
# 填入二级域名的RR值
rr_keyword = "test"

# 解析记录类型,一般为A记录
record_type = "A"

# 用于储存解析记录的文件名
file_name = "/opt/alidns/ip_addr.txt"

client = None
record = None
current_ip = ''

# 初始化,获取client实例
def __init__(self):
self.client = AcsClient(
self.access_key_id,
self.access_key_secret
)
self.record = self.get_record()
self.current_ip = self.get_current_ip()

# 如果公网IP发生变化,则自动修改阿里云解析记录
def reset(self):
if self.current_ip <> self.get_record_value():
self.update_record(self.current_ip)
else:
logging.info('ip 地址未发生变化:' + self.current_ip)

# 获取阿里云域名解析完整记录,并使用文件缓存
def get_record(self):
if os.path.isfile(self.file_name) :
file_handler = open(self.file_name, 'r')
r = file_handler.read()
file_handler.close()
else :
request = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
request.set_PageSize(10)
request.set_action_name("DescribeDomainRecords")
request.set_DomainName(self.domain_name)
request.set_RRKeyWord(self.rr_keyword)
request.set_TypeKeyWord(self.record_type)
r = self.client.do_action_with_exception(request)
file_handler = open(self.file_name, 'w')
file_handler.write(r)
file_handler.close()
return json.loads(r)

# 获取阿里云域名解析记录ID
def get_record_id(self) :
return self.record["DomainRecords"]["Record"][0]["RecordId"]

# 获取当前域名解析记录
def get_record_value(self) :
return self.record["DomainRecords"]["Record"][0]["Value"]

# 修改阿里云解析记录
def update_record(self, value):
request = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
request.set_action_name("UpdateDomainRecord")
request.set_RecordId(self.get_record_id())
request.set_Type(self.record_type)
request.set_RR(self.rr_keyword)
request.set_Value(value)
self.client.do_action_with_exception(request)
os.remove(self.file_name)
logging.info('ip地址变化,更新DNS解析:' + value);

# 获取当前公网IP
def get_current_ip(self):
currentip = json.load(urlopen('https://ipv4.jsonip.com'))['ip']
logging.debug('currentip:' + currentip)
return currentip

# 实例化类并启动更新程序
dns = DnsHandler()
dns.reset()

0%

相关内容推荐

人生四行小睿贷款测算go函数单位矩阵e义j4669低功耗蓝牙芯片actb上海八大堰苗助长的故事9xxxxx连词的作用线性代数难学吗模态判断sneeredebo是什么意思上滑音记号科来官网ket单词c盘红了怎么办虚短虚断怎么用2429字符串变数组模拟游戏8338宠物连连看单机版晚上那点事洛必达法则条件文件系统有哪些一一v抖音解析网站黄色在线电影网站电感阻抗1ge阶乘英语打鱼游戏单机版iumpmove指令一一vcan是什么1i164是2的几次方玻尔半径二维码安全检测tan反函数12的二进制rbs序列连续不可导函数pa是什么元素服装英文单词非标债av07不吝赐教用法误区法语不定冠词曹蕤置信区间表2431xxxmonpench半导体图片邢朝阳五大洲英文羊角士蛋白质亚基为由mlll人工鸡蛋制作视频罗技鼠标配对软件地图怎么看经纬度迫切需要广告的目的未税金额综述英语高洪岩ipop下载水杉平台字工场jmirc语言计算量化噪声建超15m我目前的位置怎么表示人脸识别英语物理管理学分绩点计算器edt是什么时间求操的话或非门真值表agnt代尔塔公式可见光的频率6厘米是多少寸hjp裸机是什么渗透现象名词解释米酷视频3o2strow领导的定义一项作业防水英文线缺陷杨东杰压缩包官网鼠标自动点击脚本比特是什么意思博流智能ipd开发流程二级等保要求实时气压查询异常什么意思outmatch刃位错编码的英文框架箱图片阿尔法希腊字母正态分布的方差logo生产内部一致性网络权限微积分计算公式免费音乐软件下载瓶瓶罐罐的意思脂环pfsa外企职位一览表反三角函数定义赵客国产久久操槽码东京国立竞技场sjjs热门榜ps魔棒工具抠图minifs金刚经注释及译文怎么看屏幕刷新率思科市值极限的计算基础电路除法的本质准星代码一夸脱等于多少升我非常喜欢它知识库管理工具三角定理七日杀英文企业治理结构直角三角形重心跌水图片hdr技术微积分求面积秘鲁和中国时差鲨鱼一站式零售wms几何级数求和公式维语再见怎么说小于等于的符号杨宇辰袁仁广一封信的封10600大写bi前缀pk文件每日天气提示hamber什么叫矢量二进制转化十进制找本地工作转动惯量定义图灵简介几何分布公式蓝泡加速器曾坚阳小菲菲图片uni前缀快捷方式下载熔断器的工作原理中键是哪个键huir矛盾双方同归于尽cz314迫敛性定理基从5107超高校级的侦探有道词典离线质量七大工具零部件是什么意思老舍名字的由来两圆一中垂定期调度资源分类有界一定连续吗暂停静音三带天眼天气预报

合作伙伴

冲顶技术团队

top1.urkeji.com
idc.urkeji.com
zz.urkeji.com
qiansan.seo5951.com
www.8830000.cn
www.urkeji.com
www.kmpower.cn
seo.07yue.com
www.clhczx.cn
qiansan.seo5951.com
www.mtcddc.cn
www.china185.com
zz.urkeji.com
www.haowangjiao.cc
www.china185.com
www.bbswimming.cn
baidu.07yue.com
www.akz.net.cn
www.ddtxly.cn
www.chaoshanxing.com