用阿里云解析DNS来实现一个DDNS服务

很早之前就希望能有个稳定长期好用的DDNS,之前的水星路由器刷OpenWRT用过f3322动态DDNS,反正是极其不稳定。花生壳之类的其它也没有去尝试过,总觉得这类免费的东西没什么稳定性可言。大华监控NVR里面有个DDNS服务可用,使用了比较长一段时间,稳定性我觉得真的很不错了,但也有抽风的时候啦。总担心大华什么时候会把这个DDNS服务器给撤掉,或者不提供给NVR,又或者其它…

于是申请一个域名吧,用钱买服务,应该才是长久之计。反正每天控制一下少抽一根烟(0.2元/支),就能拥有一个域名,为什么不买?😂买买买!!

有了域名,要怎么使用,还是一件挺头疼的问题。下面整理的一些资料,使用域名解析达到DDNS的目的。

网上搜索得到资料如下:转自http://www.cnblogs.com/weapon/p/6772253.html

各位都是程序员,工作中是不是遇到个类似情况。在家里研究的一些开源代码或写的一些demo或试验代码,在工作中正好需要参考一下,但是在家里的电脑上。

虽然这些都可以用云盘/网盘之类的来完成,源代码也可以托管到源码平台。但是这些都有一定局限性,先不说你不可能把所有东西都上传到云盘或git,就算你真的全上传了,在公司你也需要在重新部署一遍。很多时候,我们只是想参考一下运行起来是很么样子而已,重新部署跟据环境差异的不同往往需要浪费很多时间,有的时候还得重新录入一些测试数据(因为数据库同步就更麻烦)。
试想一下,如果我们可以直接访问家里的电脑,而且可以直接连到家里电脑上数据库上是不是很爽。

我们知道,如果想通过互联网来访问家里的电脑,那么首先就得要知道家里电脑的公网 IP 地址。但是,家用宽带一般是没有固定IP地址的,每次连接上网后该地址都会随机改变,这样我们要在外访问家里的电脑就变得有些麻烦了。所以,这时候我们就需要用到 DDNS(Dynamic Domain Name Server)。 下面,我们就介绍一种利用阿里云解析DNS服务来实现一个DDNS服务(腾讯云也有这个服务)。

