没固定公网 IP 的内网实现动态域名解析( 阿里云万网解析 )

情景说明

手里一台thinkpad旧电脑一直在吃灰,最近收拾房间时再次翻了出来,于是想拿来搭建一台个人服务器,方便做各种测试环境测试。
折腾了一个晚上,将原来的win7升级成了win10,然后又安装了一个ubuntu的双系统(ubuntu是通过硬盘方式安装,不借助光盘或U盘,稍后也会写成文章记录下来,有兴趣的朋友可以去翻翻看)。
安装完双系统,下了一个XAMPP集成环境包,又想尝试看看能不能把服务器放到公网上,于是就有了这篇文章。
因为我对于服务器这块比较小白,所以翻了两个晚上的百度才勉强实现了自己的需求。本文章关于实现动态域名解析这块几本是完全按照网上大佬的博客文章来实现的,只有极少量的代码修改,后面会附上大佬博客原文地址

准备工作

因为是通过阿里云的域名解析实现的,所以需要有一个阿里云账号,并且有一个已备案的域名。
满足这两个条件之后,登陆阿里云创建一个 Accesskey ,这个东西将作为我们登录阿里云更新解析的用户,具体创建方法可以参考百度,创建完成后记得保留好生成的 Key 和 Secret:


979767-20180626140650670-555806177.jpg

如果你的阿里云账号是有多用户管理的,需要指定用户并且授权 DNS 管理 的权限,否则无法更新,我就是一个个人账号,所以并没有做授权这一步。
原博主使用的是centOS作为系统环境,而我使用的是ubuntu,目前为止linux系统也只用过ubuntu。

服务配置

【1】安装 pip
我安装的是ubuntu20.04LTS版本,系统已经自带了python3.0,但是没有2.x版本的python, 经过测试发现阿里云的依赖包似乎只能支持python2.x,至少我目前测试的结果是这样,所以为了安全我把 python2 安装上了,版本是2.7.18。
不同版本的python对应不同版本的 pip,我也同时安装了 pip3 和 pip2,主要是为了省事,安装方法大家自行百度一下,这篇文章并不是在ubuntu下写的,就不倒腾截图了。
【2】安安装依赖的阿里云 Python 包:前者是阿里云需要的包,后者是模拟请求需要的包

pip install aliyun-python-sdk-alidns
pip install requests

【3】编辑更新脚本 ddns_update.py,内容如下:
备注:脚本复制的是原博文,只是修改了获取ip地址的部分代码,可能因为时间关系,原博文中的代码已经不能正确获取到ip地址了。
注意:这里解析有一个前提条件,就是你需要修改的那条解析规则必须已经存在,该脚本不能新增,只能修改旧的

#coding:utf-8
from aliyunsdkcore import client
from aliyunsdkalidns.request.v20150109 import DescribeDomainsRequest,DescribeDomainRecordsRequest,UpdateDomainRecordRequest
import json,os

######################################################################################
# 个人配置区域
#####################################################################################
# 创建的 AccessKey
ID="xxxxxxx"
Secret="xxxxxxx"

# 默认
RegionId="cn-hangzhou"

# 你的域名
DomainName="abc.com"

# 你想解析的二级域名,是一个列表,可以写多个
HostNameList = ['blog', 'test']

# 默认
Types = "A"
clt = client.AcsClient(ID,Secret,RegionId)
######################################################################################


# 动态获取当前公司对外的公网 IP
def GetLocalIP():
    IPInfo = os.popen('curl -L tool.lu/ip').readlines()
    IP = IPInfo[0][10:25]
    return IP

    
# 更新域名 IP
def EditDomainRecord(HostName, RecordId, Types, IP):
    UpdateDomainRecord = UpdateDomainRecordRequest.UpdateDomainRecordRequest()
    UpdateDomainRecord.set_accept_format('json')
    UpdateDomainRecord.set_RecordId(RecordId)
    UpdateDomainRecord.set_RR(HostName)
    UpdateDomainRecord.set_Type(Types)
    UpdateDomainRecord.set_TTL('600')
    UpdateDomainRecord.set_Value(IP)
    UpdateDomainRecordJson = json.loads(clt.do_action_with_exception(UpdateDomainRecord))
    print UpdateDomainRecordJson

    
# 获取域名信息
def GetAllDomainRecords(DomainName, Types, IP):
    DomainRecords = DescribeDomainRecordsRequest.DescribeDomainRecordsRequest()
    DomainRecords.set_accept_format('json')
    DomainRecords.set_DomainName(DomainName)
    DomainRecordsJson = json.loads(clt.do_action_with_exception(DomainRecords))
    
    print DomainRecordsJson['DomainRecords']['Record']
    
    for HostName in HostNameList:
        for x in DomainRecordsJson['DomainRecords']['Record']:
            RR = x['RR']
            Type = x['Type']
            if RR == HostName and Type == Types:
                RecordId = x['RecordId']
                print RecordId
                EditDomainRecord(HostName, RecordId, Types, IP)

                
IP = GetLocalIP()
GetAllDomainRecords(DomainName, Types, IP)

【4】添加定时任务: 每两小时更新一次
备注: 这里也是复制的原博文代码,但我其实并没按这上面的方式来添加定时任务,我是自己手动通过 crontab 命令来添加的定时任务

# 授执行权限
chmod 755 /scripts/ddns_update.py

# 添加定时任务
echo "* */2 * * * /usr/bin/python /scripts/ddns_update.py" >> /var/spool/cron/root

【5】配置完成,按照上面的代码,我手动运行测试是可以成功修改阿里云的解析配置的。

写在最后

感谢原博文博主的分享,全都是干货,我几乎就是按部就班地就完成了配置。
另外其实是还有一个问题:因为现在几乎所有网络服务商都禁止了80和8080端口的原故,导致想要正常访问站点不得不加上一个难看的端口号,百度了很多文章,都说可以使用 nginx 反向代理来隐藏端口号,但因为我对nginx代理完全不懂,暂时无从下手,如果看到文章的你有好的关于这方面的文章分享,欢迎留言告知,感激不尽!

最后附上原文地址: https://www.cnblogs.com/Dy1an/p/9229074.html

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