自建域名扫描工具domain-scanner实战指南
1. 项目概述:为什么需要自建域名扫描工具
在互联网基础设施管理中,域名扫描是每个运维工程师和安全研究员的基础技能。传统人工查询方式在面对批量域名检测时效率低下,而商业扫描工具往往价格昂贵且存在隐私风险。domain-scanner作为一款轻量级开源工具,完美解决了这个痛点——它不仅能实现自动化批量扫描,还能将数据完全掌控在自己手中。
我最初接触这个工具是在一次企业级安全审计项目中,当时需要检测2000+子域名的SSL证书状态和DNS解析情况。手动操作几乎不可能完成,而domain-scanner在配置好的服务器上仅用2小时就输出了完整报告。这种效率提升让我意识到:掌握自建扫描能力,是每个技术从业者的必备技能。
2. 环境准备与工具选型
2.1 服务器配置建议
实测表明,domain-scanner在2核4G配置的云服务器上即可流畅运行。对于扫描任务量级评估:
- 小型项目(<500域名):1核2G足够
- 中型项目(500-5000域名):建议2核4G
- 大型扫描(>5000域名):需要4核8G及以上
特别注意:避免使用共享型虚拟主机,部分扫描功能需要root权限且对网络吞吐量要求较高。推荐选择按量付费的云服务器,扫描完成后可立即释放资源。
2.2 系统环境配置
以下是在Ubuntu 22.04 LTS上的最佳实践:
# 更新系统并安装依赖 sudo apt update && sudo apt upgrade -y sudo apt install -y git python3-pip build-essential libssl-dev # 安装Python虚拟环境 python3 -m pip install --user virtualenv python3 -m virtualenv ~/domain-scanner-env source ~/domain-scanner-env/bin/activate3. domain-scanner深度解析与部署
3.1 工具架构揭秘
domain-scanner采用模块化设计,核心组件包括:
- 扫描引擎:基于Python的异步IO框架
- 插件系统:支持DNS枚举、HTTP探测、SSL检测等
- 结果处理器:输出JSON/CSV格式报告
其工作流程如下图所示(伪代码表示):
for domain in target_list: for plugin in enabled_plugins: result = plugin.scan(domain) save_result(result)3.2 完整安装步骤
# 克隆仓库(国内用户建议使用镜像源) git clone https://github.com/domain-scanner/domain-scanner.git cd domain-scanner # 安装依赖 pip install -r requirements.txt # 测试安装 python scanner.py --version典型安装问题排查:
- 如遇SSL错误,尝试:
sudo apt install --reinstall ca-certificates - 依赖冲突时建议:
pip install --ignore-installed [包名]
4. 实战配置与高级技巧
4.1 基础扫描配置
创建config.ini配置文件:
[general] threads = 50 # 并发线程数 timeout = 10 # 超时秒数 [plugins] dns = true http = true ssl = true [output] format = json directory = ./results启动扫描命令:
python scanner.py -c config.ini -t targets.txt4.2 性能调优参数
通过实测得出的黄金配置比例:
- 线程数 = (CPU核心数 × 20) + 10
- 超时时间 = 平均响应时间 × 3
- 网络带宽占用建议控制在总带宽的70%以下
示例监控命令:
watch -n 1 "netstat -ant | grep ESTABLISHED | wc -l"5. 安全防护与合规使用
5.1 扫描防护策略
为避免被目标封禁,建议:
- 随机化User-Agent
- 设置合理的请求间隔(--delay参数)
- 使用代理池轮询(需自行搭建)
代理配置示例:
[proxy] enable = true list = proxy_list.txt rotate = 10 # 每10个请求切换代理5.2 法律合规要点
重要红线:
- 禁止扫描非授权域名
- 控制扫描频率(建议<100请求/分钟/域名)
- 敏感数据加密存储
建议在扫描前添加法律声明:
#!/bin/bash echo "确认已获得扫描授权 (Y/N)" read confirm [ "$confirm" != "Y" ] && exit 16. 结果分析与可视化
6.1 数据处理技巧
使用jq工具处理JSON结果:
# 提取所有过期的SSL证书 jq '.[] | select(.ssl.valid == false)' results.json # 统计各状态码出现次数 jq '[.[].http.status_code] | group_by(.) | map({code: .[0], count: length})' results.json6.2 可视化方案
推荐Grafana+Elasticsearch方案:
- 使用logstash导入扫描结果
- 配置仪表盘监控:
- 证书过期时间分布
- DNS记录类型统计
- HTTP服务响应时间热力图
7. 企业级应用场景
7.1 资产发现与监控
自动化巡检方案:
- 每日凌晨执行扫描
- 对比昨日结果生成差异报告
- 关键变更触发邮件告警
实现代码片段:
from difflib import unified_diff with open('today.json') as f1, open('yesterday.json') as f2: diff = unified_diff(f1.readlines(), f2.readlines()) if list(diff): send_alert_email()7.2 安全审计流程
标准审计步骤:
- 初扫:全量域名发现
- 精扫:重点域名深度检测
- 验证:人工复核关键漏洞
- 报告:生成符合等保要求的文档
8. 进阶开发指南
8.1 插件开发实践
自定义插件模板:
from scanners import BaseScanner class MyScanner(BaseScanner): def scan(self, domain): # 实现扫描逻辑 return {'custom_data': 'example'} def required_ports(self): return [443] # 声明需要访问的端口注册插件到config.ini:
[plugins] myplugin = true8.2 分布式扩展方案
使用Redis实现任务队列:
import redis from rq import Queue q = Queue(connection=redis.Redis()) for domain in domains: q.enqueue(scan_task, domain)性能对比数据:
| 节点数 | 扫描速度(域名/分钟) |
|---|---|
| 1 | 500 |
| 3 | 1300 |
| 5 | 2100 |
9. 运维管理实践
9.1 日志监控方案
推荐日志配置:
[logging] level = INFO file = /var/log/domain-scanner.log max_size = 50 # MB backup_count = 5关键日志监控指标:
- ERROR级别日志即时告警
- 扫描完成率低于95%触发检查
- 异常耗时操作记录(>30秒)
9.2 备份策略设计
采用3-2-1原则:
- 3份副本(本地+异地+冷备)
- 2种介质(SSD+磁带)
- 1份离线存储
自动化脚本示例:
#!/bin/bash tar czf scan_backup_$(date +%F).tar.gz results/ rclone copy scan_backup_*.tar.gz backup:bucket/10. 真实案例复盘
某电商平台巡检中发现:
- 子域名cdn.example.com的SSL证书将在7天后过期
- 测试环境test.example.com暴露了目录列表
- 历史遗留域名old.example.com解析到未知IP
处理流程:
- 立即更新CDN证书(1小时完成)
- 添加测试环境目录访问限制(15分钟)
- 清理废弃域名DNS记录(30分钟)
事后优化:
- 建立自动化证书监控
- 实施测试环境访问白名单
- 季度级域名资产梳理
在持续运行domain-scanner三个月后,我们的运维团队成功将证书过期事故降为零,同时发现了17个未被监控的隐藏子域名。这套方案现在已成为我们基础设施监控体系中不可或缺的一环。