在开始之前,大家先注意看一下下面这几个前提条件,免得浪费时间。因为不是所有网络都需要(或可以用到)DDNS的,而且DDNS也不能解决所有问题。
1.如果你的网络有固定IP或没有公网IP地址就不用看这篇文章了,前者没有必要,后者靠DDNS也解决不了。
2.在全球IP资源紧张的情况下(当然也有别的原因),目前大多数ISP对家用宽带都不再提供公网IP,需要自己申请,目前已知的是电信/联通可以自己申请,但其他二级ISP都不再提供公网IP地址了。
所以,如果你用的是长城、艾普、移动之类的宽带也不用看了,实现不了。
3.目前全国所有家用宽带上传80端口都是被封了的,其它端口跟据运营商或地区也有被封的(21、8080之类常用的),注意自己测试,选可用的端口进行服务。
4.为什么不用花生壳或nat123之类的现成的DDNS服务?
这个扯到钱的问题了,当然如果你是土豪,请随意(如果你真土豪的话,直接开通商业宽带用固定IP地址就行了)。
5.阿里云解析DNS服务是什么?
通过官方介绍我们知道,所谓云解析,其它就是让我们可以自己编写程序通过调用API来管理域名,包括解析(目前官方提供 JAVA、PHP、Python、C#的开发SDK)。

为了方便描述,我们在这里作一些名词约定,如果没有特殊说明,文章中都使用简称。
API 默认是指 云解析DNS服务API 的简称,
路由 是指 家庭环境的总路由器,
局域网 是指 家庭环境的局域网,
公网IP 是指 家庭环境的公网IP,
第三方服务 是指 一个能返回公网IP的服务真的第三方(例如:ip138),
“第三方服务”(带引号的) 是指 你自己可随意控制的、能通过互联网进行访问,有固定访问地址的服务(例如:你自己购买了云服务器,一般都是有固定地址的)。

看完上面几点,如果没有问题的话,我们就可以正式搭建DDNS服务了。
首先,我们需要一台在家庭网络下运行的设备来运行一个DDNS客户端。(不只局限于电脑,理论上只要是可以运行程序,能主动对外发出请求的设备都行,最好是可以24小时不间断的工作,断电或断网后可以自行恢复的。可以是电脑/服务器、树莓派、可安装插件的智能路由器都可行)
其次,针对不同设备,解决方案也略有不同,主要原因是:
a.上面的设备除了路由器外,其他设备都需要借助第三方服务才能取得公网IP地址。
b.既然需要用到第三方服务,那由谁发向API发送更新请求呢?
但总体来说也就两步:第一步,获取到公网IP地址。第二步,在IP变化时,向API发送更新请求。

跟据以上情况,我们可得到三种最优的解决方案(相对而言,更小的成本、最小的风险、最快的解析生效时间)。
方案1,路由 + API
方案2,局域网内设备 + 第三方能返回公网IP的服务 + API
方案3,局域网内设备 + “第三方服务” + API

第一种方案是最完美的方案,因为路由器耗电少,可以24小时不间断工作,断电或断网都可以自动连接,可以第一时间检测到公网IP的变化。但是,目前还没见到市面上那款路由器集成这个的(有集成的花生壳的),所以你就需要一个智能路由器然后自己开发插件,大多数路由插件都是C/C++,但好在这个功能很简单,而且相关的SDK官方虽然没有提供,但开源社区里有。总体而言,这个方案相于而言要复杂些,但也是最理想的。
第二种方案,局域网内设备上面运行一个DDNS客户端或插件直接与API交互,缺点就是需要借助第三方服务来获公网IP地址。我们知道,最大解析生效时间 = TTL + 获取IP的周期时间,所以我们希望获取IP的周期当前是越短越好,但这样被封的几率就越大,增加了些不稳定的因数。
第三种方案,同样是局域网内设备上面运行一个DDNS客户端或插件,但不直接与API交互,只需要不停的向“第三方服务” 发送心跳请求就行,然后“第三方服务”才与API交互。

思路都介绍清楚了,下面我们就进入到实战阶段。

因为我是搞.net的,对.net最熟悉,所以代码都是C#的。其实,其它语言像go,php,node.js,python的解决方案都比.net的多,只是我不熟悉这些语言,不好修改,所以就准备自己动手。
当然,动手之前去github上搜一下有没有现成的,结果还真找到了一个,用的是上面第二种方案,代码是基于.net core的,并支付docker,可以说相当不错(github)。
不过我使用的过程中遇到一些小问题。我家里服务器是windows server 2016的系统,虽然2016集成了docker,但我折腾了好几天并没有在windows 2016上把docker跑起来,这样就不能以服务的方式运行,也没法开机启动。所以我就把原代码修改了一下,改成windows服务了。

还没完呢,对我这种追求完美的人来说,用第三方的服务来获取IP实现的还是有些不爽,而且我家里是台微服务器,还是乞丐版,配置很低(居然用了40多M内存),我自己在阿里云上也有服务器。所以,我又动手把源码改成第三种方案了。
原先准备在家和阿里云之间用TCP或UDP来链接,这样实时性最好,最后一想太麻烦了,也没有必要。就直接HTTP协议来多好,还可以把原先阿里云上的web网站利用起来,改一下就可以了。
这样家里这台微服务器只需要不断请求阿里云上的网站的一个地址就行了(也是写了一个windows服务,1分钟请求一次,而且这个服务只会用到10几M内存)。oschina

代码说明:
1.代码分为两部分,有个叫aspnetCore的项目,是第三种方案中用在远程服务器上的,因为我是在已有的网站上改造的,所以单独写了一个示例代码,你可能将它集成到你自己的网站上。
2.src目录下的AliyunDDNS.Client项目是第二种方案的windows服务版,为了方便服务的安装和卸载,我写了两个叫Install.bat、Uninstall.bat的批处理文件,在项目的bin/Debug目录下(注意:远行时可能需要用管理员权限运行)。
3.src目录下的AliyunDDNS.HeartbeatService的项目是第三种方案的客户端,也是一个windows服务,用于不断的对外发出请求,同样在bin/Debug目录下也有Install.bat、Uninstall.bat

以上转自http://www.cnblogs.com/weapon/p/6772253.html

 

下面自己按教程,完成了在WINDOWS10里,自动启动aliyunDDNS服务,直接与API交互。不再依赖其它例如f3322、花生壳之类的DDNS服务啦!

首先我们必须要有这个软件:china-live-aliyunddns-master

然后我们必需要有阿里申请得到的域名,添加解析。

登陆进入控制台,在自己申请的域名里,添加解析

 

下面是添加解析的参数:

记录类型:A
主机记录:@
解析线路:默认
记录值: 这里不用填
TTL值:10分钟 默认就是这个不用修改。

好了,添加成功确定即可。

 

下面我们还需要阿里云的AccessKeys

点进Accesskeys这里会提示创建子用户,没有创建的就创建一个吧,为了安全起见。

按步骤创建好子用户,我们需要授权给子用户。

权限我就只给了这些,不太懂这么多权限到底是拿来干啥的,反正为了安全点,所以给了这些权限可以使用A解析这个功能就够了。

授权好之后,管理子用户

管理子用户这里,创建Accesskey,创建好,记得保存AK信息,不然以后进入控制台都无法查看AccessKeysecret

好了,阿里云解释这里就设置好了。

下一步就是在电脑上安装启动服务

解压:china-live-aliyunddns-master
解压出来里面很多文件夹,我们只需要WINDOWS用的文件即可。所以现在我只用WINDOWS服务,就只需AliyunDDNS.Client这个文件夹里面的东西即可啦。不过反正这个压缩包也不大,所以完整保留了下来,日后有需要的话,也许其它可以用上的。
解压出来我们要修改路径:china-live-aliyunddns-master\aliyunddns\src\AliyunDDNS.Client\bin\Debug\DdnsClient.json这个配置文件以匹配我们刚才创建的域名的A记录。(用Notepad++打开配置文件修改,为了避免使用其他软件如记事本修改出问题)
修改Intervalmillisecond:600000 时间间隔10分钟。阿里TTL是10分钟
修改AccessKeyID:填上阿里云子用户AccessKeyID
修改AccessKeySecret:填上阿里云子用户AccessKeySecret
修改Domainname:填上自己申请的域名
修改RR:填上A记录里的主机记录:@
修改好了保存即可。

然后以管理员身份运行Install.bat安装服务。记住退出其它流氓杀毒软件,避免安装失败。

然后进入服务查看是否已经成功安装,并且设置服务自动运行。

到这里,服务已经正常自动运行了。然后阿里云解析就发邮件过来了!


 
我们也可以查看这个软件的日志记录,路径:china-live-aliyunddns-master\aliyunddns\src\AliyunDDNS.Client\bin\Debug\Logs

 

至此完成了我们的域名+阿里云云解析实现DDNS功能的伟大工程了😂!

我们直接访问域名,就可以访问到我本地的主机上啦!至于80端口,就不用想了,反正是自己用的,用其它端口解决问题即可。
所用到的软件必需感谢原作者http://www.cnblogs.com/weapon/提供这么给力的软件。

 

还有一个备用软件:Autoddns_aliyun

这个是一个绿色小软件,直接运行即可,没有添加到WINDOWS服务里,所以自动启动运行的话,我暂时还不知道怎么处理,所以这个软件作为备用。
仅需修改一下里面的配置文件的参数即可对接阿里云API实现DDNS服务。

 

完成任务。

如果阿里云改掉API接口,或者改掉一些参数导致上述两个软件无法使用了呢?

那样就很尴尬了…🤣

“用阿里云解析DNS来实现一个DDNS服务”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注