我试图弄清楚如何从应用程序套接字适配器发送DNS消息到DNSBL.我花了两天时间了解基础知识,包括尝试使用WireShark来捕获交换消息的示例.现在我想查询DNS而不使用dig或host命令(我正在使用Ubuntu); 如何在没有这些工具的帮助下以正确的DNS消息格式包装请求的情况下,如何在低级别执行此操作?邮件应该如何发布?十六进制或字符串
在此先感谢您的帮助.问候
亚历山德罗·伊拉多
我正在研究JDev和Oracle SOA.该平台提供了一个Socket Adapter,它只需应用转换(XSLT)并将消息直接发送到套接字.如何将有效负载参数(例如我正在查找的主机)包含在消息中,留给开发人员.所以基本上我对所有DNS消息的结构都有了一个想法,但不是把所有的东西都放在JDev上,而是我想自己做一些测试,以确保我得到一个有效的消息格式.
所以,我没有使用任何特定的语言(我甚至不理解为什么他们从serverfault移动我的问题)并且我不想使用任何隐藏部分消息的工具,例如标题.我知道他们的工作顺利.我想这些东西与数据包注入有关.有人建议我使用telnet,但我只用于SMTP或HTTP,我还没有得到关于DNS请求如何工作的线索.现在更有意义吗?
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)