.Net Core跨平台应用研究-HelloDDNS

-玩转DDNS

摘要

       为解决自己搭建的内网服务器需要域名而因没有超级用户密码不能开启光猫内置DDNS功能的问题,自己动手,基于.net core,实现动态域名的自助解析更新功能。

起因

      最近学习ABP开源项目框架,因测试和展示需求,需要部署基于asp.net core的web应用。手上有一个闲置了两年的35互联基于windows IIS的虚拟主机空间,联系服务商升级支持.net core运行时,增加无托管应用程序池,等了两天,技术支持回复不能予以支持,建议购买云主机。

      登录35的管理控制台,看了看35云主机的价格,2核4G内存10M出口带宽的云主机,1年不下5K大洋的价格,让人无语。

      听说马云baba的阿里云性价比不错,登录阿里云,2核4G的ECS,1年价格也不低于1.5K。

      错过了双11,也错过了双12,肿么办?

      想到家里100M的电信宽带,20M的上行速率,是不是可以利用下呢?

      正好最近在折腾基于arm64的Linux嵌入式平台(ubuntu core内核),已经成功实现了.net core应用跨平台部署(详见之前《.Net Core跨平台应用研究-HelloArm(串口篇)》文章),只要解决了外部网络访问及域名解析问题,手上就是现成的云主机啊。

      习大大说,撸起袖子加油干。

      说干就干。

自已动手,丰衣足食

    .Net Core Web应用部署

      首先,需要解决web app的部署。发布.net core Web项目的Linux(arm64)平台运行版本,部署到Linux。具体步骤参见笔者另一篇文章《.Net Core跨平台应用研究-HelloArm(串口篇)》,在此不再赘述。

配置外网访问

      登录电信提供的光猫,开启端口映射功能。(不懂的同学请自行百度或必应)

      通过www.ip138.com,查看自己的外网地址(本人直接使用的光猫路由功能,未使用二级路由),或登录光猫查看WLAN信息,获取自己的外网IP地址。

      关掉手机WIFI,用4G上网,通过手机浏览器访问http://外网IP:Port,访问发布的Web站点,bingo,访问成功。

      有同学会问,为什么要关掉手机wifi用流量访问?通常这些小型的家用路由器之类,是不会具有NAT回环配置功能的,无法从内网通过外网IP再NAT到内网IP。我的光猫,也不例外。

    DDNS简介

      稍懂网络知识的同学应该知道,家庭宽带用户,每次拨号上网得到IP地址是非固定的(固定IP地址的带宽线路用户,每年至少需要几万大洋哦,非土豪用户,一般不会申请 固定IP),光猫断个电或由于某些原因重新启动一下,IP就发生了变化。

      如何解决这个问题呢?此时,本文的主角终于快要出现了。

      我们知道,TCP/IP网络中的计算机,是通过IP地址进行寻址访问的,由于IP地址不好记忆,人们发明了一种便于标识IP的方式:域名。通过域名与IP进行绑定,解决IP地址难以记忆的问题。

      域名到IP地址的解析,是由DNS服务所完成。

      DNS通常只实现静态注册IP地址的解析,我们这种经常会变化的IP地址怎么办呢?

      这年头,只要有需求,就会有对应的产品或服务。针对这种IP地坦经常发生变化又需要有域名的情况,一种叫DDNS的服务应运而生。

      顾名思义,DDNS就是动态DNS,当IP地址发生变化时,只要能及对所辖域名的DNS服务器进行更新,则可保证对应域名的解析服务可用。当然,DDNS在IP发生变化时,会有一个失效时间,但只要更新及时,失效时间很短,用于测试和展示的话,基本不影响使用。

    DDNS使用

      中国的互联网络,从电话拨号上网,到ADSL,到现在的光纤入户,经历了好几代的演进。目前,大部分的接入设备-光猫,都是具备DDNS功能的,只不过该功能属于高阶功能,通常需要具有管理员权限才能使用。

      使用DDNS服务,需要先到DDNS服务商注册,注册成功后,可下载DDNS客户端软件(pc端)或配置开启光猫DDNS功能,即可实现DDNS服务的自助更新。

    DDNS服务商

      笔者接触互联网较早(没有从事互联网行业,感觉错失几个亿,在此汗一个),知道国内较早提供DDNS服务的是花生壳,国外提供DDNS的有dynu.com、noip.com等。

      另外在折腾路由器的过程中,用过的内置支持DDNS的光猫,在此记录一下:

  •       华为HG8245光猫,支持3322、dynu;
  •       烽火HG2201T光猫,支持oray(花生壳);
  •       ……

 

    蛋疼的中兴F450(V2)

      因升级到100M带宽,电信给提供了一个支持1000M的光猫,型号为中兴F450。根据网络上目前能查询到的资料,一翻折腾,确定目前中兴F450(V2版本)的光猫无法在免拆机的情况获取到超级管理员帐号。

      在没有超管密码的情况下,无法进入高级网络应用功能设置,不能开启光猫内置的动态域名支持(其实我也不知道它支持哪家的动态域名哈)。

    生命不休,折腾不止

      虽然本人的动手能力,足以通过拆机连接TTL串行接口的方式,以串行终端登录的方式获取中兴光猫的超级管理用户密码,一方面,考虑到光猫还在保修期(最近升级更换的新光猫呵),另一方,之前对DNS,DDNS的工作机制有一定的了解,知道DDNS厂家通常除了DDNS Client工具外,也有API接口可供用户自行开发集成。

