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

Posted myzony

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于阿里云 DNS API 实现的 DDNS 工具相关的知识,希望对你有一定的参考价值。

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 工具的主要内容,如果未能解决你的问题,请参考以下文章

使用脚本更新阿里云DNS记录

RouterOS aliyun 实现DDNS动态解析

python+阿里云实现动态域名解析(DDNS)

python+阿里云实现动态域名解析(DDNS)

私有云方案——利用阿里云云解析实现DDNS

自建动态DNS(DDNS)服务器