如何在C#中确定DNS更改?

4

我希望能够监控 DNS 地址的变化。因此,我需要跟踪 DNS 变化。我目前正在使用线程来完成这项工作。我获取 DNS 然后将其保存到文件中,然后每 10 秒比较它们,但我需要更具体的解决方案。例如,是否有任何事件可以触发这个过程?以下是代码:

GetDns:

public List<string> GetDns()
    {
        List<string> dns = new List<string>();
        NetworkInterface[] networkInterfaces = NetworkInterface.GetAllNetworkInterfaces();
        foreach (NetworkInterface networkInterface in networkInterfaces)
        {
            if (networkInterface.OperationalStatus == OperationalStatus.Up)
            {
                IPInterfaceProperties ipProperties = networkInterface.GetIPProperties();
                IPAddressCollection dnsAddresses = ipProperties.DnsAddresses;
                foreach (IPAddress dnsAdress in dnsAddresses)
                {
                        dns.Add(dnsAdress.ToString());
                }
            }
        }
        return dns;
    }

这是比较的结果:
string[] xmlDns = xmlData.GetDatas("DNSs", "Dns");
        List<string> dns = getData.GetDns();
        for (int i = 0; i < xmlDns.Length; i++)
        {
                if ( xmlDns[i].Equals( dns[i]))
                {
                    this.Invoke(new MethodInvoker(delegate()
                    {
                        listBoxCheck.Items.Add(xmlDns[i] + " DNS was not changed.");
                    }));
                }
                else
                {
                    this.Invoke(new MethodInvoker(delegate()
                    {
                        listBoxCheck.Items.Add(xmlDns[i] + " DNS adress was changed as " + dns[i] );
                    }));
                }
        }

你能展示一下你尝试过的代码吗? - cuongle
3个回答

1

DNS是基于请求的。DNS服务器没有向客户端发送事件。您可以潜在地使用TTL(生存时间)元数据,该元数据告诉您DNS记录何时过期。

这里有一个库SimpleDNS,它公开了API以查询给定的DNS服务器,并提供了获取TTL值的文档。


谢谢你。我会调查一下。 - mburakerbay

0
你可以使用WMI查询来查询你的DNS。 循环查询并将返回结果与先前的结果进行比较。 当值发生变化时弹出消息框(或触发事件或其他操作)。
为了实现这一点,您必须使用System.Management命名空间,或者管理命名空间可能包括查看DNS的功能。但我不确定。

0

@Candide所说的DNS中没有事件并不完全正确,特别是对于更改通知。

如果您控制DNS服务器,则可以将其设置为向客户端发送NOTIFY消息。这些消息(虽然不能保证,但大多数情况下)会在权威DNS服务器希望从属服务器更新区域内容时发送。然后,您可以以任何您喜欢的方式对其进行反应。大多数DNS服务器实现可能默认仅向列出的名称服务器发送NOTIFY消息,但也可以配置为将它们发送到其他主机(例如,在BIND 9中,可以使用区域配置中的also-notify {}指令来完成此操作)。

我不确定您如何实现它;NOTIFY是DNS协议的一部分,因此您基本上要编写一个有限目的的DNS服务器实现来侦听并对这些消息进行操作。您至少需要监视UDP和TCP上的53号端口(我确信通知实际上几乎总是通过UDP发送,但标准也允许TCP传输),解决接收到的任何NOTIFY消息,并对其进行操作。

此外,由于不能保证它们被传递,因此您还需要备用机制。

这是否是可行的选择完全取决于情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接