我需要一些 PowerShell 工具或 .NET 库或直接使用 DNS 协议,因为我需要在非 Microsoft DNS 上执行动态更新,而 WMI 和 DNS cmdlet 仅适用于 MicroSoft DNS 服务器。
我试过了ARSoft.Tools.Net 库,但我总是得到 FormatError 返回代码(见下面的示例)。
还有其他可用的工具吗?
using ARSoft.Tools.Net;
using ARSoft.Tools.Net.Dns;
using ARSoft.Tools.Net.Dns.DynamicUpdate;
using System;
using System.Net;
class Program {
static void TestUpdateAdd(IPAddress dnsServerIP,
DomainName updateZoneName,
DomainName newRecordName,
IPAddress newRecordIPAddress,
DomainName tsigName,
byte[] tsigKey) {
var client = new DnsClient(dnsServerIP, 150000);
client.IsUdpEnabled = false;
var msg = new DnsUpdateMessage { ZoneName = updateZoneName };
msg.Updates.Add(
new AddRecordUpdate(
new ARecord(newRecordName, 86400, newRecordIPAddress)));
msg.TSigOptions = new TSigRecord(tsigName, TSigAlgorithm.Md5, DateTime.Now, new TimeSpan(0, 0, 5),
msg.TransactionID, ReturnCode.NoError, null, tsigKey);
DnsUpdateMessage dnsResult = client.SendUpdate(msg);
if (dnsResult == null) {
Console.WriteLine("Failed sending message");
} else {
Console.WriteLine(dnsResult.ReturnCode); // FormatError
}
}
}
答案1
通过快速浏览,我的印象是当前的 ARSoft.Tools.Net 版本(尝试了 2.2.4 和之前的一些抽查版本)似乎在 TSIG 签名方面存在错误。
似乎有一个错误导致 TTL 在记录中包含两次TSIG
,这显然抵消了之后的所有内容,完全破坏了对记录的任何解析。
如果您使用旧版本,例如 1.8.2,那么问题中的相同代码基本上可以正常工作(最大的区别是它使用字符串代替 DomainName)。话虽如此,我不知道旧版本是否存在其他问题,可能导致这种方法不受欢迎。
无论您是否使用这个特定的库,都有一些一般注意事项:
- 你的做傻事值(允许的时间差)非常低,即使在解决了主要问题之后仍可能存在问题。
- 你对 MD5 的使用进行了硬编码。虽然HMAC-MD5 不会直接受到目前已知的 MD5 严重问题的影响,一般来说,你会继续前进到你可以的地方(例如 HMAC-SHA256)。