DNS:资源记录如何为权威DNS服务器工作?

Bry*_*eld 3 dns node.js ndns

但请耐心等待我.我不需要ndns或JavaScript的帮助.我需要有关DNS资源记录的帮助.

我已经可以发送资源记录了.我只需要知道如何为权威DNS服务器发送正确的.

我正在使用ndns编写DNS服务器.Ndns应该为我做低级别的通信,但我仍然需要了解DNS的基础知识.除此示例外,未记录Ndns.它是在JavaScript中,但无论如何都应该很容易阅读.收到请求后,它会向响应添加资源记录并发送响应

function handleDnsRequest(request, response) {
    response.addRR(
        ndns.ns_s.ar,  // Section AR
        'node.js',     // Name
        ndns.ns_t.txt, // Type TXT
        ndns.ns_c.in,  // Class IN
        1991,          // TTL
        'http://nodejs.org/' // Value
        );
    response.send();
}
Run Code Online (Sandbox Code Playgroud)

因此,无论请求是什么,此处理程序都会添加如下响应记录

  • 第AR节(附加记录)
  • 名称"node.js"
  • 输入TXT(文本字符串)
  • IN类(互联网)
  • TTL 1991(约33分钟)
  • 值(文本字符串)

这在Windows nslookup上提供了此输出

C:\>nslookup - 127.0.0.1
node.js text =

        "http://nodejs.org/"
Default Server:  UnKnown
Address:  127.0.0.1

> google.com
Server:  UnKnown
Address:  127.0.0.1

Name:    google.com

>
Run Code Online (Sandbox Code Playgroud)

我该如何发送正确答案?我想首先为所有A记录发送一个固定的IP地址,无论如何,并拒绝其他大多数其他不支持或诸如此类的东西.

在典型的nslookup登录中,请求记录什么是DNS服务器的典型资源记录列表?

Aln*_*tak 5

我想首先为所有A记录发送一个固定的IP地址,无论如何,并拒绝其他大多数其他不支持或诸如此类的东西.

啊哈,现在我们到了某个地方.

您需要在答案部分返回一个RR,该RR 具有与(第一个)问题中相同的"所有者名称",并带有相应的字段.

试试这个:

function listener (req, res)
{
    res.addRR(
         ndns.ns_s.an,         // answer section
         req.question[0].name, // name
         ndns.ns_t.a,          // type
         ndns.ns_c.in,         // class
         3600,                 // TTL
         '127.0.0.1'           // RDATA
    );
    res.header.aa = 1;         // authoritative answer
    res.header.ra = 0;         // recursion not available
    res.send ();
}
Run Code Online (Sandbox Code Playgroud)

这仅处理默认响应,并不检查入站查询是否针对A记录.

要拒绝其他查询,您需要检查:

req.question.length == 1
req.question[0].type == ndns.ns_t.a
req.question[0].class == ndns.ns_c.in
Run Code Online (Sandbox Code Playgroud)

然后设置res.header.rcode为非零值.

一个真正的权威服务器也会在权限部分发送DNS服务器名称,但是你应该能够在这里没有这样做.