动态更新阿里云DNS的IP地址
背景
我在家里搭建了个服务,需要通过公网域名解析来访问家里的电脑,但是家里的拨号上网6天一次重拨,6天公网IP就会变化一次,我最开始没办法,就只能6天登陆一次阿里云DNS控制台改一次,但时间一长就觉得很累,于是我就想了一下办法如何让IP地址变化后自己去把阿里云上的DNS地址指向给我更新了。
前提:
地域名称 | 所在城市 | Region ID | 可用区数量 |
---|---|---|---|
华北 1 | 青岛 | cn-qingdao | 2 |
华北 2 | 北京 | cn-beijing | 8 |
华北 3 | 张家口 | cn-zhangjiakou | 2 |
华北 5 | 呼和浩特 | cn-huhehaote | 2 |
华东 1 | 杭州 | cn-hangzhou | 8 |
华东 2 | 上海 | cn-shanghai | 6 |
华南 1 | 深圳 | cn-shenzhen | 5 |
华南 2 | 河源 | cn-heyuan | 2 |
西南 1 | 成都 | cn-chengdu | 2 |
这个Key的作用就是阿里云命令行有了这个Key,可以通过你传的参数直接改你指定的东西。
开始
- 把阿里云命令行放在一个命令行环境变量能访问的地方,我是放在windows目录下的。然后cmd下执行:aliyun configure –mode AK –profile name(随便写个名字),然后会提示你输入AK的ID和密码,最后是区域(区域我写的是北京,代码在页面上有),输入正确的话这里就完了。
- 只要configure成功了,那么aliyun命令行就能操作dns了,执行:aliyun alidns DescribeDomainRecords –DomainName xxx.com (xxx.com就是你的域名),然后看看是不是获取到了你的域名信息。这里面你就能看到你的各种记录的RecordId,这个很重要。RR就是前缀,一会儿也是需要的。
- 我们手动试一试能不能通过aliyun命令行修改DNS记录:aliyun alidns UpdateDomainRecord –RR test Recordid 18608047503392768 –Value 192.168.200.100 ;记住了这个命令中只需要3个参数,你改哪个域名前缀(test.xxx.com),他的RecordId是多少(18608047503392768 这个在上一步中就能看到的),我要把他的IP地址改成什么(192.168.200.100)
自动化
既然我们已知道如何通过命令行来改DNS了,现在我们就能完全自动化来实现公网IP地址检测和修改了。我需要知道的是当前阿里云上test域名指向的IP以及我现在本地互联网公网IP是否一致,如果不一致,那么我执行这个命令去改阿里云DNS的地址,然后反复再去检测。于是通过编写以下python脚本来实现
import requests import time import os import json #下面三种办法都能获取当前计算机的公网IP地址,你可以任选一个 soip=re.findall(r\'\d+.\d+.\d+.\d+\',requests.get("http://txt.go.sohu.com/ip/soip").text)[0] ip138=re.findall(r\'\d+.\d+.\d+.\d+\',requests.get("http://2000019.ip138.com/").text)[0] getip=requests.get(\'http://members.3322.org/dyndns/getip\').text.strip() #下面是在阿里云上获取当前域名指向的IP地址 IPonDNS=json.loads(os.popen(\'aliyun alidns DescribeDomainRecordInfo --RecordId 18522480556404736\').read())[\'Value\'] print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) +" 当前互联网地址是:" + IPonDNS) while 1: try: IPonDNS=json.loads(os.popen(\'aliyun alidns DescribeDomainRecordInfo --RecordId 18522480556404736\').read())[\'Value\'] newIP = str(requests.get(\'http://members.3322.org/dyndns/getip\').text).strip() if (IPonDNS != newIP): print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + \' 公网IP已由\' + IPonDNS + \'变更为\' + newIP) os.system(\'aliyun alidns UpdateDomainRecord --RR test --RecordId 18522480556404736 --Type A --Value \' + newIP) time.sleep(200) except: pass
技术交流群:70539804