各位都是程序员,工做中是否是遇到个相似状况。
在家里研究的一些开源代码或写的一些demo或试验代码,在工做中正好须要参考一下,可是在家里的电脑上。
虽然这些均可以用云盘/网盘之类的来完成,源代码也能够托管到源码平台。
可是这些都有必定局限性,先不说你不可能把全部东西都上传到云盘或git,就算你真的全上传了,在公司你也须要在从新部署一遍。
不少时候,咱们只是想参考一下运行起来是很么样子而已,从新部署跟据环境差别的不一样每每须要浪费不少时间,有的时候还得从新录入一些测试数据(由于数据库同步就更麻烦)
。
试想一下,若是咱们能够
直接访问家里的电脑,并且能够直接连到家里电脑上数据库上是否是很爽。
咱们知道,若是想经过互联网来访问家里的电脑,那么首先就得要知道家里电脑的公网 IP 地址。可是,家用宽带
通常
是没有固定IP地址的,每次链接上网后该地址都会随机改变,这样咱们要在外访问家里的电脑就变得有些麻烦了。因此,这时候咱们就须要用到
DDNS
(Dynamic Domain Name Server)
。
在开始以前,你们先注意看一下下面这几个前提条件,省得浪费时间。由于不是全部网络都须要(或能够用到)DDNS的,并且DDNS也不能解决全部问题。
1.若是你的网络有固定IP或没有公网IP地址就不用看这篇文章了,前者没有必要,后者靠DDNS也解决不了。
2.在全球IP资源紧张的状况下(固然也有别的缘由),目前大多数
ISP对家用宽带都再也不提供公网IP,须要本身申请,目前已知的是电信/联通能够本身申请,但其余二级
ISP都再也不提供公网IP地址了
。
因此,若是你用的是长城、艾普、移动之类的宽带也不用看了,实现不了。
3.目前全国全部家用宽带上传80端口都是被封了的,其它端口跟据运营商或地区也有被封的(2一、8080之类经常使用的),注意本身测试,选可用的端口进行服务。
4.为何不用花生壳或nat123之类的现成的DDNS服务?
这个扯到钱的问题了,固然
若是你是土豪,请随意(若是你真土豪的话,直接开通商业宽带用固定IP地址就好了)。
经过官方介绍咱们知道,所谓云解析,其它就是让咱们能够本身编写程序经过调用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
。
下面是远行起来的一些效果截图(有图有真相嘛,哈哈)

一些知识点
a.局域网内的计算机或设备直接从本地是获取不到公网IP地址的,必须借助于某个可以返回IP的第三方服务才行(网上的方案大可能是借助ip138)。
b.服务端能够很容易获取到客户端的公网IP地址,若是服务器端和客户端不在同一个局域网,那么获取的就是公网IP地址(这里不考虑代理的状况)。
c.解析生效时间 = TTL + 获取IP的周期时间。阿里云解析免费版TTL为10分钟,收费的最高为1秒。因此
获取IP的周期时间应该尽可能短小,路由器能直接监听到IP的变化,但其余设备就须要和第三方交互并经过不断轮询的方式来获取。
题外话
像花生壳这类的公司
(其余的都差很少)
,主打功能是内网穿透,就成本而言,
内网版和
公网版能够说一个是天上,一个是地下
。
可是,在前面一、二、3的大背景下,内网版更有商业价值,因此这类公司,对
内网版
和
公网版
订价相差并不大, 因此形成公网版价格虚高,全部有些不划算。(公网版才是DDNS服务,内网穿透功能其实上是代理)。
就以花生壳来讲吧,之前花钱买了个花生壳专业版,都常常性访问不到。开始不知道缘由,一直觉得是本身网络环境的问题,一个偶然状况下,发现了花生壳商城有个测试页面没有关闭,0元就能够买到全套花生壳服务,果断下单买了一个“铂金版终身服务”,那速度就很快了,用起来就一点儿问题都没有。你想一想,专业版都这样,你要花多少钱才能买到一个稳定的服务呢。固然了,若是你没有公网IP地址,这也不失为一个好的选择(花生壳这公司我也是醉了。1.犯这么低级的错误。2.没见过购买虚拟服务还要运费的。3.我把该BUG报告给他们管理员,他丫的招呼都不打就把订单取消就算解决问题了,并且10块钱运费也没退还)。