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