You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 07:57:07