用.NET做DDNS动态域名解析和SSL证书申请

本文主要介绍 IPv6 配置 DDNS 解析和 SSL 证书申请工具的开发历程和其中的相关知识。工具使用.NET开发,已开源,目前该工具的域名解析只支持阿里云。文中提及或使用的 .NET 开源项目:SangServerTool(DDNS,SSL证书申请工具),FastTunnel(内网穿透工具),Certes(ACME证书申请库),CommandLineParser(命令行解析库)

背景

前几天用.NET玩IoT设备,拿出了角落吃灰的Jetson Nano。近期也买了一堆传感器,还在路上,准备到手之后,好好捣鼓一番。Nano设备呢,虽然没有一直开机,但是连上了智能插座,随时待命。

这里不禁要吐槽一下小爱同学,我把插座命令为了“Jetson Nano”,然后怎么叫它,小爱就是不应。行吧,我只能叫他“二蛋”了,啊,不,“小电脑”(然后还被时不时听成“手电筒”)。

为了让后期的使用可以随时随地,更顺手些,那网络的处理是必不可少的。

如何在外网访问内网服务

如果你也有一台树莓派或者Jetson设备,想让其在外网提供服务,那么一般有这么几条路:

1.在路由器中将设备设置为DMZ区2.在路由器中配置虚拟主机3.借助其他第三方内网穿透工具

因为现在一般都是光宽带了,前两种呢需要拿到光猫的管理员账户,账户需要费些功夫。除非你是桥接的网络,用的自家路由器拨号。

第三种,如果你有一台外网的服务器,可以借助开源项目 FastTunnel[1] 隧道开实现。这是一个.NET开发的开源的内网穿透工具。当然你也可以使用其他的第三方内网穿透工具,这里不再举例。

工具虽好,然则不能全速走宽带的公网带宽着实非完美的方案。那么有没有更好的方案呢?当然有了,现在IPv6如此普及,待我ipconfig一观:

4f728e791fb3fbc1b4aac24011fdda58.png

ipconfig

果然比沙子还多,诚不欺我。但当我拿出之前的 nodejs 项目修改了IP监听后,兴致勃勃的用手机浏览器访问了这个 IPv6 站点,我不禁开始怀疑人生了。服务没法访问就算了,还 ping 不通。在折腾了几番电脑防火墙和管理员身份启动之后,已是半夜。无奈只好躺在床上简单搜索了几番答案,便去找周公探讨究竟是哪里出了问题。

翌日,再次打开电脑我才发现,果然不能老熬夜啊,我监听的IP竟然是 0.0.0.0 ,这是IPv4的!IPv6要用 :: 。这次等我再次用手机流量访问网站,果然就顺利了许多。完全不需要什么电脑防火墙给开入站规则用管理员去权限嘛,直接就进来了。

知识点:

1.包含端口号的 IPv6 地址 http://[0:0:0:0:0:ffff:4137:270a]:9080/2.IPv6 监听的 :: 和 IPv4 的 0.0.0.0 等效3.IPv6 监听的 ::1 和 IPv4 的 127.0.0.1 等效,都是环回接口

什么是 DDNS

我想大家应该都清楚域名解析是什么,就是将不好记的IPv4地址变为好记的域名嘛。DDNS 多的D 呢,是 Dynamic ,顾名思义就是将我们老变的宽带IP变成固定的域名访问。

之前我们拿到了一串那么长的 IPv6 地址,不仅是分配的IP老变的问题,再说他也不好记啊。

这时,我们除了使用常见的 DDNS 服务商的服务外,我们也可以拿出我们程序猿之前给女朋友买的,那些便宜的,女朋友并不喜欢的,域名来,优势当然就是,自己的域名,自己选的,想怎么解析前缀就怎么解析。

好的,那么假设你有一个阿里云域名(要已备案),通过 解析管理接口[2] 我们很容易就能自己做一个 DDNS 服务出来。

SSL证书自动申请

既然 DDNS 要自己整活,那之前写的自动域名证书续签服务也可以直接整合进来,做个新的工具。毕竟,现在是个网站都用 https 了。

证书自动申请这里使用的是 Certes[3] 库来实现 Let’s Encrypt 证书的自动续签。

