DNS协议消息示例

时间:2010-05-19 20:33:22

标签: dns protocols

我试图弄清楚如何从应用程序套接字适配器向DNSBL发送DNS消息。 我花了两天时间了解基础知识,包括尝试使用WireShark来捕获交换消息的示例。 现在我想查询DNS而不使用dig或host命令(我正在使用Ubuntu);如何在没有这些工具的帮助下以正确的DNS消息格式包装请求的情况下,如何在低级别执行此操作?邮件应该如何发布?十六进制或字符串?

提前感谢您的帮助。 此致

Alessandro Ilardo

评论已添加

我正在调查JDev和Oracle SOA。该平台提供了一个套接字适配器,它只需应用转换(XSLT)并将消息直接发送到套接字。 如何将有效负载参数(例如我正在查找的主机)包含在消息中,留给开发人员。所以基本上我对所有DNS消息的结构都有了一个想法,但不是把所有的东西放在JDev上,而是我想自己做一些测试,以确保我得到一个有效的消息格式。

所以,我没有使用任何特定语言(我甚至不理解为什么他们从serverfault移动我的问题)并且我不想使用任何隐藏部分消息的工具,例如标题。我知道他们的工作顺利。 我想这些东西与数据包注入有关。有人建议我使用telnet,但我只用于SMTP或HTTP,我还没有得到关于DNS请求如何工作的线索。 现在更有意义吗?

3 个答案:

答案 0 :(得分:9)

Ewww ...而不是手工构建DNS协议,真的应该使用编程环境提供的某种库来进行查找。

如果没有真正合理的原因,请不要手工构建协议。认真。不要那样做。


@Synetech:不,OP没有考虑使用库。他只是想不使用命令行工具。就样本库而言,您不需要远远看。 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))

答案 1 :(得分:4)

该协议在以RFC 1035开头的 lot RFC中得到了充分的描述,但实际上,并没有重新发明轮子。看看其他人的“线上”实现是一个错误的确定方法。

如果使用“C”,请查看ldns。对于Perl,默认解决方案是Net::DNS,可从CPAN获得。其他语言也存在类似的库。

答案 2 :(得分:4)

我无法理解你在寻找什么。正如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 |>>>