C#实现DNS解析服务

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

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

DNS Client端实现

 代码如下:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//初始化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攻击。

DNS Server端实现

   代码如下:

   

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//初始化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是一个比较强大的开源工具库,其功能不仅仅只是以上两个方面,同时还包含有其他功能,读者可以自己查看源代码学习。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值