如何在自建网站检测域名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服务器返回的记录是否一致。具体实现步骤:
- 准备覆盖全球的公共DNS列表(覆盖不同地区、不同运营商)
- 遍历每个DNS服务器查询目标记录
- 分组统计结果,根据结果组数判断传播状态
实现代码
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
相关产品推荐
相关产品推荐

