DNS协议消息示例

Ale*_*Ila 3 dns protocols

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

在此先感谢您的帮助.问候

亚历山德罗·伊拉多

评论补充说

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

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

Mik*_*eyB 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))
Run Code Online (Sandbox Code Playgroud)

  • 除非它只是为了教育.(我在一个512字节的微控制器上构建了一个tcp堆栈.好吧它有用,但更多的是教育挑战) (3认同)