.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(串口篇)》文章),只要解决了外部网络访问及域名解析问题,手上就是现成的云主机啊。

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

说干就干。

  (原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文为作者原创,未经许可,请勿转载。

自已动手,丰衣足食

.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协议

  (原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文为作者原创,未经许可,请勿转载。

ORAY

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

1.使用URL验证

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

http://username:password@ddns.oray.com/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:password@dynupdate.no-ip.com/nic/update?hostname=mytest.testdomain.com&myip=1.2.3.4

万事具备 ,只欠编码……

  (原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文为作者原创,未经许可,请勿转载。

编码实践

创建类库项目

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

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

类库实现以下功能:

夜深了,还是直接上图吧

创建dotnet core控制台程序

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

外甥打灯笼-照旧(舅),上图

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

完成程序,运行:

给出笔者部署到Linux系统下的运行效果

运行后的日志文件记录

  至此,一台强大的,完全自主拥有的linux云主机横空出世,不要999,只要99,你值得拥有!

使用说明

flyfire.DDNS客户端

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

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

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

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

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

控制台输出可通过标准输出重定向输出到日志文件。此行划重点,要考的呵。

使用标准输出重定向,可以不用自己写日志功能,可直接将程序异常和控制台输出定向到日志文件,是广大程序员一大偷懒神器。

使用oray免费壳域名需要注册和实名认证。https://www.oray.com/

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域名

http://username:password@dynupdate.no-ip.com/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/packages/flyfire.DDNS/

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

  (原文)https://www.cnblogs.com/flyfire-cn/p/10381298.html本文为作者原创,未经许可,请勿转载。

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

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

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

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

 

.Net Core跨平台应用研究-HelloDDNS(动态域名篇)的更多相关文章

  1. .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)

    .Net Core跨平台应用研究-CustomSerialPort -增强型跨平台串口类库 摘要 在使用SerialPort进行串口协议解析过程中,经常遇到接收单帧协议数据串口接收事件多次触发,协议解 ...

  2. .net core跨平台应用研究-ubuntu core下配置.net core运行时

    引言 年初研究了一阵子.net core跨平台应用,先后发表了几篇应用研究的文章.因工作原因,忙于项目上线,有一阵子没来博客园写文章了.最近项目基本收尾,抽空翻了下自己的博客,廖廖几篇文章,真让人汗颜 ...

  3. .Net Core跨平台应用研究-HelloArm(串口篇)

    引言 为了验证采用dotnet core技术开发的物联网设备数据采集接入服务应用是否能在高性价比的linux嵌入式平台运行,针对dotnet core应用程序进行嵌入式linux环境的发布部署运行验证 ...

  4. .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇

    .NET Core 跨平台 GUI 开发之 GTtkSharp 初级篇 本文作为初级篇,适合已经安装好.NET Core 环境以及 Gtk 环境,并具备了 C#开发基础知识,能跑一些简单的例子,希望更 ...

  5. .NET Core跨平台:使用.NET Core开发一个初心源商城总括

    1..NET Core基本介绍 a 作为一个.NET的开发者,在以前的开发中,我们开发的项目基本都是部署在windows服务器上,但是在windows服务器上的话某些比较流行的解决访问量的方案基本都是 ...

  6. [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建

    [.net 面向对象程序设计深入](9).NET Core 跨平台开发环境搭建 1.概述 读前必备:认识.NET Core 上篇介绍了.NET 新的生态环境:包括.NET Framework..NET ...

  7. .NET Core跨平台的奥秘[上篇]:历史的枷锁

    微软推出的第一个版本的.NET Framework是一个面向Windows桌面和服务器的基础框架,在此之后,为此微软根据设备自身的需求对.NET Framework进行裁剪,不断推出了针对具体设备类型 ...

  8. 在Azure Container Service创建Kubernetes(k8s)群集运行ASP.NET Core跨平台应用程序

    引子 在此前的一篇文章中,我介绍了如何在本地docker环境中运行ASP.NET Core跨平台应用程序(http://www.cnblogs.com/chenxizhang/p/7148657.ht ...

  9. .NET Core跨平台的奥秘[中篇]:复用之殇

    在<.NET Core跨平台的奥秘[上篇]:历史的枷锁>中我们谈到:由于.NET是建立在CLI这一标准的规范之上,所以它天生就具有了"跨平台"的基因.在微软发布了第一个 ...

随机推荐

  1. filter以及reduce的用法

    简单的写了就几个例子 # 删掉偶数 li = [1,2,3,4,5,6,7,8,9,10] print(list(filter( lambda x : not x % 2 ==0 ,li))) #保留 ...

  2. Java学习——方法

    在这一次的学习中我觉得首先要了解: 什么是方法呢 方法又怎么定义与调用 上面这段代码是我们经常写到的,其实它就是一个方法,其中 public 是修饰符 void是返回值类型 main就是方法名 arg ...

  3. sql server 字符串根据指定分隔符进行分组

    SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO --功能:分拆字符串 --参数:@String:要分拆的字符串:@Delimiter:分割符号 --返回值: ...

  4. 微信小程序 数据库指引 前端操纵数据库失败

    把注释解开后,点击添加显示失败了 看了下注解,发现是数据库权限问题, 修改一下成第一个,然后点击又失败了,多点击几下,就会成功! 哦 别忘了时刻 ctrl +s 保存,如果你习惯了idea 自动保存的 ...

  5. ionic 3.0中使用原生插件ionic-native

    作为一个ionic的新手,今天使用了ionic的原生粘贴板插件  @ionic-native/clipboard,根据ionic官方文档上执行的命令 $ ionic cordova plugin ad ...

  6. C# socket通讯 send方法记录

    由于本人是Java入门的开发,在C#开发中遇到的问题,在此记录一下: 1.client端的send方法不管发送出去没发送出去,总是显示发送出去. 查资料得知,send方法是将数据发送到缓存区,并不是直 ...

  7. javascript 对象数组排序(按照科目级次)

    需求 从后台获取的数据是这样的                  上帝要这样的 背景 从后台获取到表格数据,然后填充到excel.当然是用js来填充的.js 本身的数组具有sort()功能.但是是针对 ...

  8. vmware虚拟机安装了linux(redhat)系统忘记登录密码怎么办

    今天,打开了以前装过的vmware虚拟机,正常启动之后,一直想不起登录密码,怎么都是登录不进去.然后在网上查找资料,最后重置了密码.下面,分享下具体操作过程. 1.重新启动虚拟机,在出现启动进度条时按 ...

  9. aiohttp AppRunner的用法

    参考廖雪峰的aiohttp教程,会出现两个DeprecationWarning, loop argument is deprecated Application.make_handler(...) i ...

  10. curl传输数据时遇到的问题整理

    1.get传参,参数带有空格的传输方式 因为使用get传输的时候,有的参数可能存在有空格,为了避免传输是错误是字符替代“%20” 或者使用函数转译一下参数http_build_query($param ...