Код для прямого поиска DNS - PullRequest
2 голосов
/ 25 мая 2009

Я подумываю о проведении эксперимента для отслеживания значений DNS различными способами (например, как часто они меняются и тому подобное). Для этого мне нужно будет иметь возможность сделать DNS-запрос непосредственно к серверу, чтобы 1) я знал, с какого сервера он пришел, 2) я могу запрашивать ответы от нескольких серверов и 3) я могу избежать кэша запуска локальной ОС .

Кто-нибудь знает библиотеку (c #, D, C, C ++ в таком порядке предпочтений), которая позволит мне напрямую запрашивать DNS-сервер? Если этого не сделать, кто-нибудь знает простую для понимания описание протокола DNS, из которого я мог бы реализовать такую ​​систему?

Ответы [ 4 ]

3 голосов
/ 26 мая 2009

У меня есть опыт работы только с C, поэтому вот мой список:

  • libresolv - это старый, традиционный и стандартный способ. Он доступен в каждом Unix (тип man 3 resolver) и включает такие подпрограммы, как res_query, который делает более или менее то, что вы хотите. Чтобы выполнить запрос к конкретному серверу имен, вы обычно обновляете глобальную переменную _res.nsaddr_list (обратите внимание, что, очевидно, она не работает с IPv6 ).

  • ldns - это современное и блестящее решение. У вас хорошая документация онлайн .

  • очень распространенная библиотека, но, по-видимому, не поддерживаемая, это adns .

3 голосов
/ 25 мая 2009

Для C я бы выбрал http://cr.yp.to/djbdns/blurb/library.html (низкоуровневые детали, если вам нужен полный контроль, т.е. dns_transmit* и друзья) - для C #, возможно, http://www.c -sharpcorner .com / UploadFile / ivxivx / DNSClient12122005234612PM / DNSClient.aspx (не могу проверить это прямо сейчас, откуда "возможно"!).

2 голосов
/ 26 мая 2009

Спецификация DNS распространяется на много RFC (см. хороший график ), и я настоятельно рекомендую не для реализации заглушка решатель с нуля. Есть много возможностей ошибиться. DNS сильно изменилась за последние годы. Если вы смелый и сумасшедший, вот самые важные RFC:

  • RFC 1034, понятия
  • RFC 1035, формат
  • RFC 2181, обновление спецификации, исправление многих ошибок или неясностей
  • RFC 2671, EDNS (обязательный сегодня)
  • RFC 3597, обработка неизвестных типов записей ресурсов
  • и многие другие ...
0 голосов
/ 25 мая 2009

libdns (я думаю, что это часть bind). Есть порт Cygwin, который может быть полезен для Windows.

http://rpm2html.osmirror.nl/libdns.so.21.html

...