一、GoDaddy
首先我们需要在GoDaddy上面购买一个域名,有些域名很贵,有些很便宜,我们尽量买一些便宜的域名,并且一年一换,可以降低成本。
随便买一个域名,之后进入到管理页面。然后点击DNS。
可以看到,记录的第一行,类型A代表IPv4,值代表着要解析到哪个IP地址,在路由器中查看你的公网IP,然后把IP填进去就可以了,这样这个域名就会解析到你的IP上来。
大部分运营商都会封锁80和443端口,所以在路由器里进行端口转发的时候要把内部的80端口转发到别的端口上,例如81、8888。然后用
域名:转发后端口号
访问。
二、GoDaddyDNSAPI
前面说过了,我们的IP并不是固定的,那么我们就需要DDNS了,GoDaddy给用户提供了一套API可以用它来修改DNS解析,我们通过Python程序来获取到我们当前的IP,然后链接上GoDaddy网站来让程序帮我们修改DNS指向的IP,之后通过定时任务,让程序2小时运行一次,发现IP变动就帮我们修改DNS,以此来实现DDNS。
Python是参考了进行了修改,增加了检测功能和日志输出。
也可以看看这个开源的GodaddyDDNS python程序:https://github.com/anshengme/ddns
首先,要申请一个API KEY用来在程序修改DNS解析的时候来认证我们自己身份。
https://developer.godaddy.com/keys/
Name那一栏里写上NASDDNS,直接点Next,接下来会有个页面显示key和secret,secret只会在这里显示一次,之后便无法查看,所以建议牢记。
那么接下来就需要编写Python程序来实现DDNS了,过程比较复杂,有兴趣的朋友可以看我贴出来的源码,然后直接在桌面新建一个TXT,把代码复制粘贴进去,然后把后缀名改成py即可。
源码也进行了参考,但是实在找不到那个参考的网址了。。。
#!/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检测到变更!当前时间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 = ' 错误!返回错误代码:'+self.code
else:
text = ' ip未检测到变更!当前时间ip:'+self.NowIP+' 配置文件ip:'+self.ip
self.WirteLog(text)
def UpdateDNS(self):
records = {
# 修改的域名
"data": self.NowIP,
# 指向方式
"name": "@",
# 指向端口
"port": 80,
# ttl时间,最小600
"ttl": 600,
# 指向形式
"type": "A"
}
# 请求头
head = {
'accept': 'application/json',
'Content-Type': 'application/json',
# 需要改为自己的key和pd
'Authorization': self.key
}
# 官方的默认dns信息,统一的,如果不带上,会返回422错误
records_NS01 = {
"data": "ns07.domaincontrol.com",
"name": "@",
"ttl": 3600,
"type": "NS"
}
records_NS02 = {
"data": "ns08.domaincontrol.com",
"name": "@",
"ttl": 3600,
"type": "NS"
}
# 组件发送信息,信息要转成json形式,可以在发送转也可以生成的时候转,我直接在生成数据转了
put_data = json.dumps([records, records_NS01, records_NS02])
# 请求的url,根据自己的域名变更范例的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()
之后我们再新建一个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。
之后在新建一个log.txt
空白文档。
Ubuntu16.04上是默认安装了Python2.7和Python3.5的,默认启用的是2.7,让我们来修改到3.5,之后再安装程序所需的第三方包requests就可以正常该py程序了。
默认用2.7应该也没问题吧。。最好修改成3.5版本。
先查看当前的Python版本:python --version
如果不是3.5话则执行以下命令来修改默认的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
修改完成之后我们再安装DDNS程序所需要的第三方扩展包:
sudo apt install python3-pip
sudo pip install requests
#如果安装太慢可以修改成清华源,具体方法不再赘述
这时候我们的DDNS.py程序已经可以运行了。运行一次查看结果:
sudo chmod 777 DDNS.py#给到最大权限
python DDNS.py
接下来,我们只需要设置让这个程序2小时运行一次就可以了,这样可以达到DDNS的效果。
三:Cron
Cron是一个可以定时执行计划任务的程序,在Ubuntu中是默认安装的,在终端中输入以下命令:
crontab -e
第一次使用会让选择文本编辑器,选nano就好。
然后在其中输入:
0 */2 * * * /usr/bin/python /home/cfw/ddns.py
这代表我们两小时运行一次这个程序。
关于Cron有更多的用途和语法,可以自行查找。
之后我们可以不定期的查看Log文件。而且当对DNS解析进行更改的时候,GoDaddy网站也会给我们发送邮件。