本着自已动手,丰衣足食的原则,决定自己实现DDNS定期更新功能。

DDNS API协议研究

      获取相关DDNS协议

    ORAY

      通过一翻搜索,查询到花生壳的协议文档,链接在这里,支持浏览器手动更新和原始Http Get请求:

      1.使用URL验证

      适用于浏览器或应用程序(fetch, curl, lwp-request),可以在URL中包含验证信息。

      http://username:[email protected]/ph/update?hostname=yourhostname&myip=ipaddress

      2.原始HTTP GET请求

      实际的HTTP请求,类似下面的代码。 其中 base-64-authorization 请使用 Base64 加密 username:password 后的字符替换。

      GET /ph/update?hostname=yourhostname&myip=ipaddress HTTP/1.0

      Host: ddns.oray.com

      Authorization: Basic base-64-authorization

      User-Agent: Oray

      请注意必须使用GET请求,POST是不被允许的。

 

      更新参数

      目前仅允许提交以下参数

      参数      说明

      hostname    需要更新的域名,此域名必须是开通花生壳服务。多个域名使用,分隔,默认为空,则更新护照下所有激活的域名。例:hostname=test.oray.com,customtest.oray.com

      myip     需要更新的IP地址,可以不填。如果不指定,则由服务器获取到的IP地址为准。

 

     看了花生壳的动态域名更新协议,心中有底了,very easy。

    DYNU

      因本人以前有申请过DYNU的免费域名,顺便也查了下接口文档,文档地址如下(某些地区需要梯子呵):

      https://www.dynu.com/DynamicDNS/IP-Update-Protocol

主要内容如下:

      GET /nic/update?myip=198.144.117.32 HTTP/1.1

      Host: api.dynu.com

      Authorization: Basic [BASE64-ENCODED-USERNAME:PASSWORD-PAIR]

      User-Agent: [DEVICE-MODEL-MAKE-VERSION]

      Oray和Dynu的接口协议简直是一个模子出来的,不知道是谁模仿了谁,本人不想深究,好用就行。

    NO-IP

      群中有网友提到No-IP,本人没有注册过,相关资料在此,无需FQ,有需要的同学拿走不谢。

      https://www.noip.com/ 

      https://www.noip.com/integrate/request 

      http://username:[email protected]/nic/update?hostname=mytest.testdomain.com&myip=1.2.3.4

      万事具备 ,只欠编码……

 

