博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#实现DNS解析服务
阅读量:5837 次
发布时间:2019-06-18

本文共 2260 字,大约阅读时间需要 7 分钟。

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

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

端实现

 代码如下:

  

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攻击。

端实现

   代码如下:

   

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是一个比较强大的开源工具库,其功能不仅仅只是以上两个方面,同时还包含有其他功能,读者可以自己查看源代码学习。

本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1218417,如需转载请自行联系原作者

你可能感兴趣的文章