1. 程式人生 > >基於阿裏雲 DNS API 實現的 DDNS 工具

基於阿裏雲 DNS API 實現的 DDNS 工具

count 程序打包 打包 Coding 說明 str sha1 .get 右鍵

0.使用說明

AliDDNSNet 是基於 .NET Core 開發的動態 DNS 解析工具,借助於阿裏雲的 DNS API 來實現域名與動態 IP 的綁定功能。

使用時請更改同目錄下的 settings.json.examplesettings.json 文件,同時也可以顯示通過 -f 參數來制定配置文件路徑。例如:

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

1.配置說明:

通過更改 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 可以登錄阿裏雲之後在右上角可以得到。

2.代碼說明

2.1 核心加密代碼

核心代碼基本上都存放在 Utils.cs 文件裏面,這裏面值得註意的就是 GenerateSignature() 方法,因為阿裏雲所有的 API 接口都需要傳遞簽名參數,這個簽名參數是根據你提交的參數集合 AccessKey 來進行計算的。

/// <summary>
/// 生成請求簽名
/// </summary>
/// <param name="srcStr">請求體</param>
/// <returns>HMAC-SHA1 的 Base64 編碼</returns>
public static string GenerateSignature(this string srcStr)
{
    var signStr = $"GET&{HttpUtility.UrlEncode("/")}&{HttpUtility.UrlEncode(srcStr)}";

    // 替換已編碼的 URL 字符為大寫字符
    signStr = signStr.Replace("%2f", "%2F").Replace("%3d", "%3D").Replace("%2b", "%2B")
        .Replace("%253a", "%253A");

    var hmac = new HMACSHA1(Encoding.UTF8.GetBytes($"{config.access_key}&"));
    return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(signStr)));
}

這裏之前我是按照阿裏雲 API 來進行開發的,不過有一點需要註意的是,返回的 Signature 值是不需要進行 URL 編碼的。就因為這一點,我白白浪費了 3 個小時來排查問題,看看官方 API 文檔說的:

技術分享圖片

說需要將簽名值編碼之後再提交,扯淡,如果編碼之後再提交的話,接口會一直返回:

Specified signature is not matched with our calculation.

這裏直接返回 HMACSHA1 加密結果的 Base64 字符串即可。

2.1 異步 Main 方法

異步的 Main 方法需要 C# 7.1 以上版本才能支持,你只需要右鍵你的項目選擇屬性,左側欄選擇生成,找到高級按鈕,更改當前 C# 語言版本即可。

技術分享圖片

效果如下:

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

2.2 好用的 CommandLine 庫

編寫控制臺程序,最主要的是接受參數然後處理,而 Microsoft.Extensions.CommandLineUtils 庫提供了方便快捷的方式來為我們處理用戶輸入的參數。

使用方法如下:

using System;
using McMaster.Extensions.CommandLineUtils;

public class Program
{
    public static int Main(string[] args)
    {
        var app = new CommandLineApplication();

        app.HelpOption();
        var optionSubject = app.Option("-s|--subject <SUBJECT>", "The subject", CommandOptionType.SingleValue);
        var optionRepeat = app.Option<int>("-n|--count <N>", "Repeat", CommandOptionType.SingleValue);

        // 啟動時執行的委托
        app.OnExecute(() =>
        {
            // 接收參數
            var subject = optionSubject.HasValue()
                ? optionSubject.Value()
                : "world";

            var count = optionRepeat.HasValue() ? optionRepeat.ParsedValue : 1;
            for (var i = 0; i < count; i++)
            {
                Console.WriteLine($"Hello {subject}!");
            }
            
            // 執行完畢返回狀態 0
            return 0;
        });

        // 真正啟動控制臺程序
        return app.Execute(args);
    }
}

3.GITHUB 開源地址:

https://github.com/GameBelial/AliDDNSNet

有興趣的朋友可以 star 關註一下。

4.二進制程序下載地址

程序打包了 Linux-x64 與 Linux arm 環境的二進制可執行文件,你可以直接下載對應的壓縮包解壓到你的路由器或者 NAS 裏面進行運行。

如果你的設備支持 Docker 環境,建議通過 Docker 運行 .NET Core 2.1 環境來執行本程序。

下載地址在這兒

基於阿裏雲 DNS API 實現的 DDNS 工具