DNS协议消息示例

DNS协议消息示例,dns,protocols,Dns,Protocols,我试图弄清楚如何将DNS消息从应用程序套接字适配器发送到DNSBL。 在过去的两天里,我了解了一些基本知识,包括使用WireShark进行实验,以捕捉一个消息交换的示例。 现在我想不使用dig或host命令查询DNS(我使用的是Ubuntu);如果没有这些工具以正确的DNS消息格式包装请求,我如何在低级别执行此操作?信息应该如何发布?十六进制还是字符串 提前感谢您的帮助。 问候 亚历山德罗·伊拉尔多 评论补充道 我正在调查JDev和Oracle SOA。该平台提供了一个套接字适配器,它只需应用转

我试图弄清楚如何将DNS消息从应用程序套接字适配器发送到DNSBL。 在过去的两天里,我了解了一些基本知识,包括使用WireShark进行实验,以捕捉一个消息交换的示例。 现在我想不使用dig或host命令查询DNS(我使用的是Ubuntu);如果没有这些工具以正确的DNS消息格式包装请求,我如何在低级别执行此操作?信息应该如何发布?十六进制还是字符串

提前感谢您的帮助。 问候

亚历山德罗·伊拉尔多

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

因此,我没有使用任何特定的语言(我甚至不明白他们为什么将我的问题从serverfault中移走),我也不想使用任何会隐藏部分消息的工具,例如标题。顺便说一句,我知道他们工作得很好。
我想这和包注入有关。有人建议我使用telnet,但我只使用SMTP或HTTP,我还不知道它如何用于DNS请求。
现在它更有意义了吗

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

没有真正好的理由,不要手工构建协议。认真地不要那样做。


不,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))

该协议在很多RFC中都有详细描述,但实际上,不要重新发明轮子。通过“在线”查看其他人的实现肯定会出错


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

我无法真正理解您在寻找什么。正如Alnitak和MikeyB所提到的,您使用的编程语言(Jdev,我不知道)可能提供了一个库来发送DNS请求(大多数编程语言都有)。如果要发送常规DNS请求,请使用它。我完全同意Alnitak和MikeyB的观点

然而,如果你想手工制作特殊的DNS数据包,并且害怕(而且是正确的)手工完成所有事情,那么你可以使用以下工具吗

以下是使用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 |>>>
#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)
开始排放:
。已完成发送1个数据包。
收到2个数据包,得到1个答案,剩余0个数据包

根据我的回答-你在使用什么语言?“有人建议我使用telnet”:太好了,你现在可以停止听这个人讲话了,你知道他不懂(DNS是一种二进制协议)。除非只是为了教育。(我曾经在一个512字节的微控制器上构建了一个tcp堆栈。好吧,这很有用,但更像是一个教育挑战)这很公平,尽管我有很好的理由。