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

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 本文主要介绍 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 隧道开实现。这是一个.NET开发的开源的内网穿透工具。当然你也可以使用其他的第三方内网穿透工具,这里不再举例。

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

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 服务商的服务外,我们也可以拿出我们程序猿之前给女朋友买的,那些便宜的,女朋友并不喜欢的,域名来,优势当然就是,自己的域名,自己选的,想怎么解析前缀就怎么解析。

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

SSL证书自动申请

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

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

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

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

SangServerTool

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

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

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

CommandLineParser

SangServerTool 包含两款工具:

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

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

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

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

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

DDNS

参数说明:

参数 说明
-c, --config Required. 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

该功能的配置文件使用 AccessDDNS 这两段。


{
  "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, --config Required. 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

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

在配置 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 检测网站

相关文章
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
100 3
|
16天前
|
Java 网络安全 Maven
Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
【10月更文挑战第26天】Exception in thread "main" java.lang.NoSuchMethodError: okhttp3.OkHttpClient$Builder.sslSocketFactory(Ljavax/net/ssl/SSLSocketFactory;Ljavax/net/ssl/X509TrustManager;)Lokhttp3/OkHttpClient$Builder; 问题处理
34 2
|
3天前
|
安全 网络安全 数据安全/隐私保护
单域名、多域名、通配符 SSL 证书,你选对了吗?
SSL证书是保护上网安全的重要工具,相当于网站的身份证,确保信息不被窃取。单域名证书保护一个网站,多域名证书可保护多个网站,通配符证书则保护主域名下的所有子域名。选择哪种证书取决于网站规模和需求
|
27天前
|
测试技术 API 开发者
精通.NET单元测试:MSTest、xUnit、NUnit全面解析
【10月更文挑战第15天】本文介绍了.NET生态系统中最流行的三种单元测试框架:MSTest、xUnit和NUnit。通过示例代码展示了每种框架的基本用法和特点,帮助开发者根据项目需求和个人偏好选择合适的测试工具。
37 3
|
6天前
|
安全 数据建模 测试技术
只有ip没有域名怎么申请SSL
在没有域名只有IP地址的情况下,仍可申请SSL证书。需确保拥有固定公网IP地址和服务器管理权限,选择支持IP SSL证书的CA(如JoySSL),完成注册、购买、验证、安装和测试等步骤,实现HTTPS加密访问。注意证书有效期、兼容性和安全性。
|
30天前
|
安全 网络安全 数据安全/隐私保护
【Azure Developer】System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
System.Net.WebException: The request was aborted: Could not create SSL/TLS secure channel.
|
1月前
|
安全 应用服务中间件 Shell
nginx配置https的ssl证书和域名
nginx配置https的ssl证书和域名
|
1月前
|
网络安全
阿里云国际版如何为SSL证书更换域名?
阿里云国际版如何为SSL证书更换域名?
|
1月前
|
SQL 开发框架 .NET
ASP.NET连接SQL数据库:实现过程与关键细节解析an3.021-6232.com
随着互联网技术的快速发展,ASP.NET作为一种广泛使用的服务器端开发技术,其与数据库的交互操作成为了应用开发中的重要环节。本文将详细介绍在ASP.NET中如何连接SQL数据库,包括连接的基本概念、实现步骤、关键代码示例以及常见问题的解决方案。由于篇幅限制,本文不能保证达到完整的2000字,但会确保
|
2月前
|
监控 网络协议 API
.NET WebSocket 技术深入解析,你学会了吗?
【9月更文挑战第4天】WebSocket 作为一种全双工协议,凭借低延迟和高性能特点,成为实时应用的首选技术。.NET 框架提供了强大的 WebSocket 支持,使实时通信变得简单。本文介绍 WebSocket 的基本概念、.NET 中的使用方法及编程模型,并探讨其在实时聊天、监控、在线游戏和协同编辑等场景的应用,同时分享最佳实践,帮助开发者构建高效实时应用。
139 12

相关产品

  • 云解析DNS
  • 推荐镜像

    更多