编码实践

    创建类库项目

      打开宇宙最强IDE,名字我就不说了,你懂的,新建一个类库项目,选择.NET Standard类库。

 .Net Core跨平台应用研究-HelloDDNS(动态域名篇)-LMLPHP

      为什么选择.NET Standard类库,.net跨平台的之首选佳品。相关知识自行百度/必应补充。

      类库实现以下功能:

      夜深了,还是上图吧

 .Net Core跨平台应用研究-HelloDDNS(动态域名篇)-LMLPHP

    创建dotnet core控制台程序

      为啥选择dotnet core,原因很简单,跨平台。本人需要部署到Linux系统平台。

      照旧,上图

 .Net Core跨平台应用研究-HelloDDNS(动态域名篇)-LMLPHP

    HttpClient和HttpClientFactor

      原来准备直接使用HttpClient,参考一些文章后,我发现HttpClient的使用会导致一些问题:

      .NET Core 中 HttpClientFactory 如何解决 HttpClient 臭名昭著的问题

      https://www.zhibaoku.com/2018/10/31/net-core-zhong-httpclientfactory-ruhejiejue-httpclient-choumingzhaozhudewenti/

 

      What is HttpClientFactory?

      https://www.stevejgordon.co.uk/introduction-to-httpclientfactory-aspnetcore

 

      .NET Core 2.1中的HttpClientFactory最佳实践

      https://www.cnblogs.com/xiaoliangge/p/9476568.html

 

    Microsoft.Extensions.Http

      网上博客文章中,介绍IHttpClientFactory的可真不少,但是都没有提到需要安装其所需要Package,最后经过东搜西搜,花费了一翻不小的力气,还是在官方文档中找到了解决方法(好怀念有Google的日子啊)

      需要安装Microsoft.Extensions.Http包

      官方文档出处:

      https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/http-requests?view=aspnetcore-2.2

      完成程序,运行:

 .Net Core跨平台应用研究-HelloDDNS(动态域名篇)-LMLPHP

 

使用说明

flyfire.DDNS客户端

基于.net core2.2环境,支持windows和linux.

默认使用了oray的免费动态域名服务

启动时解析一次域名服务,解析域名和IP是否一致,如不一致,更新DDNS。

每十分钟检查一次,域名和公网IP不一致,则更新DDNS。

更新后会输出更新结果到控制台。

控制台输出可通过标准输出重定向输出到日志文件。

https://www.oray.com/

使用oray免费壳域名需要注册和实名认证。

ddns使用方式

oray

dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword

 

dynu

dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword http://api.dynu.com /nic/update

noip

https://www.noip.com/

http://username:[email protected]/nic/update?hostname=mytest.testdomain.com&myip=1.2.3.4

dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword http://dynupdate.no-ip.com /nic/update

linux下脚本配置(ubuntu)

创建脚本文件

在程序目录下创建一个脚本文件,例如 ddns.sh

文件内容如下:

cd $(dirname $0)

pwd

nohup dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword 2>&1 >>log.txt

 

授予权限

chmod 777 ./ddns.sh

 

运行脚本

./ddns.sh

脚本将启动程序,并且程序不会随shell的关闭而退出。同时,程序输出被重定向到日志文件log.txt。

将脚本文件加入到linux的开机启动配置文件,即可实现开机自动运行。

 

windows下输出重定向

dotnet ./flyfire.DDNS.Client.dll yourhostname yourusername yourpassword 2>&1 >>log.txt

 

      本项目已开源至:https://github.com/flyfire-cn/flyfire.DDNS

      类库flyfire.DDNS已发布至:https://www.nuget.org

 

      有需要的同学,请自行获取。

 

 

 

      在今天这个特别的日子,谨以此文献给所有坚守在一线的程序员/媛,祝天下有情人终成眷属。

      也感谢我的家人,长久以来为我默默的付出。

 

      注:本次折腾过程中,还出现了一个意外。在配置光猫NAT端口映射时,发现死活无法生效,开始还以为是光猫功能有问题,差点准备换光猫了(手上还有HW -HG8245光猫,因是华为早期产品,功耗有点大,无线信号稍弱,退休闲置中),无意中发现WLAN中得到的IP地址,居然是一个10开头的地址,原来电信把我给分配到了一个大局域网中了。

      同学们如果遇到这种情况,不要慌,给10000号打报修电话,要求使用公网IP,通常电信客服会帮你搞定。

 

      原创博文,写作不易。如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能,支持鼓励一下。
      各位看官,有钱的捧个钱场,没钱的领个红包。在下在此谢过。

 

      本文为作者原创,未经许可,请勿转载。

02-15 06:33