Функция DNS-запроса, которая различает несуществующий хост и сетевую ошибку - PullRequest
3 голосов
/ 18 марта 2012

getaddrinfo () возвращает EAI_NONAME для сетевой ошибки при разрешении существующего хоста и несуществующего хоста.

Что я должен сделать, чтобы иметь возможность различать эти две ошибки?

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

Ответы [ 2 ]

0 голосов
/ 10 июля 2013

Я обнаружил, что http://c -ares.haxx.se / может различать ARES_ETIMEOUT и ARES_ENOTFOUND в отличие от getaddrinfo ()

0 голосов
/ 18 марта 2012

С классическим DNS вы не можете сделать это. До конца решатель вы действительно не можете различить, существует ли хост или был ли сбой сети.

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

Например, библиотека libval из Проект DNSSEC-Tools имеет val_getaddrinfo (), который сообщит вам, был ли результат проверен или нет. Если ответа и не было, он был подтвержден, тогда вы можете верить, что его действительно не существует. Существует пример getaddr приложения командной строки, которое можно использовать для проверки результатов, а также для изучения кода.

stackoverflow.com, к сожалению, без знака:

# getaddr wwwxxx.stackoverflow.com
Return code = -2
Validator status code = 134 (VAL_NONEXISTENT_NAME_NOCHAIN)
Error in val_getaddrinfo(): -2

И код ошибки указывает на это (часть "nochain"). Это могло произойти сбой либо потому, что он не существует, либо из-за проблем в сети.

Но для подписанных зон вы получите лучший ответ:

# getaddr wwwxxx.dnssec-tools.org
Return code = -2
Validator status code = 132 (VAL_NONEXISTENT_NAME)
Error in val_getaddrinfo(): -2

Здесь статус валидатора изменился, и мы можем быть уверены, что адрес действительно не существует.

Обратите внимание, что .com, .org и .net все подписаны, а это значит, что вы всегда можете определить, существует ли заданный файл some.com (но, возможно, не subname.something.com).

Есть и другие библиотеки, которые также поддерживают DNSSEC, но я больше всего знаком с libval, поэтому я использовал его выше.

DNS на самом деле довольно сложен, чтобы полностью понять, как и почему он работает, и даже более того, когда вы добавляете его защищенную версию. Нет простой ссылки на ответ, но вам нужно прочитать как минимум RFC 1034 и 1035 и понять RCODE # 3, который является NXDOMAIN, и понять, что он возвращается распознавателем, через который вы запрашиваете, и нет другого ответ, который разрешено вам разрешить.

Если вам нужны начальные точки для чтения, вы можете проверить:

RFC1034 Доменные имена - понятия и возможности. П.В. Mockapetris. Ноябрь 1987 г. (формат: TXT = 129180 байт) (устарели RFC0973 , RFC0882 , RFC0883 ) (обновлено RFC1101 , RFC1183 , RFC1348 , RFC1876 , RFC1982 , RFC2065 , RFC2181 , RFC2308 , RFC2535 , RFC4033 , RFC4034 , RFC4035 , RFC4343 , RFC4035 , RFC4592 , RFC5936 ) (также STD0013) (Статус: СТАНДАРТ)

RFC1035 Доменные имена - реализация и спецификация. П.В. Mockapetris. Ноябрь 1987 г. (формат: TXT = 125626 байт) (устарели RFC0973 , RFC0882 , RFC0883 ) (обновлено RFC1101 , RFC1183 , RFC1348 , RFC1876 , RFC1982 , RFC1995 , RFC1996 , RFC2065 , RFC2136 , RFC2181 , RFC2137 , RFC2308 , RFC2535 , RFC2845 , RFC3425 , RFC3658 , RFC4033 , RFC4034 , RFC4035 , RFC4343 , RFC5936 , RFC5966 ) (также STD0013) (Статус: СТАНДАРТ)

RFC4033 Введение и требования безопасности DNS. Р. Арендс, Р. Аустейн, М. Ларсон, Д. Месси, С. Роуз. Март 2005 г. (формат: TXT = 52445 байт) (устарели RFC2535 , RFC3008 , RFC3090 , RFC3445 , RFC3655 , RFC3658 , RFC3755 , RFC3757 , RFC3845 ) (Обновления RFC1034 , RFC1035 , RFC2136 , RFC2181 , RFC2308 , RFC3225 , RFC3007 , RFC3597, RFC3226 ) (Обновлено RFC6014 ) (Статус: ПРЕДЛАГАЕМЫЙ СТАНДАРТ)

RFC4034 Ресурсные записи для расширений безопасности DNS. Р. Арендс, Р. Аустейн, М. Ларсон, Д. Месси, С. Роуз. Март 2005 г. (формат: TXT = 63879 байт) (устарели RFC2535 , RFC3008 , RFC3090 , RFC3445 , RFC3655 , RFC3658 , RFC3755 , RFC3757 , RFC3845 ) (Обновления RFC1034 , RFC1035 , RFC2136 , RFC2181 , RFC2308 , RFC3225 , RFC3007 , RFC3597, RFC3226 ) (Обновлено RFC4470 , RFC6014 ) (Статус: ПРЕДЛАГАЕМЫЙ СТАНДАРТ)

RFC4035 Модификации протокола для расширений безопасности DNS. Р. Арендс, Р. Аустейн, М. Ларсон, Д. Месси, С. Роуз. Март 2005 г. (формат: TXT = 130589 байт) (устаревшие RFC2535 , RFC3008 , RFC3090 , RFC3445 , RFC3655 , RFC3658 , RFC3755 , RFC3757 , RFC3845 ) (Обновления RFC1034 , RFC1035 , RFC2136 , RFC2181 , RFC2308 , RFC3225 , RFC3007 , RFC3597, RFC3226 ) (Обновлено RFC4470 , RFC6014 ) (Статус: ПРЕДЛАГАЕМЫЙ СТАНДАРТ)

RFC5155 Безопасность DNS (DNSSEC) хэширует аутентифицированный отказ в существовании. Б. Лори, Г. Сиссон, Р. Арендс, Д. Блэка. Март 2008 г. (Формат: TXT = 112338 байт) (Статус: ПРЕДЛАГАЕМЫЙ СТАНДАРТ)

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