動態更新阿里雲DNS的IP地址


背景

    我在家里搭建了個服務,需要通過公網域名解析來訪問家里的電腦,但是家里的撥號上網6天一次重撥,6天公網IP就會變化一次,我最開始沒辦法,就只能6天登陸一次阿里雲DNS控制台改一次,但時間一長就覺得很累,於是我就想了一下辦法如何讓IP地址變化后自己去把阿里雲上的DNS地址指向給我更新了。 

前提:

  • 你的DNS必須是在阿里申請的,也就是有阿里的DNS地址
  • 登陸阿里雲DNS控制台,打開申請並下載你的AccessKey
  • 下載阿里雲命令行工具
  • 用法說明以及區域代碼幫助
地域名稱 所在城市 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM