Пример сообщения протокола DNS - PullRequest
3 голосов
/ 20 мая 2010

Я пытаюсь выяснить, как отправлять DNS-сообщения из адаптера сокета приложения в DNSBL. Последние два дня я потратил на понимание основ, включая эксперименты с WireShark, чтобы поймать пример обмена сообщениями. Теперь я хотел бы запросить DNS без использования команды dig или host (я использую Ubuntu); Как я могу выполнить это действие на низком уровне, без помощи этих инструментов для упаковки запроса в правильный формат сообщения DNS? Как сообщение должно быть опубликовано? Hex или String?

Заранее спасибо за любую помощь. Привет

Алессандро Илардо

Комментарий добавлен

Я занимаюсь расследованием JDev и Oracle SOA. Платформа предоставляет Socket Adapter, который просто применяет преобразование (XSLT) и отправляет сообщение прямо в сокет. Как параметры полезной нагрузки (например, хост, который я ищу) обернуты в сообщение, оставлено на усмотрение разработчика. Таким образом, в основном у меня есть идея о том, как структурировано все DNS-сообщение, но вместо того, чтобы сразу поместить все в JDev, я бы хотел провести несколько тестов самостоятельно, чтобы убедиться, что я получил правильный формат сообщения.

Итак, я не использую какой-либо конкретный язык (я даже не понимаю, почему они перенесли мой вопрос из serverfault), и я не хочу использовать какие-либо инструменты, которые бы скрывали часть сообщения, такие как заголовок. Я знаю, что они хорошо работают, кстати. Я предполагаю, что этот материал имеет отношение к внедрению пакетов. Кто-то предложил мне использовать telnet, но я использовал только для SMTP или HTTP, я не знаю, как это работает для DNS-запроса. Теперь это имеет больше смысла?

Ответы [ 3 ]

9 голосов
/ 20 мая 2010

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

Не создавайте протокол вручную без действительно хорошей причины. Шутки в сторону. Не делай этого.


@ Synetech: нет, ОП не рассматривал возможность использования библиотеки. Он просто хочет не использовать инструменты командной строки. Что касается библиотеки примеров, вам не нужно далеко ходить. Как насчет библиотеки dns? Это не совсем много усилий.

#!/usr/bin/python3
import dns
import dns.message
import dns.query

from ipaddress import IPv6Address, IPv6Network

query = dns.message.make_query('www.google.ca', dns.rdatatype.ANY)
resp = dns.query.tcp(query, '2001:4860:4860::8888', timeout=5)
aaaa_data = resp.get_rrset(resp.answer, resp.question[0].name,
                           dns.rdataclass.IN, dns.rdatatype.AAAA)

aaaa_addrs = (IPv6Address(x) for x in aaaa_data)
for addr in aaaa_addrs:
    if addr in IPv6Network('2607:F8B0::/32'):
        print("{} is in Google's network".format(addr))
    else:
        print("{} is NOT in Google's network".format(addr))
4 голосов
/ 21 мая 2010

Я не могу понять, что вы ищете. Как упоминали Alnitak и MikeyB, используемый вами язык программирования (Jdev, которого я не знаю), вероятно, предоставляет библиотеку для отправки DNS-запросов (большинство языков программирования делают это). Если вы хотите отправлять регулярные DNS-запросы, используйте его. Я полностью согласен с Alnitak и MikeyB здесь.

Однако, если вы хотите создать специальные пакеты DNS и боитесь (и это правильно) делать все вручную, возможно, вы можете использовать такие инструменты, как Scapy ?

Вот пример использования Scapy для создания DNS-запроса:

# scapy
>>> p = IP(dst="203.0.113.162")/UDP(sport=RandShort(),dport=53)/\
...      DNS(rd=1,qd=DNSQR(qname="www.slashdot.org", qtype="AAAA"))
>>> sr1(p)
Begin emission:
.Finished to send 1 packets.
Received 2 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0x0 len=62 id=0 flags=DF frag=0L ttl=63 proto=udp chksum=0xb1bb src=203.0.113.162 dst=203.0.113.69 options='' |<UDP  sport=domain dport=50474 len=42 chksum=0x1c97 |<DNS  id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=1L ra=1L z=0L rcode=ok qdcount=1 ancount=0 nscount=0 arcount=0 qd=<DNSQR  qname='www.slashdot.org.' qtype=AAAA qclass=IN |> an=None ns=None ar=None |>>>
4 голосов
/ 20 мая 2010

Протокол очень подробно описан в лотах RFC, начиная с RFC 1035 , но на самом деле не изобретайте колесо заново. Глядя на реализации других людей «по проводам», это верный способ ошибиться.

Если вы используете 'C', проверьте ldns. Для Perl решением по умолчанию является Net::DNS, доступное из CPAN. Подобные библиотеки существуют для других языков.

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