背景
我在家里搭建了個服務,需要通過公網域名解析來訪問家里的電腦,但是家里的撥號上網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