Dns 当没有发送相关查询时,名称服务器的响应是否正确?

Dns 当没有发送相关查询时,名称服务器的响应是否正确?,dns,response,nameservers,Dns,Response,Nameservers,我有一个用Python编写的非常基本的名称服务器,它只使用了socket和dnslib,主要用于让我们加密DNS-01质询响应,还有一些实验记录 我的问题是,当一个查询到达服务器,但它不包含服务器想要响应的相关数据时,名称服务器应该响应什么 它应该忽略它吗 我这样问是因为我一直收到对任何leth.cc的查询,这些查询显然是用于DNS放大攻击的。在注意到这一点之前,我只是用一个空的答案部分来回答问题,现在我不会将任何内容发送回提供的地址 我从 data, addr = sock_dns.recvf

我有一个用Python编写的非常基本的名称服务器,它只使用了
socket
dnslib
,主要用于让我们加密DNS-01质询响应,还有一些实验记录

我的问题是,当一个查询到达服务器,但它不包含服务器想要响应的相关数据时,名称服务器应该响应什么

它应该忽略它吗

我这样问是因为我一直收到对
任何leth.cc
的查询,这些查询显然是用于DNS放大攻击的。在注意到这一点之前,我只是用一个空的答案部分来回答问题,现在我不会将任何内容发送回提供的地址

我从

data, addr = sock_dns.recvfrom(1024)
q = dnslib.DNSRecord.parse(data)
a = q.reply()
# add an answer if query is relevant
# a.add_answer(*dnslib.RR.fromZone(qname + " 30 IN TXT " + verification_code))
sock_dns.sendto(a.pack(), addr)

这种行为可以接受吗


考虑到Patrick Mevzek的回答,我现在将其修改为

data, addr = sock_dns.recvfrom(1024)
q = dnslib.DNSRecord.parse(data)
a = q.reply()
# add an answer if query is relevant
# a.add_answer(*dnslib.RR.fromZone(qname + " 30 IN TXT " + verification_code))
if not a.rr:
  a.header.rcode = dnslib.RCODE.REFUSED
sock_dns.sendto(a.pack(), addr)
虽然这可能是有效客户端的正确响应,但在正常操作下,
leth.cc
的查询不应到达服务器,因为除了我在注册者DNS在线配置界面中配置的NS记录之外,没有任何东西指向我的名称服务器。这是他们的名称服务器指示客户端应该去问我的名称服务器,以获得他们无法回答的更具体查询的答案

但是,如果查询
leth.cc
到达我的服务器,那么这个查询很可能来自一个非常不寻常的来源。使用
RCODE.densed
回答这些请求是否仍然可以,或者请求是否被欺骗,使得
addr
包含不应联系的地址,以避免该地址受到DDOS攻击?毕竟,这是一种放大攻击;这是否有点像反射式DDOS攻击?我不介意我的名称服务器受到DDOS攻击(这就是我要解决的问题),我只是不希望它参与其中,如果可能的话


此外,这不是一个解析名称服务器,如果找不到信息,它不会出去查询其他名称服务器。我不认为不回答对不属于此命名服务器域的
qnames
的请求有什么不好。

忽略查询肯定不是您想要做的事情(在正常操作中),因为客户端将重试,并在某个时候切换到另一个命名服务器,因此,如果不是坏结果,至少你会给他们造成延误

可能的返回码在RFC 1035中定义,且大部分在RFC 1035中定义

就你的情况而言,我认为你已经得到了你所需要的:拒绝

其定义如下:

名称服务器拒绝 对执行指定的操作 政策原因。例如,一个名字 服务器可能不希望提供 向特定请求者提供的信息, 或者名称服务器可能不希望执行特定操作(例如,区域) 传输)用于特定数据

现在,您的名称服务器在某些域名上具有权威性。如果它接收到对其他域的查询,它应该说它对它们没有权威性,这是NXDOMAIN,或者确切地说是RFC 1035中定义的RCODE 3:

名称错误-仅对以下对象有意义 来自权威名称的响应 服务器,此代码表示 查询中引用的域名不存在 不存在

这是一个很小的答案,因此你没有放大任何东西。您的服务器仍可能受到许多此类查询的影响,您可能决定实施速率限制(见下文)。确实,通过UDP传输的流量您的服务器可能会对不是查询真正来源的受害者进行应答,但不会进行放大,就像世界上任何其他名称服务器一样,这也是所有基于UDP的协议的悲惨命运

DDOS是指,如果您回复查询时的答案更大(例如,如果您尝试回复
ANY
,即使是您的权威姓名),因为在这里,受害者可能会收到大量流量,而攻击者只需向您发送很少的流量

另外,
ANY
更像是一个(糟糕的)故障排除工具,用于递归名称服务器(如“为特定标签提供缓存的当前状态”),而不是权威的名称服务器。目前有一些作品完全反对它:

现在,您似乎更多地谈论操作问题和DDOS攻击。这是另一种情况,即使是回复也可能代价高昂。当前的名称服务器实现了一种RRL机制,用于“响应速率限制”,基本上是通过降低响应速率来实现的。 请阅读本文,了解Bind的以下特性:


如果您担心自己的名称服务器可能受到攻击,您可能希望为其实现类似的功能。

谢谢,我已经根据您的回答扩展了我的问题。你介意再看一眼吗?这是关于为我的域和不在我控制/所有权范围内的域获取查询的区别。@DanielF请参阅更新。TL;DR:返回NXDOMAIN(RCODE 3),查询您没有权威的域名。仅返回一个错误代码不会受到放大攻击。这种情况通常发生在回复任何查询的递归名称服务器上。谢谢。所以,不管我选择回答什么:如果我回答了,我的nameserver是否可能被调用以参与对
addr
中该地址的攻击?它源于数据,addr=sock_dns.recvfrom(1024);我能保证吗
data, addr = sock_dns.recvfrom(1024)
q = dnslib.DNSRecord.parse(data)
a = q.reply()
# add an answer if query is relevant
# a.add_answer(*dnslib.RR.fromZone(qname + " 30 IN TXT " + verification_code))
if not a.rr:
  a.header.rcode = dnslib.RCODE.REFUSED
sock_dns.sendto(a.pack(), addr)