各位都是程序员,工作中是不是遇到个类似情况。在家里研究的一些开源代码或写的一些demo或试验代码,在工作中正好需要参考一下,但是在家里的电脑上。
虽然这些都可以用云盘/网盘之类的来完成,源代码也可以托管到源码平台。但是这些都有一定局限性,先不说你不可能把所有东西都上传到云盘或git,就算你真的全上传了,在公司你也需要在重新部署一遍。很多时候,我们只是想参考一下运行起来是很么样子而已,重新部署跟据环境差异的不同往往需要浪费很多时间,有的时候还得重新录入一些测试数据(因为数据库同步就更麻烦)。
试想一下,如果我们可以直接访问家里的电脑,而且可以直接连到家里电脑上数据库上是不是很爽。
我们知道,如果想通过互联网来访问家里的电脑,那么首先就得要知道家里电脑的公网 IP 地址。但是,家用宽带一般是没有固定IP地址的,每次连接上网后该地址都会随机改变,这样我们要在外访问家里的电脑就变得有些麻烦了。所以,这时候我们就需要用到
DDNS(Dynamic Domain Name Server)。
在开始之前,大家先注意看一下下面这几个前提条件,免得浪费时间。因为不是所有网络都需要(或可以用到)DDNS的,而且DDNS也不能解决所有问题。
1.如果你的网络有固定IP或没有公网IP地址就不用看这篇文章了,前者没有必要,后者靠DDNS也解决不了。
2.在全球IP资源紧张的情况下(当然也有别的原因),目前大多数ISP对家用宽带都不再提供公网IP,需要自己申请,目前已知的是电信/联通可以自己申请,但其他二级ISP都不再提供公网IP地址了。
所以,如果你用的是长城、艾普、移动之类的宽带也不用看了,实现不了。
3.目前全国所有家用宽带上传80端口都是被封了的,其它端口跟据运营商或地区也有被封的(21、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的变化,但其他设备就需要和第三方交互并通过不断轮询的方式来获取。
题外话
像花生壳这类的公司(其他的都差不多),主打功能是内网穿透,就成本而言,内网版和公网版可以说一个是天上,一个是地下。但是,在前面1、2、3的大背景下,内网版更有商业价值,所以这类公司,对内网版和公网版定价相差并不大, 所以造成公网版价格虚高,所有有些不划算。(公网版才是DDNS服务,内网穿透功能其实上是代理)。
就以花生壳来说吧,以前花钱买了个花生壳专业版,都经常性访问不到。开始不知道原因,一直以为是自己网络环境的问题,一个偶然情况下,发现了花生壳商城有个测试页面没有关闭,0元就可以买到全套花生壳服务,果断下单买了一个“铂金版终身服务”,那速度就很快了,用起来就一点儿问题都没有。你想想,专业版都这样,你要花多少钱才能买到一个稳定的服务呢。当然了,如果你没有公网IP地址,这也不失为一个好的选择(花生壳这公司我也是醉了。1.犯这么低级的错误。2.没见过购买虚拟服务还要运费的。3.我把该BUG报告给他们管理员,他丫的招呼都不打就把订单取消就算解决问题了,而且10块钱运费也没退还)。
- 【终极版】利用阿里云云解析API实现动态域名解析(ddns),搭建私有服务器【含可执行文件和源码】
前言:懒人可以直接往下看,有代码和全部资源可以下载.此文章是先前文章的定时版,主要是添加了定时执行的功能,并且将代码中的配置项放置到了app.config文件中,方便不懂开发的朋友修改使用.未经许可请 ...
- OpenStack 企业私有云的若干需求(4):混合云支持 (Hybrid Cloud Support)
本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...
- OpenStack 企业私有云的若干需求(6):大规模扩展性支持
本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...
- 利用阿里云如何开发一款直播app?
在开发的过程中应该注意些什么?下面让小编告诉你: 随着互联网的发展,越来越多的人已经加入互联网的行列.而且很多的人也开始直播,和众多的网友分享自己身边事情.互联网还在加速发展,从PC互联网,到移动互联 ...
- 四种方案:将OpenStack私有云部署到Hadoop MapReduce环境中
摘要:OpenStack与Hadoop被誉为继Linux之后最有可能获得巨大成功的开源项目.这二者如何结合成为更猛的新方案?业内给出两种答案:Hadoop跑在OpenStack上或OpenStack部 ...
- 利用阿里云容器服务打通TensorFlow持续训练链路
本系列将利用Docker和阿里云容器服务,帮助您上手TensorFlow的机器学习方案 第一篇:打造TensorFlow的实验环境 第二篇:轻松搭建TensorFlow Serving集群 第三篇:打 ...
- Markdown图片存储解决方法-利用阿里云OSS
我们在用markdown写一些博客或者文章的时候,常常需要引用一些图片,一般都是找一个免费的图床上传,然后复制图片链接在我们的markdown文章中.类似像这样: 存在的隐患 一般的免费图片托管网站有 ...
- 通过python将阿里云DNS解析作为DDNS使用
通过python将阿里云DNS解析作为DDNS使用 脚本需要Python2.x运行 安装alidns python sdk sudo pip install aliyun-python-sdk-ali ...
- OpenStack 企业私有云的若干需求(5):主流硬件支持、云快速交付 和 SLA 保证
本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...
随机推荐
- Sql 语句拼接 多条件分页查询
Create PROCEDURE [dbo].[Proc_B2B_GetBatchMainPaging] @StationNo AS varchar() , --m @StationName AS v ...
- WPF 界面如何绑定Command
WPF中,我们使用MVVM,在ViewModel中定义Command和其业务逻辑,界面绑定Command. 那么是不是所有的事件都可以定义Command呢,然后将业务全部放在ViewModel中呢? ...
- Fundebug前端JavaScript插件更新至1.6.0,新增test()方法用于测试
摘要: 1.6.0新增fundebug.test()方法用于测试,请大家及时更新. 默认情况下,Fundebug 插件能够自动捕获未处理的错误(uncaught error).另外,开发者也可以通过使 ...
- 后端开发者的Vue学习之路(四)
目录 上节内容回顾: npm 介绍 安装 常用命令: 补充: 基于npm的Hello World 项目结构分析 用法迁移 小提醒 ES6语法 知识补充 单文件组件 使用注意: 路由 开启路由 定义路由 ...
- Vsphere 回收未消使用的磁盘空间
下载sdelete.exe 执行 sdelete.exe -z E: ,然后又恢复为原可用空间 关机 SHH进入物理主机,找到对应的虚机文件 执行vmkfstools -K test-Win200 ...
- Windows WMIC命令使用详解(附实例)
第一次执行WMIC命令时,Windows首先要安装WMIC,然后显示出WMIC的命令行提示符.在WMIC命令行提示符上,命令以交互的方式执行 执行“wmic”命令启动WMIC命令行环境.这个命令可以在 ...
- SQL语句中不同的连接JOIN
为了从两个表中获取数据,我们有时会用JOIN将两个表连接起来.通常有以下几种连接方式: JOIN or INNER JOIN(内连接) : 这两个是相同的,要求两边表同时有对应的数据,返回行,任何 ...
- 【转载】FPGA 中的latch 锁存器
以下这篇文章讲述了锁存器的一些概念和注意事项.原文标题及链接: FPGA 中的latch 锁存器 - 快乐至永远上的博客 - 与非博客 - 与网 http://www.eefocus.com/liuy ...
- Windows使用MongoDB,以及索引创建
安装MongoDB https://www.mongodb.com/download-center#community 点击msi安装程序进行安装,可以进行自定义安装,选择安装位置,我选择的是D盘 在 ...
- 生成文件的MD5值
import hashlib #########测试################# m = hashlib.md5() m.update(b"hello") m.update( ...