Let’s Encrypt 是一个证书颁发机构(CA)。要从 Let’s Encrypt 获取网站域名的证书,只需要证明对域名的实际控制权即可。有两种验证方式,通过域名解析添加 TXT 记录,或是在网站添加指定的验证文件(实现访问指定地址返回要求的字符串即可,不过不支持有通配符的申请)。

那么假设你有一个域名,通过接口解析管理这也很好实现。

SangServerTool

将两个功能整合成一个小工具,我起名叫 SangServerTool ,开源地址:https://github.com/marin1993/SangServerTool 。

依赖 .NET 跨平台的特性,可以方便的在各种服务器上使用。

作为一个控制台应用程序,在参数解析上使用 CommandLineParser[4] 这个命令行解析库。这个库提供了简洁明了的 API,用于操作命令行参数和相关任务,并提供帮助界面。

03ea8a3351001779bc71f54d0a30ae46.png

CommandLineParser

SangServerTool 包含两款工具:

•服务器 DDNS 工具,用于内网服务动态域名解析,支持 IPv6•服务器 SSL 证书申请工具

目前仅支持阿里云,其他云服务的实现可以自行添加。

提供独立的 linux-x64、linux-arm、linux-arm64、win-x64 下载[5]。其他平台可自行通过源码编译发布。

这个服务的启动一般来说不需要一直运行。DDNS可以在设备开启时检测一次,以后每间隔一段时间检测一次,如一小时。SSL证书申请,可以每天0点固定检查一次即可,将要过期时,程序会自动进行续期,更新证书。注意 nginx 等服务需要重新加载一下证书,可配置 Certificate:okshell 来实现申请成功调用你指定的脚本文件。

工具的使用可以通过传入不同的参数和配置文件来实现不同的功能。DDNS和SSL证书申请作为工具,只需要根据自己的需求设置好计划任务即可,下面介绍这两个功能的基本使用。

DDNS

参数说明:

参数说明
-c, --configRequired. Set config json file.
设置配置文件路径
--delay(Default: 0) How many seconds delay?
启动后延迟多少秒进行检查处理,默认为 0,防止开机启动过早导致出现一些问题
--del(Default: false) Is delete DDNS?
删除配置文件中设置的DDNS域名解析,默认为 false ,如果为 true,则尝试删除后退出
--v6(Default: false) Is ipv6?
使用 IPv6 来解析,默认获取 IPv4
--ip(Default: ) If set will be used. Otherwise automatically obtained.
You can set 'ifconfig', It will check from 'https://ifconfig.me/ip' to get you Internet IP.
默认为空字符,如果传入了指定 IP ,则使用这个 IP 来解析。
可以传入 'ifconfig' 值,该值则表示通过网络获取网络出口 IP 来解析

如:使用本地的 IPv6 进行 DDNS 设置

SangServerTool ddns -c "test.json" --v6=1

如:删除 DDNS 的域名解析

SangServerTool ddns -c "test.json" --del=1

该功能的配置文件使用 Access 和 DDNS 这两段。

