本文目录导读:

基础DNS解析检测脚本(Shell)
#!/bin/bash
# DNS解析检测脚本
# 使用方法: ./dns_check.sh [域名]
DOMAIN=${1:-"example.com"}
DNS_SERVERS=("8.8.8.8" "1.1.1.1" "114.114.114.114")
echo "========================================"
echo "域名解析检测报告 - $DOMAIN"
echo "检测时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"
# 检测系统默认DNS
echo -e "\n[1] 系统默认DNS解析结果:"
if command -v nslookup &> /dev/null; then
nslookup $DOMAIN 2>&1 | grep -E "Address|Name"
elif command -v host &> /dev/null; then
host $DOMAIN
else
dig $DOMAIN +short
fi
# 检测指定DNS服务器
echo -e "\n[2] 指定DNS服务器解析结果:"
for dns in "${DNS_SERVERS[@]}"; do
echo -n "DNS服务器 $dns: "
result=$(dig @$dns $DOMAIN +short 2>/dev/null)
if [ -n "$result" ]; then
echo "$result"
else
echo "解析失败"
fi
done
# 检测IPv4和IPv6
echo -e "\n[3] IPv4/IPv6检测:"
echo -n "IPv4: "
dig $DOMAIN A +short 2>/dev/null | head -3
echo -n "IPv6: "
dig $DOMAIN AAAA +short 2>/dev/null | head -3
# 检测CNAME记录
echo -e "\n[4] CNAME记录:"
dig $DOMAIN CNAME +short 2>/dev/null
# 检测MX记录
echo -e "\n[5] 邮件服务器(MX):"
dig $DOMAIN MX +short 2>/dev/null
# 检测NS记录
echo -e "\n[6] 域名服务器(NS):"
dig $DOMAIN NS +short 2>/dev/null
# 响应时间检测
echo -e "\n[7] 响应时间检测:"
for dns in "${DNS_SERVERS[@]}"; do
start_time=$(date +%s%N)
dig @$dns $DOMAIN +short > /dev/null 2>&1
end_time=$(date +%s%N)
duration=$(( ($end_time - $start_time) / 1000000 ))
echo "DNS $dns 响应时间: ${duration}ms"
done
echo -e "\n========================================"
echo "检测完成"
echo "========================================"
Python DNS检测脚本(功能更全面)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import dns.resolver
import dns.reversename
import socket
import argparse
from datetime import datetime
import concurrent.futures
class DNSAnalyzer:
def __init__(self, domain):
self.domain = domain
self.resolver = dns.resolver.Resolver()
self.resolver.timeout = 5
self.resolver.lifetime = 5
self.custom_dns = ['8.8.8.8', '1.1.1.1', '114.114.114.114']
def check_record(self, record_type):
"""检查特定类型的DNS记录"""
try:
answers = self.resolver.resolve(self.domain, record_type)
return [str(rdata) for rdata in answers]
except dns.resolver.NoAnswer:
return None
except dns.resolver.NXDOMAIN:
return "域名不存在"
except Exception as e:
return f"错误: {str(e)}"
def check_all_records(self):
"""检查所有类型的DNS记录"""
record_types = ['A', 'AAAA', 'CNAME', 'MX', 'NS', 'TXT', 'SOA']
results = {}
for record_type in record_types:
results[record_type] = self.check_record(record_type)
return results
def check_custom_dns(self):
"""使用自定义DNS服务器检测"""
results = {}
for dns_server in self.custom_dns:
resolver = dns.resolver.Resolver()
resolver.nameservers = [dns_server]
resolver.timeout = 3
resolver.lifetime = 3
try:
answers = resolver.resolve(self.domain, 'A')
results[dns_server] = [str(rdata) for rdata in answers]
except Exception as e:
results[dns_server] = f"失败: {str(e)}"
return results
def check_propagation(self):
"""检测DNS传播状态"""
print(f"\n[3] DNS传播检测:")
global_dns = [
('Google', '8.8.8.8'),
('Cloudflare', '1.1.1.1'),
('OpenDNS', '208.67.222.222'),
('阿里云', '223.5.5.5'),
('114DNS', '114.114.114.114'),
('腾讯云', '119.29.29.29'),
]
results = {}
for name, dns_server in global_dns:
resolver = dns.resolver.Resolver()
resolver.nameservers = [dns_server]
try:
answers = resolver.resolve(self.domain, 'A')
ips = [str(rdata) for rdata in answers]
results[f"{name}({dns_server})"] = ips
except:
results[f"{name}({dns_server})"] = "失败"
return results
def reverse_dns(self, ip):
"""反向DNS查询"""
try:
hostname = socket.gethostbyaddr(ip)
return hostname[0]
except:
return None
def generate_report(self):
"""生成检测报告"""
print("=" * 60)
print(f"DNS解析检测报告")
print(f"域名: {self.domain}")
print(f"检测时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# 基本记录检测
print("\n[1] DNS记录检测:")
records = self.check_all_records()
for record_type, value in records.items():
if value:
print(f" {record_type}记录: {value[:3]}") # 只显示前3条
else:
print(f" {record_type}记录: 无")
# 自定义DNS检测
print("\n[2] 自定义DNS服务器检测:")
custom_results = self.check_custom_dns()
for dns, result in custom_results.items():
print(f" DNS {dns}: {result}")
# DNS传播检测
propagation_results = self.check_propagation()
for location, result in propagation_results.items():
print(f" {location}: {result}")
# 反向DNS检测
print("\n[4] 反向DNS检测:")
a_records = self.check_record('A')
if a_records and isinstance(a_records, list):
for ip in a_records[:3]:
hostname = self.reverse_dns(ip)
if hostname:
print(f" {ip} -> {hostname}")
else:
print(f" {ip} -> 未找到PTR记录")
print("\n" + "=" * 60)
print("检测完成")
print("=" * 60)
def main():
parser = argparse.ArgumentParser(description='DNS解析检测工具')
parser.add_argument('domain', help='要检测的域名')
parser.add_argument('-r', '--record', help='指定记录类型检测')
parser.add_argument('-d', '--dns-server', help='指定DNS服务器')
args = parser.parse_args()
analyzer = DNSAnalyzer(args.domain)
if args.record:
# 检测指定记录类型
result = analyzer.check_record(args.record.upper())
print(f"{args.domain} 的 {args.record.upper()} 记录: {result}")
else:
# 生成完整报告
analyzer.generate_report()
if __name__ == "__main__":
main()
Windows批处理脚本
@echo off chcp 65001 >nul set DOMAIN=%~1 if "%DOMAIN%"=="" set DOMAIN=example.com echo ======================================== echo DNS解析检测报告 echo 域名: %DOMAIN% echo 检测时间: %date% %time% echo ======================================== echo. echo [1] 系统DNS解析: nslookup %DOMAIN% 2>nul echo. echo [2] 使用公共DNS检测: echo Google DNS (8.8.8.8): nslookup %DOMAIN% 8.8.8.8 2>nul echo. echo Cloudflare DNS (1.1.1.1): nslookup %DOMAIN% 1.1.1.1 2>nul echo. echo 114DNS (114.114.114.114): nslookup %DOMAIN% 114.114.114.114 2>nul echo. echo [3] 网络连通性检测: ping -n 2 %DOMAIN% | findstr "来自" echo. echo [4] 路由追踪: tracert -d -h 10 %DOMAIN% echo. echo ======================================== echo 检测完成 echo ======================================== pause
使用说明
安装依赖(Python版本)
pip install dnspython
使用方法
Shell脚本:
chmod +x dns_check.sh ./dns_check.sh example.com
Python脚本:
python dns_analyzer.py example.com python dns_analyzer.py example.com -r MX # 只检测MX记录 python dns_analyzer.py example.com -d 8.8.8.8 # 使用指定DNS
功能特点
- 多种记录类型检测: A, AAAA, CNAME, MX, NS, TXT, SOA
- 多DNS服务器对比: 同时使用多个公共DNS检测
- DNS传播检测: 检查全球DNS服务器的解析一致性
- 响应时间检测: 测量各个DNS服务器的响应速度
- 反向DNS查询: IP地址到域名的反向解析
- 网络连通性检测: Ping和路由追踪
这些脚本可以帮助你全面了解域名解析的状态和问题。