10.1動(dòng)態(tài)域名——GoDaddyDDNS

一、GoDaddy

首先我們需要在GoDaddy上面購(gòu)買一個(gè)域名,有些域名很貴,有些很便宜,我們盡量買一些便宜的域名,并且一年一換,可以降低成本。


在搜索框輸入你想要的域名關(guān)鍵字就可以看到價(jià)格了

隨便買一個(gè)域名,之后進(jìn)入到管理頁(yè)面。然后點(diǎn)擊DNS。


直接選擇DNS

DNS

可以看到,記錄的第一行,類型A代表IPv4,值代表著要解析到哪個(gè)IP地址,在路由器中查看你的公網(wǎng)IP,然后把IP填進(jìn)去就可以了,這樣這個(gè)域名就會(huì)解析到你的IP上來。

大部分運(yùn)營(yíng)商都會(huì)封鎖80和443端口,所以在路由器里進(jìn)行端口轉(zhuǎn)發(fā)的時(shí)候要把內(nèi)部的80端口轉(zhuǎn)發(fā)到別的端口上,例如81、8888。然后用域名:轉(zhuǎn)發(fā)后端口號(hào)訪問。

二、GoDaddyDNSAPI

前面說過了,我們的IP并不是固定的,那么我們就需要DDNS了,GoDaddy給用戶提供了一套API可以用它來修改DNS解析,我們通過Python程序來獲取到我們當(dāng)前的IP,然后鏈接上GoDaddy網(wǎng)站來讓程序幫我們修改DNS指向的IP,之后通過定時(shí)任務(wù),讓程序2小時(shí)運(yùn)行一次,發(fā)現(xiàn)IP變動(dòng)就幫我們修改DNS,以此來實(shí)現(xiàn)DDNS。

Python是參考了進(jìn)行了修改,增加了檢測(cè)功能和日志輸出。

也可以看看這個(gè)開源的GodaddyDDNS python程序:https://github.com/anshengme/ddns

首先,要申請(qǐng)一個(gè)API KEY用來在程序修改DNS解析的時(shí)候來認(rèn)證我們自己身份。
https://developer.godaddy.com/keys/

申請(qǐng)界面

Name那一欄里寫上NASDDNS,直接點(diǎn)Next,接下來會(huì)有個(gè)頁(yè)面顯示key和secret,secret只會(huì)在這里顯示一次,之后便無法查看,所以建議牢記。

那么接下來就需要編寫Python程序來實(shí)現(xiàn)DDNS了,過程比較復(fù)雜,有興趣的朋友可以看我貼出來的源碼,然后直接在桌面新建一個(gè)TXT,把代碼復(fù)制粘貼進(jìn)去,然后把后綴名改成py即可。

源碼也進(jìn)行了參考,但是實(shí)在找不到那個(gè)參考的網(wǎng)址了。。。

#!/usr/bin/python

import configparser
import json
from urllib.request import urlopen
import datetime

import requests


