日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/4 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于阿里云 DNS API 实现的 DDNS 工具 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

0.簡(jiǎn)要介紹


0.1 思路說(shuō)明

AliDDNSNet 是基于 .NET Core 開(kāi)發(fā)的動(dòng)態(tài) DNS 解析工具,借助于阿里云的 DNS API 來(lái)實(shí)現(xiàn)域名與動(dòng)態(tài) IP 的綁定功能。工具核心就是調(diào)用了阿里云 DNS 的兩個(gè) API ,一個(gè) API 獲取指定域名的所有解析記錄,然后通過(guò)比對(duì)與當(dāng)前公網(wǎng) IP 是否一致,一致則不進(jìn)行更改,不一致則通過(guò)另外一個(gè)修改 API 來(lái)修改指定子域名的修改記錄。


0.2 使用說(shuō)明

使用時(shí)請(qǐng)更改同目錄下的?settings.json.example?為?settings.json?文件,同時(shí)也可以顯示通過(guò)?-f?參數(shù)來(lái)制定配置文件路徑。例如:

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

NAS 運(yùn)行效果圖:


0.3.配置說(shuō)明

通過(guò)更改?settings.json/settings.json.example?的內(nèi)容來(lái)實(shí)現(xiàn) DDNS 更新。

{// 阿里云的 Access Id"access_id": "",// 阿里云的 Access Key"access_key": "",// TTL 時(shí)間"interval": 600,// 主域名"domain": "example.com",// 子域名前綴"sub_domain": "test",// 記錄類型"type": "A"}

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

回到頂部

1.代碼說(shuō)明


1.1 主程序流程

主要流程代碼在 Program.cs 文件當(dāng)中編寫,這里依次講解一下。

首先加載配置文件,如果用戶傳入了?-f?參數(shù),則使用用戶傳入的配置文件路徑,否則的話直接使用當(dāng)前目錄的默認(rèn)?settings.json?配置文件,讀取成功之后存放到 Utils.config 屬性當(dāng)中以便 Utils 使用。

之后通過(guò)?Utils.GetCurentPublicIP()?方法獲取到當(dāng)前設(shè)備的公網(wǎng) IP,再判斷指定的二級(jí)域名解析是否存在,如果不存在的話,則直接返回,這里并沒(méi)有做新增解析操作,后續(xù)版本可能會(huì)加上。

如果找到了對(duì)應(yīng)二級(jí)域名的解析,則輸出當(dāng)前解析的記錄值,然后進(jìn)行比較,如果當(dāng)前主機(jī)的公網(wǎng) IP 與記錄值一樣則無(wú)需進(jìn)行變更。

當(dāng)阿里云 DNS 解析記錄與當(dāng)前主機(jī)公網(wǎng) IP 不一致的時(shí)候調(diào)用更新 API,傳入之前的域名的 rrId 去進(jìn)行變更,完成即退出。


1.2 Utils 詳解

Utils.cs 主要存放一些功能性方法,比如說(shuō)將?SortedDictionary?字典轉(zhuǎn)為請(qǐng)求字符串,還有就是加密方法,請(qǐng)求方法等。

1.2.1 生成通用參數(shù)字典

因?yàn)?API 請(qǐng)求的時(shí)候有很多共有參數(shù),所以這里單獨(dú)用了一個(gè)靜態(tài)方法來(lái)生成這個(gè)公有請(qǐng)求參數(shù)的字典。

/// <summary>/// 生成通用參數(shù)字典/// </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>?來(lái)處理,這是因?yàn)榘⒗镌?API 必須要求按大小寫敏感來(lái)排序請(qǐng)求參數(shù),所以這里直接使用了 ```SortedDictionary?來(lái)處理這種情況。

1.2.2 根據(jù)字典構(gòu)建請(qǐng)求字符串

因?yàn)榘⒗镌?DNS 的 API 基本上都是 GET 請(qǐng)求,所以通過(guò)這個(gè)方法可以將之前的?SortedDictionary<string,string>?字典構(gòu)建成請(qǐng)求字符串。

核心就是遍歷這個(gè)字典,通過(guò)?StringBuilder?來(lái)構(gòu)建這個(gè)請(qǐng)求字符串。

1.2.3 生成請(qǐng)求簽名

這一步也是最重要的一步,因?yàn)榘⒗镌扑械?API 接口都需要傳遞簽名參數(shù),這個(gè)簽名參數(shù)是根據(jù)你提交的參數(shù)集合 AccessKey 來(lái)進(jìn)行計(jì)算的。

這里之前我是按照阿里云 API 來(lái)進(jìn)行開(kāi)發(fā)的,不過(guò)有一點(diǎn)需要注意的是,返回的 Signature 值是不需要進(jìn)行 URL 編碼的。就因?yàn)檫@一點(diǎn),我白白浪費(fèi)了 3 個(gè)小時(shí)來(lái)排查問(wèn)題,看看官方 API 文檔說(shuō)的:

說(shuō)需要將簽名值編碼之后再提交,扯淡,如果編碼之后再提交的話,接口會(huì)一直返回:

Specified signature is not matched with our calculation.

這里直接返回 HMACSHA1 加密結(jié)果的 Base64 字符串即可。

1.2.4 發(fā)送請(qǐng)求

構(gòu)建好一切之后我們就需要發(fā)送請(qǐng)求了,這里統(tǒng)一是使用的?SendRequest()?方法來(lái)進(jìn)行處理,可以看到我們先獲得簽名,然后將獲取到的簽名追加到請(qǐng)求體內(nèi)部,一起進(jìn)行請(qǐng)求。

這里傳入的?IRequest?接口,是有具體實(shí)現(xiàn)的,可以轉(zhuǎn)到 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?就是具體的請(qǐng)求體,定義很簡(jiǎn)單,就是實(shí)現(xiàn)了?IRequest?接口而已,然后在各自的內(nèi)部添加一些特殊的參數(shù)。


1.3 異步 Main 方法

異步的 Main 方法需要 C# 7.1 以上版本才能支持,你只需要右鍵你的項(xiàng)目選擇屬性,左側(cè)欄選擇生成,找到高級(jí)按鈕,更改當(dāng)前 C# 語(yǔ)言版本即可。

效果如下:

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


1.4 好用的 CommandLine 庫(kù)

編寫控制臺(tái)程序,最主要的是接受參數(shù)然后處理,而?Microsoft.Extensions.CommandLineUtils?庫(kù)提供了方便快捷的方式來(lái)為我們處理用戶輸入的參數(shù)。

使用方法如下:

2.GITHUB 開(kāi)源地址

https://github.com/GameBelial/AliDDNSNet

有興趣的朋友可以 star 關(guān)注一下。


3.二進(jìn)制程序下載地址

程序打包了 Linux-x64 與 Linux arm 環(huán)境的二進(jìn)制可執(zhí)行文件,你可以直接下載對(duì)應(yīng)的壓縮包解壓到你的路由器或者 NAS 里面進(jìn)行運(yùn)行。

如果你的設(shè)備支持 Docker 環(huán)境,建議通過(guò) Docker 運(yùn)行 .NET Core 2.1 環(huán)境來(lái)執(zhí)行本程序。

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

.NET社區(qū)新聞,深度好文,歡迎訪問(wèn)公眾號(hào)文章匯總 http://www.csharpkit.com

總結(jié)

以上是生活随笔為你收集整理的基于阿里云 DNS API 实现的 DDNS 工具的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。