DNS-пакеты ответа - PullRequest
       6

DNS-пакеты ответа

1 голос
/ 09 ноября 2010

Я пытаюсь кодировать свой собственный DNS-сервер, я читаю через RFC1035 на DNS, но у меня есть несколько запросов:

1) Я хочу, чтобы мой сервер ответил CNAME для конкретного запроса, но нет записей - я могу это сделать?например, получите запрос для «server1.com», ответ «CNAME server2.com», а затем клиент запросит другой DNS-сервер, чтобы получить запись A для «server2.com».В настоящее время я установил заголовок: «\ x84 \ x00», чтобы сказать, что это авторизованный сервер, но рекурсия невозможна.Это правильно?

2) Я хочу, чтобы мой сервер отвечал без записей на любой другой запрос, чтобы клиент затем запрашивал записи на другом DNS-сервере.В настоящее время я установил заголовок на \ x83 \ x03, например, чтобы сообщить код ответа ИМЯ ОШИБКИ.Это правильно?Тогда с чем мне следовать, нулями во всех других полях или просто завершить пакет там?Я не хочу отвечать «это имя не существует», скорее «я не знаю это имя, попробуйте кого-нибудь еще» - как мне это сделать?

Большое спасибо:)

Ответы [ 2 ]

1 голос
/ 14 ноября 2010

В случае CNAME ваш (уполномоченный) сервер должен просто вернуть CNAME в разделе ответов , если , он также является полномочным для домена, на который указывает CNAME, и в этом случае он должен также включать результат следования CNAME.

Для вашего второго случая вы должны вернуть RCODE 5 («ОТКАЗАНО») - это предпочтительная ошибка, которую должен выдавать полномочный сервер, когда ему задают вопрос для домена, для которого он не настроен.

После этого вам все равно нужно отправить четыре 16-битных поля счета и копию вопроса из исходного запроса. В этом случае четыре счета будут (1, 0, 0, 0) - один вопрос, без ответа, без записей, без дополнительных записей.

1 голос
/ 10 ноября 2010
  1. Звучит правдоподобно - фактически, CNAME с Записи неверны ( RFC1034, раздел 3.6.2 : «Если в узле присутствует запись CNAME, нет другие данные должны присутствовать ").

  2. Это было бы очень необычным поведением со стороны авторитетного сервера имен - я бы посоветовал переосмыслить его или хотя бы протестировать с некоторыми реальными распознавателями, чтобы убедиться, что они делают то, что вы хотите. RCODE # 3 («ошибка имени» или NXDOMAIN) является положительным подтверждением того, что имя не существует . Это может привести к тому, что распознаватели прекратят разрешение и, возможно, кешируют несуществующее имя, что не похоже на то, что вы ищете. Если вы хотите, чтобы распознаватель запросил один из других серверов имен, которым был делегирован для этой зоны, я думаю, SERVFAIL (RCODE # 2) является наиболее подходящим / может иметь желаемый эффект.

Кстати, для отладки точного формата ваших DNS-пакетов я настоятельно рекомендую Wireshark за его точность декодирования по сравнению с вставкой шестнадцатеричных кодов в переполнение стека;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...