藉助Dnspod API定時更新域名解析獲取樹莓派公網IP
之前寫了教程通過發郵件方式獲取樹莓派公網IP地址,雖然可以解決問題,但是每天收到一大堆郵件,而且每次都要通過IP地址進行訪問,實在不是一個好的解決方案。
經過大家的留言提醒,告知可以藉助DNSPOD的API來更新域名解析,實現DDNS。
如何做呢?
創建Token
登錄Dnspod賬戶:https://www.dnspod.cn/console/dashboard
沒有賬號的可以註冊一個,順便買個域名使用Dnspod解析吧,相當不錯。
網上很多教程都是使用用戶名和密碼來訪問Dnspod API,這個感覺不太安全,建議使用token方式訪問。
點擊用戶中心->安全設置->API Token->創建API Token
注意存儲保存,因為只顯示一次。重點記住ID和Token兩個值,因為後續使用的登錄Token需要由這兩個數字使用英文逗號組合而成。
創建A記錄域名解析
在你的Dnspod解析的某個域名里添加一個子域名(新買個獨立域名也行),如下圖所示:
創建一個A記錄,主機名使用一個你喜歡而且不與其他子域名衝突的,這裡我使用了ddns,記錄值可以隨便寫(如何8.8.8.8),因為後續會不斷通過API改變。
域名解析更新Python代碼
為了實現獲取公網IP地址並更新到Dnspod剛才創建的A記錄中,需要寫如下代碼:
#!/usr/bin/env python2nn# -*- coding:utf-8 -*-nnnnimport httplibnnimport urllibnnimport socketnnimport timennnnID = "xxx" # 替換成上面你創建Token時獲取的ID。nnToken = "xxx" # 替換成上面你創建的Token。nnnnparams = dict(nn login_token=("%s,%s" % (ID, Token)),nn format="json",nn domain_id=xxx, # 換成你的domian_id,待會下面講如何通過Domain.List API獲取nn record_id=xxx, # 換成你的record_id,待會下面講如何通過Record.List API獲取nn sub_domain="xxx", # 換成你上面創建的子域名nn record_line="默認", #nn)nncurrent_ip = Nonennnnnndef ddns(ip):nn params.update(dict(value=ip))nn headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}nn conn = httplib.HTTPSConnection("dnsapi.cn")nn conn.request("POST", "/Record.Ddns", urllib.urlencode(params), headers)nnnn response = conn.getresponse()nn print response.status, response.reasonnn data = response.read()nn print datann conn.close()nn return response.status == 200nnnnnndef getip():nn sock = socket.create_connection((ns1.dnspod.net, 6666), 20)nn ip = sock.recv(16)nn sock.close()nn return ipnnnnif __name__ == __main__:nn while True:nn try:nn ip = getip()nn print ipnn if current_ip != ip:nn if ddns(ip):nn current_ip = ipnn except Exception as e:nn print enn passnn time.sleep(30)n
如何獲取你的domian_id
參考DNSPOD API說明:https://www.dnspod.cn/docs/domains.html#domain-list
在Terminal中輸入以下命令即可獲取你的所有域名列表和domain_id信息,從結果中找到你設置了A記錄解析的那個域名,記錄下domain_id
curl -X POST https://dnsapi.cn/Domain.List -d 『login_token=LOGIN_TOKEN&format=json』
注意:LOGIN_TOKEN是由ID和Token加英文逗號組合而成,即 LOGIN_TOKEN = 」ID,Token「
如何獲取你的record_id
參考DNSPOD API說明:https://www.dnspod.cn/docs/records.html#record-list
在Terminal中輸入以下命令即可獲取所有的record_id信息,從結果中找到你新添加的那個子域名的record_id。
curl -X POST https://dnsapi.cn/Record.List -d 『login_token=LOGIN_TOKEN&format=json&domain_id=xxx』
注意:domain_id就是上面你獲取到的domain_id,LOGIN_TOKEN是由ID和Token加英文逗號組合而成,即 LOGIN_TOKEN = 」ID,Token「
如何定時更新域名解析?
把上面的域名解析Python代碼存下來,我命名為ddns.py,放在/home/pi/ddns/目錄下(或者你放到其他位置)
然後在終端運行:
sudo crontab -e
然後增加以下代碼:
/30 * python /home/pi/ddns/ddns.py >> /home/pi/ddns/ddns.log 2>&1
意思是每隔30分鐘運行一次,以便更新DNS記錄。
完成
以後就可以使用自己的子域名訪問到樹莓派了,再也不用查看郵件里的IP地址了。
ssh pi@ddns.xxx.com
甚至你可以藉助Ngnix或Apache在樹莓派上搭建一個小網站讓大家訪問。(因為80和8080埠被聯通封了,需要反向代理解析80埠)
推薦閱讀:
※DNS域名解析解剖
※Cobalt Strike的特殊功能(external_C2)探究
TAG:树莓派RaspberryPi | 极客Geek | DNS |