DNS: Как записи ресурсов работают на авторитетном DNS-сервере?

#node.js #dns #ndns

#node.js #dns #ndns

Вопрос:

Но, пожалуйста, потерпите меня. Мне не нужна помощь с ndns или JavaScript. Мне нужна помощь с записями ресурсов DNS.

Я уже могу отправлять записи ресурсов. Мне просто нужно знать, как отправлять правильные записи на авторитетный DNS-сервер.

Я пишу DNS-сервер, используя ndns. Предполагается, что 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();
}
  

Итак, независимо от запроса, этот обработчик добавляет запись ответа следующим образом

  • Раздел AR (Дополнительные записи)
  • Имя «node.js «
  • Введите TXT (текстовая строка)
  • Класс В (Интернет)
  • 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

>
  

Как я могу отправлять правильные ответы? Я хочу начать с отправки фиксированного IP-адреса для всех записей A, несмотря ни на что, и запретить большинство других записей как неподдерживаемые или еще что-то.

При обычном входе в nslookup запрашивайте запись a Каким будет типичный список записей ресурсов, которые будут поступать с DNS-сервера?

Комментарии:

1. Не могли бы вы, пожалуйста, сильно упростить свой вопрос. Я работаю в DNS полный рабочий день, но я не могу понять, о чем вы на самом деле спрашиваете, ни нас, ни ваш DNS-сервер. Пожалуйста, избавьтесь от лишней информации и в простых терминах объясните, какой DNS-запрос вы пытаетесь отправить, и тогда должно стать очевидно, какой DNS-ответ вы должны выдать.

2. p.s. также, пожалуйста, установите dig для Windows и покажите примеры использования этого вместо. nslookup это ужасно.

3. @Alnitak: Извините, я вырезал большую часть вопроса. Для начала я хочу знать типичные вопросы и записи ресурсов для поиска A

4. @Alnitak: Dig установлен. Какую команду я должен выполнить?

5. dig @server_ip some_domain_name

Ответ №1:

Я хочу начать с отправки фиксированного IP-адреса для всех записей A, несмотря ни на что, и запретить большинство других записей как неподдерживаемые или еще что-то.

Ага, теперь мы к чему-то приближаемся.

Вам нужно вернуть 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 ();
}
  

При этом обрабатывается только ответ по умолчанию и не проверяется, был ли входящий запрос направлен на запись A.

Чтобы отклонить другие запросы, которые вы захотите проверить на:

 req.question.length == 1
req.question[0].type == ndns.ns_t.a
req.question[0].class == ndns.ns_c.in
  

а затем установите res.header.rcode значение, отличное от нуля.

Реальный авторитетный сервер также отправил бы имена DNS-серверов в разделе полномочий, но вы должны быть в состоянии обойтись без этого здесь.

Комментарии:

1. Спасибо, у меня все еще есть больше вопросов, но это отличная отправная точка, и я сформулирую другие вопросы позже. Я думаю, моя проблема заключалась в том, что я неправильно блокировал запросы, отличные от A, которые вызывают сбой всякий раз, когда я прикасаюсь к чему-либо. Какой может быть пример rcode s?

2. это зависит от того, является ли имя «допустимым» или нет. если имя допустимо, но тип нет, просто верните ответ, в котором нет ответа. Если имя недопустимо, верните «отказано» (5).

3. недопустимым именем будет то, которого нет на наших серверах, или то, которое имеет недопустимый синтаксис?

4. Одна не на ваших серверах. если синтаксис неверен, вместо него следует вернуть «formerr».

5. Слово «класс» зарезервировано в Javascript. Как вы запустили приведенный выше код?