You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在一次DNS查询中获取多条不同类型的记录

好问题!dnspython本身并没有提供一次性查询多种不同记录类型的原生方法,但我们可以通过简单的循环来实现这个需求,或者在特定场景下使用区域传输(AXFR)来获取域名的所有记录。下面分两种情况给你详细说明:

方法一:循环查询指定的记录类型

这是最常用的方案——我们可以先定义需要查询的记录类型列表,然后逐个调用查询方法,同时加入异常处理避免程序崩溃。

import dns.resolver

# 定义要查询的记录类型列表,可根据需求增减
target_record_types = ["A", "TXT", "CNAME", "MX"]
target_domain = "google.com"

# 创建解析器实例
resolver = dns.resolver.Resolver()

for record_type in target_record_types:
    print(f"\n=== 查询 {target_domain} 的 {record_type} 记录 ===")
    try:
        # 执行查询
        answers = resolver.query(target_domain, record_type)
        # 遍历并打印结果
        for rdata in answers:
            print(rdata)
    except dns.resolver.NoAnswer:
        print(f"> 该域名不存在 {record_type} 记录")
    except dns.resolver.NXDOMAIN:
        print(f"> 域名 {target_domain} 不存在")
    except Exception as e:
        print(f"> 查询出错: {str(e)}")

代码说明:

  • 我们先列出需要查询的记录类型(比如A、TXT、CNAME等),按需调整即可
  • 加入了多种异常捕获:比如域名不存在、指定记录类型不存在的情况,避免单个查询失败导致整个程序终止
  • 每个类型的查询结果会单独分组打印,可读性更好

方法二:使用AXFR获取全量记录(限授权场景)

如果你需要获取某个域名的所有记录类型,可以尝试使用DNS区域传输(AXFR)协议,但有个重要前提:你要查询的域名的授权DNS服务器必须允许你的IP进行区域传输。

公共域名(比如google.com)几乎都不会开放这个权限,所以这个方法只适合你自己管理的域名,或者拥有明确授权的场景。示例代码如下:

import dns.query
import dns.zone

target_domain = "example.com"  # 替换为你有权限查询的域名
auth_nameserver = "ns.example.com"  # 该域名的授权DNS服务器地址

try:
    # 发起区域传输请求
    zone = dns.zone.from_xfr(dns.query.xfr(auth_nameserver, target_domain))
    # 遍历所有记录并打印
    for name, node in zone.nodes.items():
        for rdataset in node.rdatasets:
            print(f"\n{name}  TTL:{rdataset.ttl}  类型:{rdataset.rdtype.name}")
            for rdata in rdataset:
                print(f"  {rdata}")
except Exception as e:
    print(f"区域传输失败: {str(e)}")

注意事项:

  • 大部分公共DNS服务器会拒绝AXFR请求,所以不要尝试用这个方法查询google.com这类公共域名
  • 如果你是自己的域名,需要在DNS服务器配置中允许你的IP进行区域传输

内容的提问来源于stack exchange,提问作者user9371654

火山引擎 最新活动