越来越多的网站使用 CDN 来加速访问和防御 DDoS。但 CDN 在保护源站的同时也带来一个盲区:一旦源站的真实 IP 被暴露,攻击者就能绕过 CDN 直接攻击。

一、CDN 的工作原理
用户请求
→DNS 解析到 CDN
→CDN 边缘节点
→回源到真实服务器
→返回内容
用户看到的 IP 是 CDN 节点的 IP,源站的真实 IP 被隐藏。但这种隐藏并不是万无一失的。
二、真实 IP 暴露的 7 种途径
| # | 途径 | 原理 | 风险 |
|---|---|---|---|
| 1 | DNS 历史记录 | 接入 CDN 前的 A/AAAA 记录被缓存 | 高 |
| 2 | 子域名未走 CDN | mail/ftp 等子域直接解析到源站 | 高 |
| 3 | SSL 证书透明度 | 通过 Censys 反查证书对应 IP | 中 |
| 4 | 邮件头 | Received 头暴露源站 IP | 中 |
| 5 | SSRF | 利用回调功能让服务器主动连接 | 中 |
| 6 | IPv6 未走 CDN | AAAA 记录直接指向源站 | 高 |
| 7 | 直接 IP 访问 | 被 Shodan/Censys 扫描匹配 | 中 |
三、检测方法实战
方法 1:DNS 历史查询
# SecurityTrails API 查询域名历史解析记录
curl "https://api.securitytrails.com/v1/history/example.com/dns/a" \
-H "apikey: YOUR_API_KEY"
# 输出示例:
# 2024-01-15: 203.0.113.42 <-- 接入 CDN 前的真实 IP
# 2024-03-01: 104.18.32.5 <-- CDN 节点 IP (Cloudflare)方法 2:子域名枚举
# 用 subfinder 枚举子域名
subfinder -d example.com -silent | while read sub; do
ip=$(dig +short "$sub" A | head -1)
echo "$sub -> $ip"
done
# 常见暴露点:
# mail.example.com -> 203.0.113.42 ⭐ 源站 IP!
# ftp.example.com -> 203.0.113.42 ⭐ 源站 IP!
# www.example.com -> 104.18.32.5 CDN 节点方法 3:SSL 证书反查
# 在 Censys 上搜索使用特定域名证书的 IP
# 搜索语法:services.tls.certificates.leaf.names: example.com
# 结果中可能出现非 CDN 的 IP 地址⚠️ 注意:不要对不属于你的站点进行主动探测或攻击。以上方法仅用于自我安全审计。未经授权的探测可能违反法律。
🛡️ 源站 IP 保护清单:
- 迁移源站 IP:接入 CDN 后更换 IP
- 所有子域名全部走 CDN
- 邮件用第三方服务
- 防火墙白名单:只允许 CDN IP 访问 80/443
- 直接 IP 访问返回 444
- IPv6 同步接入 CDN
四、CDN 提供商对比
| 功能 | Cloudflare | AWS CloudFront | Akamai | Fastly |
|---|---|---|---|---|
| 源站隐藏 | ✅ | ✅ | ✅ | ✅ |
| DDoS 防护 | ✅ 免费 | ✅ Shield | ✅ Prolexic | ✅ |
| WAF | ✅ | ✅ | ✅ | ✅ |
| 免费计划 | ✅ | ❌ | ❌ | ❌ |
五、自查清单
- 在 SecurityTrails 搜索域名历史 DNS
- 用 subfinder 枚举子域名
- 在 Censys 搜索证书对应 IP
- 用 ipinfo.im CDN 检测工具快速扫描
- 检查出站邮件头中的 Received 字段