class DDNS():
    def __init__(self):
        self.GetIP()
        self.GetINI('ddns.ini')

    def GetIP(self):
        ipconf = urlopen('http://ip.42.pl/raw').read()
        self.NowIP = ipconf.decode(encoding='UTF-8', errors='strict')

    def GetINI(self, filename):
        conf = configparser.ConfigParser()
        conf.read(filename)
        sections = conf.sections()
        self.domain = sections[0]
        items = conf.items(self.domain)
        i, self.ip = items[0]
        i, self.key = items[1]
        i, self.url = items[2]
        if self.NowIP != self.ip:
            text = ' ip檢測(cè)到變更!當(dāng)前時(shí)間ip:'+self.NowIP+' 配置文件ip:'+self.ip
            self.WirteLog(text)
            conf.set(self.domain, 'ip', self.NowIP)
            conf.write(open(filename, 'r+'))
            self.UpdateDNS()
            if self.code == 200:
                text = ' 域名'+self.domain+'已解析至'+self.NowIP
                self.WirteLog(text)
            else:
                text = ' 錯(cuò)誤!返回錯(cuò)誤代碼:'+self.code
        else:
            text = ' ip未檢測(cè)到變更!當(dāng)前時(shí)間ip:'+self.NowIP+' 配置文件ip:'+self.ip
            self.WirteLog(text)

    def UpdateDNS(self):
        records = {
            # 修改的域名
            "data": self.NowIP,
            # 指向方式
            "name": "@",
            # 指向端口
            "port": 80,
            # ttl時(shí)間,最小600
            "ttl": 600,
            # 指向形式
            "type": "A"
        }
        # 請(qǐng)求頭
        head = {
            'accept': 'application/json',
            'Content-Type': 'application/json',
            # 需要改為自己的key和pd
            'Authorization': self.key
        }

        # 官方的默認(rèn)dns信息,統(tǒng)一的,如果不帶上,會(huì)返回422錯(cuò)誤
        records_NS01 = {
            "data": "ns07.domaincontrol.com",
            "name": "@",
            "ttl": 3600,
            "type": "NS"
        }
        records_NS02 = {
            "data": "ns08.domaincontrol.com",
            "name": "@",
            "ttl": 3600,
            "type": "NS"
        }

        # 組件發(fā)送信息,信息要轉(zhuǎn)成json形式,可以在發(fā)送轉(zhuǎn)也可以生成的時(shí)候轉(zhuǎn),我直接在生成數(shù)據(jù)轉(zhuǎn)了
        put_data = json.dumps([records, records_NS01, records_NS02])

        # 請(qǐng)求的url,根據(jù)自己的域名變更范例的url
        req = requests.put(self.url, headers=head, data=put_data)
        self.code = req.status_code

    def WirteLog(self, logtext):
        time = datetime.datetime.now()
        time = str(time)
        with open('log.txt', 'a+') as log:
            log.write(time+logtext+'\n')


if __name__ == "__main__":
    DDNS()

之后我們?cè)傩陆ㄒ粋€(gè)ini文件,命名為:ddns.ini,格式如下:

[yourdomain]
ip = yourIP
key = sso-key yourkey:yourSecret
url = https://api.godaddy.com/v1/domains/yourdomain/records

把里面的yourdomain替換成你的域名, yourkeyyourSecret替換成剛才生成的key和secret。

之后在新建一個(gè)log.txt空白文檔。

Ubuntu16.04上是默認(rèn)安裝了Python2.7和Python3.5的,默認(rèn)啟用的是2.7,讓我們來修改到3.5,之后再安裝程序所需的第三方包requests就可以正常該py程序了。

默認(rèn)用2.7應(yīng)該也沒問題吧。。最好修改成3.5版本。

先查看當(dāng)前的Python版本:python --version

3.5.2

如果不是3.5話則執(zhí)行以下命令來修改默認(rèn)的Python版本:

whereis python3.5#查看是否存在3.5版本,如果沒有需要自行安裝
sudo rm /user/bin/python
sudo ln -s /usr/bin/python3.5 /usr/bin/python
PATH=/usr/bin:$PATH

修改完成之后我們?cè)侔惭bDDNS程序所需要的第三方擴(kuò)展包:

sudo apt install python3-pip
sudo pip install requests
#如果安裝太慢可以修改成清華源,具體方法不再贅述

這時(shí)候我們的DDNS.py程序已經(jīng)可以運(yùn)行了。運(yùn)行一次查看結(jié)果:

sudo chmod 777 DDNS.py#給到最大權(quán)限
python DDNS.py
log

接下來,我們只需要設(shè)置讓這個(gè)程序2小時(shí)運(yùn)行一次就可以了,這樣可以達(dá)到DDNS的效果。

三:Cron

Cron是一個(gè)可以定時(shí)執(zhí)行計(jì)劃任務(wù)的程序,在Ubuntu中是默認(rèn)安裝的,在終端中輸入以下命令:

crontab -e

第一次使用會(huì)讓選擇文本編輯器,選nano就好。

然后在其中輸入:

0 */2 * * * /usr/bin/python /home/cfw/ddns.py

這代表我們兩小時(shí)運(yùn)行一次這個(gè)程序。

關(guān)于Cron有更多的用途和語法,可以自行查找。

之后我們可以不定期的查看Log文件。而且當(dāng)對(duì)DNS解析進(jìn)行更改的時(shí)候,GoDaddy網(wǎng)站也會(huì)給我們發(fā)送郵件。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容