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

隨便買一個(gè)域名,之后進(jìn)入到管理頁(yè)面。然后點(diǎn)擊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/

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替換成你的域名, yourkey 、yourSecret替換成剛才生成的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話則執(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

接下來,我們只需要設(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ā)送郵件。