本文主要介绍IPv6配置DDNS解析和SSL证书申请工具的开发流程和相关知识。 该工具是使用.NET 开发的并且是开源的。 目前该工具的域名解析仅支持阿里云。 文中提到或使用到的.NET开源项目:(DDNS、SSL证书申请工具)、(内网穿透工具)、(ACME证书申请库)、(命令行解析库)
背景
前几天,我正在使用.NET玩物联网设备,我拿出了角落里积满灰尘的Nano。 我最近买了一堆传感器,它们还在路上。 我打算拿到之后和他们一起玩。 至于Nano设备,虽然它不是一直开机的,但它连接到智能插座,随时可以使用。
在这里我忍不住吐槽一下小艾。 我将插座命名为“Nano”,然后随心所欲地称呼它,但小爱同学就是没有反应。 好吧,我只能叫他“二蛋”,啊不,“小电脑”(然后时不时也叫“手电筒”)。
为了让后期随时随地使用更加方便,网络处理是必不可少的。
如何从外网访问内网服务
如果你也有一个树莓派或者设备,想让它对外网提供服务,一般有以下几种方式:
1、在路由器中将设备设置为DMZ区域 2、在路由器中配置虚拟主机 3、使用其他第三方内网穿透工具
因为现在普遍使用光纤宽带,前两种需要获取光模式的管理员帐号,而且帐号需要费点功夫。 除非你有桥接网络并使用自己的路由器拨号。
第三,如果有外部服务器,可以使用开源项目[1]来实现隧道。 这是.NET开发的开源内网渗透工具。 当然,你也可以使用其他第三方内网渗透工具,这里就不举例了。
虽然工具很好,但是如果公网带宽不能全速使用,那么它并不是一个完美的解决方案。 那么有没有更好的解决方案呢? 当然,现在IPv6这么流行,我来看看:
它确实不仅仅是沙子,别骗我。 但当我拿出之前的项目,修改了IP监控,然后饶有兴致地用手机浏览器访问这个IPv6站点时,我不禁开始怀疑自己的人生。 即使无法访问服务,也无法ping通。 在与计算机防火墙进行了一番斗争并以管理员身份激活之后,已经是午夜了。 我只好躺在床上简单地寻找答案,然后去找周公商量到底是怎么回事。
第二天,当我再次打开电脑时,我发现我无法熬夜了。 我监控的IP居然是0.0.0.0,也就是IPv4! 对 IPv6 使用 ::。 这次再用手机数据访问网站,竟然流畅多了。 不需要任何计算机防火墙打开入站规则。 管理员需要删除权限。 可以直接访问。
知识点:
1. 包含端口号 [0:0:0:0:0:ffff:4137:270a]:9080/2 的 IPv6 地址。 IPv6监听::相当于IPv4 0.0.0.0 3. IPv6监听::1相当于IPv4的127.0.0.1,都是环回接口
什么是动态域名解析
我想大家应该知道什么是域名解析,就是把一个难记的IPv4地址变成一个好记的域名。 DDNS,顾名思义,就是将我们老化的宽带IP变成固定的域名进行访问。
我们之前得到过这么长的IPv6地址。 分配的IP不仅会随着时间的推移而变化,而且也很难记住。
这时候我们除了使用常见的DDNS服务商的服务之外,还可以使用我们程序员之前给女朋友买的域名,那些女朋友不喜欢的便宜的,好处当然是是我们自己的。 您自己选择域名,并且可以按照您想要的方式解析前缀。
好吧,那么假设你有一个阿里云域名(必须注册),我们就可以通过解析管理接口轻松地自己做一个DDNS服务了[2]。
SSL证书自动申请
由于DDNS需要自己处理,所以之前写的自动域名证书续订服务也可以直接集成到其中,成为一个新的工具。 毕竟现在每个网站都使用https。
证书自动申请使用[3]库来实现Let's证书的自动续订。
Let's 是一个证书颁发机构 (CA)。 要获得Let's网站域名的证书,您只需证明对该域名的实际控制权即可。 验证方式有两种,通过域名解析添加TXT记录,或者在网站上添加指定验证文件(只需访问指定地址并返回所需字符串,但不支持带通配符的应用)。
那么假设你有一个域名,通过接口解析和管理这也是很容易实现的。
将这两个功能整合成一个小工具,我将其命名为,开源地址:。
依托.NET的跨平台特性,可以方便地在各种服务器上使用。
作为控制台应用程序,使用命令行解析库[4]进行参数解析。 该库提供了简洁明了的API用于操作命令行参数和相关任务,并提供了帮助界面。
包含两个工具:
•服务器DDNS工具,用于内网服务动态域名解析,支持IPv6 •服务器SSL证书申请工具
目前仅支持阿里云。 其他云服务的实现可以自行添加。
提供linux-x64、linux-arm、linux-arm64、win-x64的独立下载[5]。 其他平台可以自行通过源码编译发布。
一般来说,这个服务的启动不需要一直运行。 DDNS 可以在设备开机时检测一次,然后每隔一段时间(例如一小时)检测一次。 申请SSL证书,您可以在每天0:00查询一次。 当证书即将过期时,程序会自动续订并更新证书。 注意nginx等服务需要重新加载证书,可以配置:成功申请并调用您指定的脚本文件。
使用工具可以通过传入不同的参数和配置文件来实现不同的功能。 DDNS和SSL证书申请都是工具。 您只需根据自己的需要设置计划任务即可。 下面介绍这两个函数的基本使用。
动态域名服务器
参数说明:
范围
阐明
-C, -
。 设置 json 文件。
设置配置文件路径
- 延迟
(: 0) 有多少次延误?
启动后延迟多少秒进行检查和处理,默认为0,防止过早启动引起的一些问题
--删除
(: false) 是DDNS吗?
删除配置文件中设置的DDNS域名解析。 默认为 false。 如果是,请尝试删除并退出。
--v6
(: false) 是ipv6吗?
默认使用IPv6解析获取IPv4。
--ip
(: ) 如果设置将被使用。 。
你可以设置'',它会从''检查来获取你的IP。
默认为空字符。 如果传入指定的IP,则使用该IP进行解析。
可以传入''值,表示通过网络获取网络出口IP进行解析。
例如:使用本地 IPv6 进行 DDNS 设置
SangServerTool ddns -c "test.json" --v6=1
例如:删除DDNS的域名解析
SangServerTool ddns -c "test.json" --del=1
该功能的配置文件使用和DDNS两段。
{
"Access": {
"AK": "阿里云 AccessKeyId", //AccessKeyId
"SK": "阿里云 AccessKeySecret" //AccessKeySecret
},
"DDNS": {
"ddns": "xxx.domain.com", // DDNS要解析的域名
"basedomain": "domain.com" // 主域名
}
}
这个功能的核心其实就是获取电脑网卡的IP。 需要确定网卡的类型并排除环回和临时和本地 IPv6 地址(临时 IPv6 不会是其上的第一个 ())。
///
/// 获取电脑网卡IP
///
/// 是获取IPv6
///
public static string? CurrentIPAddress(bool isV6 = false)
{
var family = isV6? AddressFamily.InterNetworkV6 : AddressFamily.InterNetwork;
List
exps = new List { "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, -
。 设置 json 文件。
设置配置文件路径
- 重试
(:2) 有多少?
验证域名时重试多少次,默认2次
- 延迟
(: 10) 重试多少次?
验证域名时重试之间的秒数,默认为10秒
例如:申请域名重试3次
SangServerTool ssl -c "test.json" --retry=3
该功能的配置文件使用ACME和CSR。 本文不详细介绍配置文件。 详细的配置文件说明可以在仓库中找到。
配置信息时:
•如果是新应用程序,只需配置证书和证书私钥的存储路径,程序会自行生成。 如果已有证书,则会配置私钥并自动更新其位置或使用现有私钥。 •支持多个域名,以空格分隔。 •证书更新后执行的脚本文件。 如果服务器无法热加载证书,记得通过脚本文件进行配置并重启服务。
配置ACME信息时:
•如果您是第一次使用,只需填写您的电子邮件地址和存储ACME帐户的私钥文件的位置。 如果证书过期,您将收到一封电子邮件提醒。 •如果您之前已有账户,可以使用已有的账户私钥并进行配置
至于CSR,匹配不匹配并不重要。 毕竟是免费证书,不会生效。 它只是验证域名的所有权。
DDNS配置使用示例
下面以Nano为例,演示其DDNS功能的配置和使用。 系统可以通过“任务计划程序”执行类似的操作。
1、首先到仓库的下载程序上传到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
就是刚刚上传的程序文件的地址。 该服务仅在存在时才会启动。
这里需要写出程序和配置文件的完整路径。 这里我使用IPv6地址来进行分析。 为了安全起见,服务会延迟 30 秒后启动。 主要原因是接口查询需要访问阿里云服务器。 首次启动时,如果直接运行可能会报DNS解析错误。 也许使用 After=- 。 可以解决问题,但是没有测试。 这。
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点检查。 如果服务器无法热加载证书,请记得在配置文件中配置以重新启动Web服务器。
后记
这篇文章随着软件的开发不断迭代修改,最终告一段落。 以后我会把这台小电脑盘活一下,再加上一些其他的硬件设备。
目前手机网络应该都有IPv6地址,但如果你使用的网络只能访问IPv4,那么你就无法访问纯IPv6服务器。 如果运营商支持但您的路由器不支持,您将无法使用 IPv6 网络。 如果您想检查您的 IPv6 可用性,可以访问此 IPv6 检测网站[6]。
[1]:
[2]解析管理接口:
[3]:
[4]:
[5]linux-x64、linux-arm、linux-arm64、win-x64下载:
[6]IPv6检测网站:
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。