从WHOIS到DNS的自动化侦查全攻略
目录导读
- 为什么需要脚本化获取域名信息——手动查询的痛点与自动化价值
- 核心技术栈——Python/Shell/Bash 三大主流方案对比
- WHOIS信息抓取实战——注册商、到期时间、NS记录提取
- DNS解析数据采集——A记录、MX记录、TXT记录的批量获取
- 高级进阶——子域名枚举与CDN识别自动化
- 常见问题与解答(FAQ)——脚本报错、反爬限制、合规性讨论
为什么需要脚本化获取域名信息
在日常运维、网络安全审计或SEO竞品分析中,我们经常需要批量获取域名的注册信息、DNS解析记录、IP归属等数据,手动打开网页查询不仅效率低下,且无法应对上百个域名的场景,脚本化方案能将原本10分钟/域名的操作压缩到3秒/域名,同时支持定时任务自动巡检,这在域名过期监控、钓鱼站点溯源、CDN切换验证等场景中至关重要。

核心技术栈:Python vs Shell vs Bash
| 方案 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|
| Python + python-whois | 跨平台、数据结构化好 | 需安装依赖库 | 复杂数据分析 |
| Shell + whois命令 | 零依赖、系统自带 | 文本解析繁琐 | Linux服务器快速查询 |
| Bash + dig/nslookup | DNS查询最快 | 仅限DNS记录 | 纯DNS批量检测 |
推荐首选Python,因为其python-whois库封装了WHOIS协议细节,且dnspython能完美处理DNS各类记录。
WHOIS信息抓取实战
核心脚本示例(Python):
import whois
def get_domain_info(domain):
try:
w = whois.whois(domain)
return {
'registrar': w.registrar,
'expiration_date': str(w.expiration_date),
'name_servers': w.name_servers,
'status': w.status,
'org': w.org
}
except Exception as e:
return {'error': str(e)}
# 批量处理
domains = ['example.cn', 'test.net', 'demo.org']
for d in domains:
print(f"{d} -> {get_domain_info(d)}")
关键技巧:
- 使用
try/except捕获超时或无法解析的域名,避免中断批量任务 - 部分注册商(如阿里云)会隐藏WHOIS信息,需额外解析
redacted for privacy字段 - 建议设置
socket.setdefaulttimeout(10)防止卡死
DNS解析数据采集
针对DNS记录的Python脚本:
import dns.resolver
def get_dns_records(domain, record_type):
records = []
try:
answers = dns.resolver.resolve(domain, record_type)
for rdata in answers:
records.append(rdata.to_text())
except Exception:
pass
return records
# 同时获取A、MX、TXT
for dom in ['example.com']:
print("A记录:", get_dns_records(dom, 'A'))
print("MX记录:", get_dns_records(dom, 'MX'))
print("TXT记录:", get_dns_records(dom, 'TXT'))
注意点:
- 部分域名只支持IPv6(AAAA记录),需同时查询
- CNAME记录会覆盖A记录查询,需用
dns.resolver.resolve(domain, 'CNAME')单独验证 - 建议加
lifetime=5参数控制查询时长
高级进阶:子域名枚举与CDN识别
结合 crt.sh 证书透明度日志,可批量获取子域名:
curl -s "https://crt.sh/?q=%25.example.com&output=json" | jq -r '.[].name_value' | sort -u
再通过IP段比对阿里云/腾讯云/Cloudflare的IP范围,能在脚本中自动标记CDN资产,此技术在红蓝对抗演练中效率极高。
常见问题与解答(FAQ)
Q1:脚本运行时报whois模块不存在怎么办?
A:执行pip install python-whois dnspython即可,若在Linux下提示缺少whois命令,需apt install whois(Debian系)或yum install jwhois(CentOS系)。
Q2:批量查询1000个域名总有几个超时/无响应,如何优化?
A:使用concurrent.futures.ThreadPoolExecutor实现多线程并发,设置最大线程数20,配合重试机制(3次,每次退避2秒),同时建议将结果写入CSV,断点续跑。
Q3:频繁脚本查询会被封IP吗?
A:WHOIS服务器通常有速率限制(如5次/分钟),建议控制并发数,或使用公共WHOIS API(如whoisxmlapi.com)做代理层,对于DNS查询,本地缓存结果,避免反复请求。
Q4:如何确保脚本符合法律法规? A:仅查询自己拥有或已授权的域名信息,根据《网络安全法》,未经授权大规模采集他人域名数据可能涉及侵犯公民个人信息罪,请务必设定白名单机制,并在脚本中加入合规提示。
Q5:能获取到域名的历史注册人邮箱吗?
A:多数注册商已默认隐藏WHOIS隐私,可尝试访问domain.glass或securitytrails.com的API(付费),但这些第三方接口也有调用频率限制,脚本中需控制每秒请求数。
本文总结:通过Python脚本,我们能用不到50行代码实现域名的全维度信息采集,但需牢记——自动化工具是双刃剑,合理运用于资产审计、故障排查才是正确方向,建议初学者从单域名查询开始,逐步扩展为批量任务,并在实践中理解WHOIS协议的RFC 3912规范与DNS报文格式,才能真正掌握脚本背后的原理。