基于阿里云 DNS API 实现的 DDNS 工具

0.简要介绍


0.1 思路说明

AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具,借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能。工具核心就是调用了阿里云 DNS 的两个 API ,一个 API 获取指定域名的所有解析记录,然后通过比对与当前公网 IP 是否一致,一致则不进行更改,不一致则通过另外一个修改 API 来修改指定子域名的修改记录。


0.2 使用说明

使用时请更改同目录下的 settings.json.example 为 settings.json 文件,同时也可以显示通过 -f 参数来制定配置文件路径。例如:

dotnet ./AliDDNSNet.dll -f ./settings.json2
./AliDDNSNet -f ./settings.json3

NAS 运行效果图:

640?wx_fmt=png


0.3.配置说明

通过更改 settings.json/settings.json.example 的内容来实现 DDNS 更新。

{// 阿里云的 Access Id"access_id": "",// 阿里云的 Access Key"access_key": "",// TTL 时间"interval": 600,// 主域名"domain": "example.com",// 子域名前缀"sub_domain": "test",// 记录类型"type": "A"}

其中 Access Id 与 Access Key 可以登录阿里云之后在右上角可以得到。

回到顶部

1.代码说明


1.1 主程序流程

主要流程代码在 Program.cs 文件当中编写,这里依次讲解一下。

首先加载配置文件,如果用户传入了 -f 参数,则使用用户传入的配置文件路径,否则的话直接使用当前目录的默认 settings.json 配置文件,读取成功之后存放到 Utils.config 属性当中以便 Utils 使用。

640?wx_fmt=png

之后通过 Utils.GetCurentPublicIP() 方法获取到当前设备的公网 IP,再判断指定的二级域名解析是否存在,如果不存在的话,则直接返回,这里并没有做新增解析操作,后续版本可能会加上。

640?wx_fmt=png

如果找到了对应二级域名的解析,则输出当前解析的记录值,然后进行比较,如果当前主机的公网 IP 与记录值一样则无需进行变更。

640?wx_fmt=png

当阿里云 DNS 解析记录与当前主机公网 IP 不一致的时候调用更新 API,传入之前的域名的 rrId 去进行变更,完成即退出。

640?wx_fmt=png


1.2 Utils 详解

Utils.cs 主要存放一些功能性方法,比如说将 SortedDictionary 字典转为请求字符串,还有就是加密方法,请求方法等。

1.2.1 生成通用参数字典

因为 API 请求的时候有很多共有参数,所以这里单独用了一个静态方法来生成这个公有请求参数的字典。

/// <summary>/// 生成通用参数字典/// </summary>public static SortedDictionary<string, string> GenerateGenericParameters()
{    var dict = new SortedDictionary<string, string>(StringComparer.Ordinal){{"Format", "json"},{"AccessKeyId", config.access_id},{"SignatureMethod", "HMAC-SHA1"},{"SignatureNonce", Guid.NewGuid().ToString()},{"Version", "2015-01-09"},{"SignatureVersion", "1.0"},{"Timestamp", DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ")}};    return dict;
}

可以看到这里使用了 SortedDictionary<string,string> 来处理,这是因为阿里云 API 必须要求按大小写敏感来排序请求参数,所以这里直接使用了 ```SortedDictionary 来处理这种情况。

1.2.2 根据字典构建请求字符串

因为阿里云 DNS 的 API 基本上都是 GET 请求,所以通过这个方法可以将之前的 SortedDictionary<string,string> 字典构建成请求字符串。

640?wx_fmt=png

核心就是遍历这个字典,通过 StringBuilder 来构建这个请求字符串。

1.2.3 生成请求签名

这一步也是最重要的一步,因为阿里云所有的 API 接口都需要传递签名参数,这个签名参数是根据你提交的参数集合 AccessKey 来进行计算的。

640?wx_fmt=png

这里之前我是按照阿里云 API 来进行开发的,不过有一点需要注意的是,返回的 Signature 值是不需要进行 URL 编码的。就因为这一点,我白白浪费了 3 个小时来排查问题,看看官方 API 文档说的:

640?wx_fmt=png

说需要将签名值编码之后再提交,扯淡,如果编码之后再提交的话,接口会一直返回:

Specified signature is not matched with our calculation.

这里直接返回 HMACSHA1 加密结果的 Base64 字符串即可。

1.2.4 发送请求

构建好一切之后我们就需要发送请求了,这里统一是使用的 SendRequest() 方法来进行处理,可以看到我们先获得签名,然后将获取到的签名追加到请求体内部,一起进行请求。

640?wx_fmt=png

这里传入的 IRequest 接口,是有具体实现的,可以转到 Main 方法里面看一下:

await Utils.SendGetRequest(new DescribeDomainRecordsRequest(config.domain));
await Utils.SendGetRequest(new UpdateDomainRecordRequest(rrId, config.sub_domain, config.type, currentIP, config.interval.ToString()));

这里的 DescribeDomainRecordsRequest 与 UpdateDomainRecordRequest 就是具体的请求体,定义很简单,就是实现了 IRequest 接口而已,然后在各自的内部添加一些特殊的参数。


1.3 异步 Main 方法

异步的 Main 方法需要 C# 7.1 以上版本才能支持,你只需要右键你的项目选择属性,左侧栏选择生成,找到高级按钮,更改当前 C# 语言版本即可。

640?wx_fmt=png

效果如下:

static async Task<int> Main(string[] args){    // 代码....return await Task.FromResult(0);
}


1.4 好用的 CommandLine 库

编写控制台程序,最主要的是接受参数然后处理,而 Microsoft.Extensions.CommandLineUtils 库提供了方便快捷的方式来为我们处理用户输入的参数。

使用方法如下:

640?wx_fmt=png

2.GITHUB 开源地址

https://github.com/GameBelial/AliDDNSNet

有兴趣的朋友可以 star 关注一下。


3.二进制程序下载地址

程序打包了 Linux-x64 与 Linux arm 环境的二进制可执行文件,你可以直接下载对应的压缩包解压到你的路由器或者 NAS 里面进行运行。

如果你的设备支持 Docker 环境,建议通过 Docker 运行 .NET Core 2.1 环境来执行本程序。

原文地址:https://www.cnblogs.com/myzony/p/9349578.html

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

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

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

相关文章

【拓扑排序】【DP】奖金(ssl 1325)

奖金 ssl 1325 题目大意&#xff1a; 有n个人&#xff0c;某个人要比另外一个人的工资高&#xff08;工资最低为100&#xff0c;最少多1元&#xff09;&#xff0c;问最少发多少工资 原题&#xff1a; 题目描述 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出&#x…

网络流24题

网络流24题 说在前边 一直没有完整的刷过这套题&#xff0c;打算最近一点点刷掉通过《最小割模型在信息学竞赛中的应用》及《浅析一类最小割问题》学习常规建图技巧飞行员配对方案问题 二分图最大匹配 #include <bits/stdc.h> typedef long long ll; const int inf 0x3f…

P3959-宝藏【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P3959 题目大意 nnn个点&#xff0c;mmm条边&#xff0c;求一棵有根生成树权值最小。对于一条边(fa,x,w)(fa,x,w)(fa,x,w)会产生权值depfa∗wdep_{fa}*wdepfa​∗w。 解题思路 我们模拟退火每次随机一个序列&#xff0c;然后…

ASP.NET Core Web API 集成测试中使用 Bearer Token

在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, 例如里面去掉了用户身份验证相关的中间件.但是有些被测试的行为里面需要用到身份/授权信息.所以本文就介绍一下在API集成…

桐桐的雷达

桐桐的雷达 题目大意&#xff1a; 有一堆数字&#xff0c;并给出一个范围&#xff0c;判断不在范围内的数字是否多过10%&#xff0c;若不多过&#xff0c;那输出范围内数字的平均值 原题&#xff1a; 题目描述 桐桐在去广州的路上&#xff0c;对高速公路上的测速雷达产生了…

Codeforces Round #497 (Div. 1)

Codeforces Round #497 (Div. 1) A. Reorder the Array 先满足数值较小的位置&#xff0c;每次找恰好大于这个值的一个值即可。 #include <bits/stdc.h> #define rep(i,a,b) for(int ia;i<b;i) #define pb push_back typedef long long ll; const int N 100200; usin…

jzoj6824-[2020.10.17提高组模拟]英雄联盟【期望】

正题 题目大意 开始暴击率为xxx&#xff0c;每次失败后都会增加xxx&#xff0c;成功后重置&#xff0c;然后求攻击1010610^{10^6}10106次后的暴击次数除以1010610^{10^6}10106 解题思路 定义ansansans为期望攻击多少次后暴击&#xff0c;然后答案为1ans\frac{1}{ans}ans1​。…

【模拟】桐桐的游戏

桐桐的游戏 题目大意&#xff1a; 有一个用数组成的环要从1跳到z&#xff08;有些点不能跳&#xff09;&#xff0c;每次跳的步数最少有多少步 原题&#xff1a; 题目描述 桐桐最近在玩一个跳棋游戏&#xff0c;规则是&#xff1a;有个圆圈&#xff0c;分成N等分&#xff…

ASP.NET Core 应用发布与部署指南

一、前言本篇主要包含哪些内容&#xff1f;将项目发布到本地目录将项目传输到服务器并配置启动&开机自动启动将Nginx作为访问入口&#xff0c;配置反向代理本篇环境信息开发环境&#xff1a;用途工具&版本操作系统Windows 10开发工具Visual Studio 2017&#xff08;15.…

jzoj6826-[2020.10.17提高组模拟]隔膜【博弈论】

正题 题目大意 n∗nn*nn∗n的矩形&#xff0c;每一个人操作时如果棋盘上有一个k∗kk*kk∗k的矩形空地就可以选择一个点堵上。如果没有就失败了&#xff0c;求必胜方。 解题思路 如果场地上有一个位置堵上后即可堵上所有k∗kk*kk∗k的矩形那么这个点被堵住后就赢了&#xff0c;…

牛客网暑期ACM多校训练营(第一场)

牛客网暑期ACM多校训练营&#xff08;第一场&#xff09; A. Monotonic Matrix 考虑0和1的分界线&#xff0c;1和2的分界线&#xff0c;发现问题可以转化为两条不互相穿过的路径的方案数&#xff08;可重叠&#xff09;&#xff0c;题解的做法就是把一条路径斜着平移&#xff0…

2014 ACM/ICPC Asia Regional Xi'an Online

2014西安网络赛 A. Post Robot 把每种单词都kmp跑一遍&#xff0c;顺序输出即可 #include <cstdio> #include <iostream> #include <algorithm> #include <map> #include <cstring> #include <cmath> #include <queue> #include <…

MongoDB发布4.0版本,支持ACID事务

MongoDB最近发布了最新的4.0版本。毫无疑问&#xff0c;这一版本的主要特性是支持多文档ACID事务。MongoDB向与关系型数据库产品的融合迈出了一大步&#xff0c;现在支持会话的概念&#xff0c;并可以使用start_transaction()和commit_transaction()方法将多个数据库命令包含在…

P5491-[模板]二次剩余

正题 题目链接:https://www.luogu.com.cn/problem/P5491 题目大意 求解x2N(modP)x^2N(mod\ \ P)x2N(mod P) 解题思路 若aaa在模ppp意义下可以开根那么aaa就是ppp的二次剩余&#xff0c;定义 (ap){1(a是p的二次剩余)−1(a是p的二次非剩余)0(p∣a)\binom{a}{p}\left\{\begin{…

【递归】桐桐的递归函数

桐桐的递归函数 题目大意&#xff1a; 有一个函数&#xff0c;让你照着打 原题&#xff1a; 题目描述 桐桐经常找一些很有趣的数学书来阅读以增长自己的数学知识。一天&#xff0c;他偶然发现一个递归函数w&#xff08;a&#xff0c;b&#xff0c;c&#xff09;有以下性质…

分享我编程工作经历及对软件开发前景的看法

本人一直从事互联网行业&#xff0c;熟练C#、javascript,熟悉C\C,JAVA,php,object-c,熟练的开发工具有Visual Studio,数据库是MS SQL SERVER。这两天实在是无聊&#xff0c;回忆一下本人的工作经历&#xff0c;一路走来很辛苦&#xff0c;很坎坷&#xff0c;现在都快40岁了&…

P4026-[SHOI2008]循环的债务【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P4026 题目大意 333个人&#xff0c;有一些面值为100,50,20,10,5,1100,50,20,10,5,1100,50,20,10,5,1的钱&#xff0c;一些人欠一些人钱&#xff0c;求最少交换多少张钞票可以还清。 解题思路 我们设fi,j,kf_{i,j,k}fi,j,k​…

【模拟】桐桐的新闻系统

桐桐的新闻系统 题目大意&#xff1a; 有n个人&#xff0c;每个人有自己的ID和收新闻的间隔&#xff0c;问前k次发送新闻是分别发给谁的 原题&#xff1a; 题目描述 桐桐为期末的电脑作业设计一套新闻系统&#xff0c;他把这套系统称为Argus。 使用这套系统的用户可以向这…

实体类的动态生成(三)

前言在 .NET 中主要有两种动态生成并编译的方式&#xff0c;一种是通过 System.Linq.Expressions 命名空间中的 LambdaExpression 类的 CompileToMethod(...) 方法&#xff0c;但是这种方法只支持动态编译到静态方法&#xff0c;因为这个限制我们只能放弃它而采用 Emitting 生成…

牛客网暑期ACM多校训练营(第三场)

牛客网暑期ACM多校训练营&#xff08;第三场&#xff09; A. PACM Team 01背包&#xff0c;输出方案&#xff0c;用bool存每种状态下用的哪一个物品&#xff0c;卡内存。官方题解上&#xff0c;说用char或者short就行了。还有一种做法是把用的物品压成一个int。 #include <b…