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

如何在自建网站检测域名DNS传播及获取多DNS服务器记录?

多DNS服务器查询与DNS传播检测实现方案

1. 实现指定DNS服务器的记录查询

dns_get_record默认使用服务器本地配置的DNS,要查询第三方公共DNS的记录,有两种实用方法:

方法一:使用PHP的dns_query函数(推荐,需PHP 5.3+)

这个函数支持指定DNS服务器,直接返回解析结果:

function query_dns_server($domain, $record_type, $dns_server) {
    // 可选开启TCP模式,避免UDP包过大导致的解析失败
    $result = dns_query($domain, $record_type, DNS_QUERY_USE_TCP, $dns_server);
    return $result ?: [];
}

// 示例:查询Google DNS(8.8.8.8)的A记录
$google_a_records = query_dns_server("yourdomain.com", DNS_A, "8.8.8.8");
// 查询Quad9 DNS(9.9.9.9)的NS记录
$quad9_ns_records = query_dns_server("yourdomain.com", DNS_NS, "9.9.9.9");

方法二:调用系统dig命令(兼容更多环境)

如果服务器安装了bind-utils(Linux)或dig工具,可通过执行系统命令获取结果:

function dig_query($domain, $record_type, $dns_server) {
    // +short只返回核心记录值,+time=2设置2秒超时避免无响应
    $cmd = sprintf('dig @%s %s %s +short +time=2', 
        escapeshellarg($dns_server), 
        escapeshellarg($domain), 
        $record_type
    );
    exec($cmd, $output);
    return array_filter($output); // 过滤空行和无效输出
}

// 示例:查询Cloudflare DNS(1.1.1.1)的AAAA记录
$cloudflare_aaaa = dig_query("yourdomain.com", "AAAA", "1.1.1.1");

2. 检测DNS传播状态

DNS传播的核心判断逻辑是:多个不同地区/运营商的DNS服务器返回的记录是否一致。具体实现步骤:

  1. 准备覆盖全球的公共DNS列表(覆盖不同地区、不同运营商)
  2. 遍历每个DNS服务器查询目标记录
  3. 分组统计结果,根据结果组数判断传播状态

实现代码

function check_propagation_status($domain, $record_type) {
    // 选覆盖全球不同区域的公共DNS服务器
    $dns_list = [
        "8.8.8.8", "8.8.4.4", // Google(全球)
        "9.9.9.9", "149.112.112.112", // Quad9(全球)
        "1.1.1.1", "1.0.0.1", // Cloudflare(全球)
        "208.67.222.222", "208.67.220.220", // OpenDNS(美国)
        "223.5.5.5", "223.6.6.6", // 阿里云(国内)
        "193.110.81.0", // 欧洲DNS
        "1.0.1.0" // 日本DNS
    ];
    
    $result_groups = [];
    foreach ($dns_list as $server) {
        $records = dig_query($domain, $record_type, $server);
        sort($records); // 排序统一结果格式,避免记录顺序不同导致误判
        $group_key = implode(",", $records);
        
        if (!isset($result_groups[$group_key])) {
            $result_groups[$group_key] = [];
        }
        $result_groups[$group_key][] = $server;
    }
    
    return [
        "total_servers" => count($dns_list),
        "result_details" => $result_groups,
        "is_propagated" => count($result_groups) === 1 // 仅一组结果说明传播完成
    ];
}

// 使用示例
$status = check_propagation_status("yourdomain.com", "A");
print_r($status);

3. 实用优化建议

  • 超时控制:所有查询必须添加超时限制,避免单个DNS服务器无响应拖慢整体查询速度
  • 地区覆盖:补充不同地区的DNS服务器,提升传播检测的准确性
  • 异步查询:用PHP的curl_multi或Swoole等异步扩展批量查询,减少等待时间
  • 缓存处理:对已查询的结果做短期缓存,避免重复查询相同域名和DNS服务器

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 22:09:19