{"Access": {"AK": "阿里云 AccessKeyId",  //AccessKeyId"SK": "阿里云 AccessKeySecret" //AccessKeySecret},"DDNS": {"ddns": "xxx.domain.com",  // DDNS要解析的域名"basedomain": "domain.com"  // 主域名}
}

这一功能的核心其实是电脑网卡IP的获取,需要判断网卡的类型,排除回环和临时和本地的 IPv6 地址(临时IPv6不会第一个FirstOrDefault()就可以了)。

/// <summary>
/// 获取电脑网卡IP
/// </summary>
/// <param name="isV6">是获取IPv6</param>
/// <returns></returns>
public static string? CurrentIPAddress(bool isV6 = false)
{var family = isV6? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork;List<string> exps = new List<string> { "docker0", "lo", "l4tbr0" };var ips = NetworkInterface.GetAllNetworkInterfaces().Where(p => !exps.Contains(p.Name)) // 排除docker、lo等.Select(p => p.GetIPProperties()).SelectMany(p => p.UnicastAddresses).Where(p => p.Address.AddressFamily == family && !IPAddress.IsLoopback(p.Address));//IPv6 时去除本地的if (family == AddressFamily.InterNetworkV6){ips = ips.Where(p => !p.Address.IsIPv6LinkLocal);}return ips.FirstOrDefault()?.Address.ToString();
}

SSL

参数说明:

参数说明
-c, --configRequired. Set config json file.
设置配置文件路径
--retry(Default: 2) How many retries?
验证域名时重试几次,默认2次
--delay(Default: 10) How many seconds to retry?
验证域名时重试间隔多少秒,默认10秒

如:申请域名重试 3 次

SangServerTool ssl -c "test.json" --retry=3

该功能的配置文件使用 Access 、 Certificate 、 ACME 、CSR ,文章不详细介绍配置文件,详细配置文件说明可前往仓库查阅。

在配置 Certificate 信息时:

•如果是新申请的只需要配置好证书 cerpath 和证书私钥 privatekey 的存放路径,程序会自行生成。若已经有证书会私钥配置好其位置会自行更新证书或使用当前已有的私钥。•domains 支持多个域名,使用空格隔开•okshell 证书更新后执行的脚本文件,如果服务器不能热加载证书,记得配置好,通过脚本文件进行重启服务

在配置 ACME 信息时:

•如果第一次使用仅需要写上你的邮箱 email 和存放 ACME 账户的私钥文件位置 account,证书过期会收到邮件提醒•如果之前已有账户,可以使用已有的账户私钥,配置给 account

关于 CSR ,这段配不配都无所谓,毕竟是免费的证书,也不会生效,只是验证了域名的归属权。

DDNS 配置使用示例

下面以 Jetson Nano 为例,演示其 DDNS 功能的配置使用。Windows 系统可通过“任务计划程序”进行类似操作。

1.首先,前往仓库的 releases 下载程序上传到 Jetson Nano,然后添加执行权限。2.按照说明编写自己的配置文件3.编写开机启动服务

sudo vi /etc/systemd/system/ddns.service

文件内容如下:

[Unit]
Description=SangServerTool DDNS
After=network.target
ConditionPathExists=/home/sangsq/.tools/SangServerTool[Service]
Type=forking
ExecStart=/home/sangsq/.tools/SangServerTool ddns -c /home/sangsq/.tools/config.json --v6=1 --delay=30
TimeoutSec=0
StandardOutput=journal+console
RemainAfterExit=yes[Install]
WantedBy=multi-user.target

ConditionPathExists 为刚上传的程序文件地址,当其存在这个服务才会启动

ExecStart 这里要写程序和配置文件的全路径,在这里我用的是 IPv6 地址进行解析。保险起见,服务启动后延迟 30 秒后开始执行,主要是接口查询需要访问阿里云服务器,刚启动的时候,直接运行可能会报 DNS 解析的错误,也许使用 After=network-online.target 会解决,不过没有测试这个。

1.设置开机启动服务

sudo systemctl enable ddns.service

1.添加计划任务

除了开机启动外,我们也可以通过计划任务,半个小时执行以下程序,检查 IP 是否有变化。

sudo crontab -e

添加计划任务

*/30  *  *  *  * /home/sangsq/.tools/SangServerTool ddns -c /home/sangsq/.tools/config.json --v6=1

这里去除了延迟的检测,因为不是刚开机了。

1.其他

SSL 证书申请也可以通过计划任务处理,每天 0 点检查一次,如果服务器不能热加载证书,记得在配置文件配置好 okshell ,来实现 web 服务器的重启。

后记

这篇文章随着软件的开发迭代,修修改改,终于算是告一段落。后续好好整活这个台小电脑,再补充写一些其他的硬件设备。

目前手机的网络应该是都有 IPv6 地址的,但是如果你使用的网络只接入了 IPv4,那么你就不能访问纯IPv6的服务器。如果运营商支持,但是你的路由器不支持,你也是无法使用 IPv6 网络的。如果你想检测自己的 IPv6 可用性,可以访问这个 IPv6 检测网站[6] 。

References

[1] FastTunnel: https://gitee.com/Hgui/FastTunnel
[2] 解析管理接口: https://help.aliyun.com/document_detail/29771.html
[3] Certes: https://github.com/fszlin/certes
[4] CommandLineParser: https://github.com/commandlineparser/commandline
[5] linux-x64、linux-arm、linux-arm64、win-x64 下载: https://github.com/marin1993/SangServerTool/releases/latest
[6] IPv6 检测网站: http://test-ipv6.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

汇编学习(一)

看的是王爽老师的《汇编语言》第三版基础知识 一.汇编语言的诞生上古时期在汇编语言还未出现的时候&#xff0c;那时的程序员还只能用二进制也就是所谓的机器语言写代码&#xff0c;将0和1编成的程序代码打在纸带或卡片上&#xff0c;再将纸带卡片输入计算机&#xff0c;进行运…

【GIS风暴】GeoJSON数据格式案例全解

在了解GeoJSON数据之前,先来通过一个网站和一个简单的代码案例,看一下GeoJSON的神奇魅力吧! 网站:http://geojson.io 打开上述网站,在左侧的代码区域粘入中国区域GeoJSON代码,如下所示: 中国地图: 地名:

[转]2020年5月程序员工资统计,平均14542元

平均工资 2020年5月全国招收程序员312761人。2020年5月全国程序员平均工资14542元&#xff0c;工资中位数12500 元&#xff0c;其中95%的人的工资介于5250元到35000元。 一线城市工资 2020年5月北京招收软件工程师24478人。2019年5月北京软件工程师平均工资19273元&#xff0…

云原生IDE:iVX免费的首个通用无代码开发平台

一、iVX简单介绍 1、iVX是什么东东? iVX 是一个 “零代码” 的可视化编程语言&#xff0c;拥有方便的 在线集成开发环境 &#xff0c;不需要下载开发环境&#xff0c;打开浏览器即可随时随地的进行项目编辑&#xff1b;iVX 拥有 “一站式” 的云资源&#xff0c;通过这一套一…

.NET GC工作流程

前言在上文[如何获取GC的STW时间]一文中&#xff0c;我们聊到了如何通过监听GC发出的诊断事件来计算STW时间。里面只简单的介绍了几种GC事件和它的流程。群里就有小伙伴在问&#xff0c;那么GC事件是什么时候产生的&#xff1f;分别是代表什么含义&#xff1f;那么在本文就通过…

libco协程库源码解读

2019独角兽企业重金招聘Python工程师标准>>> 协程,又被称为用户级线程,是在应用层被调度,可以减少因为调用系统调用而阻塞的线程切换的时间.目前有很多协程的实现,由于微信内部大量使用了其直研的的libco协程库&#xff0c;所以我选择了腾讯开源的libco协程库进行研…

【ArcGIS风暴】如何将矢量数据(点、线、面)折点坐标转为GeoJSON格式?

本文以案例的形式,讲述在ArcGIS和QGIS专业软件中,将矢量数据转为GeoJSON的方法。 扩展阅读:【GIS风暴】GeoJSON数据格式案例全解 文章目录 一、ArcGIS将矢量数据转为GeoJSON二、QGIS将矢量数据转为GeoJSON一、ArcGIS将矢量数据转为GeoJSON ArcGIS中提供的【要素转JSON】工具…

TypeScript 3.9 正式发布!平均编译时长从 26 秒缩短至 10 秒

作者 | 微软官方博客 译者 | 核子可乐 策划 | 小智 稿源 | 前端之巅 今天&#xff0c;微软在其官方博客宣布&#xff1a;TypeScript 3.9 版本已经正式发布&#xff0c;详情见下文。 有些朋友可能对 TypeScript 还不太熟悉&#xff0c;这是一种以 JavaScript 为基础开发的语…

(二)Harbor WEB的使用

接上一篇《安装Harbor》&#xff0c;安装好之后&#xff0c;接下来我们就进行Harbor web界面的操作吧&#xff01; 转载请标明出处&#xff1a;http://www.cnblogs.com/huangjc/p/6270405.html 浏览器登陆Harbor&#xff08;默认用户密码&#xff1a;admin/Harbor12345&#x…

iVX低代码平台系列制作简单的登录界面

一、前言 iVX是啥&#xff0c;不理解的小伙伴可以猛戳这里 ----------------------点我 二、iVX平台和现有编程语言的对比 三、iVX平台和现有编程语言的对比 1、快速学习&#xff08;周期短&#xff09; iVX逻辑上相对是比较简单的 所以初学者的话只需要从逻辑和具体功…

Process.Start 为什么会引发“系统找不到指定的文件”异常

前言偶然发现&#xff0c;如果想用如下代码在 .NET 6 中打开指定 URL&#xff1a;Process.Start("https://baidu.com");会引发异常&#xff1a;而同样的代码在 .NET Framework 中是可以正常执行的。难道&#xff0c;.NET 6 下的实现逻辑不一样&#xff1f;深入探究通…

JVM 类型的生命周期学习

Java虚拟机通过装载、连接和初始化一个JAVA类型&#xff0c;使该类型可以被正在运行的JAVA程序所使用&#xff0c;其中&#xff0c;装载就是把二进制形式的JAVA类型读入JAVA虚拟机中&#xff1b;而连接就是把这种读入虚拟机的二进制形式的类型数据合并到虚拟机的运行时状态中去…

js对象数组中的某属性值 拼接成字符串

var arr[{id: "600", pId: null, name: "图形的变化"},{id: "630", pId: "600", name: "投影与视图"},{id: "631", pId: "630", name: "投影"},{id: "632", pId: "630",…

开店星简直就是国内优秀的开源商城系统天花板

一、场景 1、大学生毕业设计做商城系统背景 好家伙、又到开学季节了&#xff0c;师妹让我帮忙给指导大四的项目&#xff0c;作为毕业设计和为后面找工作积累项目经验&#xff0c;要搞一个买卖二手闲置品的商城小程序和PC端商城、希望能够快速学习、接入、修改部分功能&#xff…

【CASS精品教程】CASS9.1土方量的计算方法汇总

CASS9.1中,计算土方量的方法有:DTM法土方计算、断面法进行土方量计算、方格网法土方计算、等高线法土方计算、区域土方量平衡等。本文以案例的形式,详细讲解土方量的计算过程。 文章目录 一、DTM法土方计算二、断面法进行土方量计算三、方格网法土方计算四、等高线法土方计算…

VS2019 禁止Web项目停止调试后自动关闭浏览器(在浏览器窗口关闭时停止调试程序,在调试停止时关闭浏览器)

很多文章都说要修改以下两处与“编辑并继续”有关的选项&#xff1a; “编辑并继续”是一种省时的功能&#xff0c;使你能够在程序处于中断模式时更改源代码。 通过选择执行命令&#xff08;如 "继续" 或 "单步执行"&#xff09;继续执行程序时&#xff0c…

【ArcGIS风暴】ArcGIS中等高线高程标注/注记(打断/消隐)方法案例汇总

本文以案例的形式,图文并茂详细讲解在ArcGIS 10.6中,等高线高程标注、注记的方法。 文章目录 一、属性标注二、Maplex工具标注1. 使用Maplex标注引擎2. 标注转换为注记3. 要素轮廓线掩膜4. 使用掩膜选项进行绘制参考阅读: 【CASS精品教程】CASS9.1等高线的绘制完整案例教程 …

Blazor University (35)表单 —— 编写自定义验证

原文链接&#xff1a;https://blazor-university.com/forms/writing-custom-validation/编写自定义验证源代码[1]请注意&#xff0c;与有关 EditContext、FieldIdentifiers 和 FieldState[2] 的部分一样&#xff0c;这是一个高级主题。如前所述&#xff0c;FieldState 类保存表…

HTML 元素内部添加预加载

CSS&#xff1a; /*元素内部加载loading*/.innerLoading {height: 100%;width: 100%;display: flex;justify-content: center;align-items: center;}.innerLoading * {text-align: center;color: #737782cc;fill: #73777A;font-size: 1em !important;font-family: SimSun,SimHe…

Windows下怎样安装Tomcat

Tomcat 是开源的WEB应用容器&#xff0c;所以受到各位程序员和公司的亲赖。在这里给大家介绍一下如何在Windows环境下安装Tomcat绿色版本&#xff0c;希望能够对大家有帮助。 1.首先去Tomcat官网下载Tomcat软件&#xff0c;在百度中搜索Tomcat,进入英文网址http://tomcat.apach…