Scapy构造SOA类型DNS请求结果与nslookup不符问题排查
问题根因
你的代码返回结果和nslookup不一致的核心原因是查询的目标域名写错了:
- 你执行的nslookup命令查询的是根域
facebook.com的SOA记录,对应命令参数为facebook.com - 你的Scapy代码中实际查询的是子域名
www.facebook.com的SOA记录,对应代码为DNSQR(qname='www.facebook.com', qtype='SOA')
www.facebook.com本身配置了CNAME记录指向Facebook的CDN调度域名,c10r.facebook.com是Facebook CDN节点的专属域,你拿到的a.ns.c10r.facebook.com是CDN域的NS服务器,仅对CDN内部调度域名生效,自然无法作为facebook.com根域的权威DNS使用。
修正方案
- 对齐查询域名:把DNSQR中的qname参数改为
facebook.com,和nslookup命令的查询目标保持一致,即可拿到和命令行一致的SOA记录结果。 - 如果需要获取域名IP的权威应答,不要向公共递归DNS(8.8.8.8)请求递归结果,建议流程为:
- 先向公共DNS查询目标域的NS记录,拿到权威DNS地址
- 直接向权威DNS地址发送查询请求,将DNS报文中的
rd(递归请求)标志设为0,拿到的应答就是权威应答,不会带递归缓存结果。
修正后模拟nslookup SOA查询的可运行代码如下:
from scapy.all import * from scapy.layers.dns import DNS, DNSQR from scapy.layers.inet import IP, UDP def main(): # 修正qname为facebook.com,和nslookup查询目标一致 dns_server_request = IP(dst='8.8.8.8') / UDP(dport=53) / DNS(rd=1, qd=DNSQR(qname='facebook.com', qtype='SOA')) ans = sr1(dns_server_request, verbose=0, timeout=3) ans.show() if __name__ == "__main__": main()
运行上述代码后,返回的SOA记录中对应的NS地址就是a.ns.facebook.com,和nslookup返回结果完全一致。
内容的提问来源于stack exchange,提问作者roee attias
相关产品推荐
相关产品推荐

