10.1动态域名——GoDaddyDDNS

一、GoDaddy

首先我们需要在GoDaddy上面购买一个域名,有些域名很贵,有些很便宜,我们尽量买一些便宜的域名,并且一年一换,可以降低成本。


在搜索框输入你想要的域名关键字就可以看到价格了

随便买一个域名,之后进入到管理页面。然后点击DNS。


直接选择DNS

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替换成你的域名, yourkeyyourSecret替换成刚才生成的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.2

如果不是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
log

接下来,我们只需要设置让这个程序2小时运行一次就可以了,这样可以达到DDNS的效果。

三:Cron

Cron是一个可以定时执行计划任务的程序,在Ubuntu中是默认安装的,在终端中输入以下命令:

crontab -e

第一次使用会让选择文本编辑器,选nano就好。

然后在其中输入:

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

这代表我们两小时运行一次这个程序。

关于Cron有更多的用途和语法,可以自行查找。

之后我们可以不定期的查看Log文件。而且当对DNS解析进行更改的时候,GoDaddy网站也会给我们发送邮件。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339