解析服务需用到开源控件库:ARSoft.Tools.Net

首先简单介绍一下ARSoft.Tools.NetARSoft.Tools.Net是一个非常强大的开源DNS控件库,包含.Net SPF validation, SenderID validation以及DNS ClientDNS Server接口使用该接口可轻松实现DNS客户请求端及服务器解析端。其下载地址:

端实现

 代码如下:

 

//初始化DnsClient,第一个参数为DNS服务器的IP,第二个参数为超时时间     DnsClient dnsClient = new DnsClient(IPAddress.Parse("127.0.0.1"), QUERY_TIMEOUT);     //解析域名。将域名请求发送至DNS服务器解析,第一个参数为需要解析的域名,第二个参数为解析类型, RecordType.A为IPV4类型     DnsMessage dnsMessage = dnsClient.Resolve("www.sina.com", RecordType.A);     //若返回结果为空,或者存在错误,则该请求失败。     if (dnsMessage == null || (dnsMessage.ReturnCode != ReturnCode.NoError && dnsMessage.ReturnCode != ReturnCode.NxDomain))     {          return null;     }     else     {          //循环遍历返回结果,将返回的IPV4记录添加到结果集List中。          foreach (DnsRecordBase dnsRecord in dnsMessage.AnswerRecords)          {              ARecord aRecord = dnsRecord as ARecord;              if (aRecord != null)                  resultIpList.Add(aRecord.Address.ToString());              else                  continue;          }      }

DNS发起解析请求,如果发送的数据量足够大,就可能造成DNS服务器瘫痪,这就是我们常说的DOS***。

端实现

   代码如下:

   

//初始化DnsServer,第一个参数ipAddress为监听的本地ip地址,第二个参数为UDP的并发处理数,第三个参数为TCP的并发处理数,第四个参数为一个委托,通过该委托我们可以自定义解析返回结果   DnsServer dnsServer = new DnsServer(ipAddress, maxConnection, maxConnection, this.ProcessQuery);   dnsServer.Start();                    //委托实现方法,可自定义解析规则   private DnsMessageBase ProcessQuery(DnsMessageBase message, IPAddress clientAddress, ProtocolType protocol)  {        message.IsQuery = false;        DnsMessage query = message as DnsMessage;        if (query == null || query.Questions.Count <= 0)           message.ReturnCode = ReturnCode.ServerFailure;        else        {             if (query.Questions[0].RecordType == RecordType.A)             {                //自定义解析规则,clientAddress即客户端的IP,dnsQuestion.Name即客户端请求的域名,Resolve为自定义的方法(代码不再贴出),返回解析后的ip,将其加入AnswerRecords中               foreach (DnsQuestion dnsQuestion in query.Questions)               {                    string resolvedIp = Resolve(clientAddress.ToString(), dnsQuestion.Name);                    ARecord aRecord = new ARecord(query.Questions[0].Name, 36000, ipAddress);                    query.AnswerRecords.Add(aRecord);                }             }             else                //如果为IPV6请求,则交给上级DNS服务器处理,代码不再贴出         }         return message; }

端完成,我们可以在此基础上扩展其功能,如不解析在黑名单中的IP、将可能为***的ip加入黑名单、以及创建缓存,加速DNS的解析、智能解析等等。

总结

ARSoft.Tools.Net是一个比较强大的开源工具库,其功能不仅仅只是以上两个方面,同时还包含有其他功能,读者可以自己查看源代码学习。