该DNS解析服务需用到开源控件库:ARSoft.Tools.Net。
首先简单介绍一下ARSoft.Tools.Net,ARSoft.Tools.Net是一个非常强大的开源DNS控件库,包含.Net SPF validation, SenderID validation以及DNS Client、DNS Server接口。使用该接口可轻松实现DNS客户请求端及服务器解析端。其下载地址:http://arsofttoolsnet.codeplex.com/。
DNS Client端实现
代码如下:
using ARSoft.Tools.Net.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攻击。
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;
}
|
DnsServer端完成,我们可以在此基础上扩展其功能,如不解析在黑名单中的IP、将可能为攻击的ip加入黑名单、以及创建缓存,加速DNS的解析、智能解析等等。
总结
ARSoft.Tools.Net是一个比较强大的开源工具库,其功能不仅仅只是以上两个方面,同时还包含有其他功能,读者可以自己查看源代码学习。
本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/1218417,如需转载请自行联系原作者