Cloudflare 代理后如何获取真实攻击来源 IP?(含服务器配置)
接入 Cloudflare 后,源站服务器默认看到的 IP 是 Cloudflare 节点 IP。要获取真实攻击者 IP,免费用户主要依赖服务器端日志配置,付费用户可结合 Cloudflare 控制台日志。
先说结论:Cloudflare 代理会隐藏真实 IP,查看攻击来源需结合服务器日志配置和 Cloudflare 日志产品。
- 免费用户:必须在 Nginx/Apache 中配置信任 Cloudflare IP 段,读取
CF-Connecting-IP头。 - 付费用户:可使用 Cloudflare Dashboard 安全事件日志或 Logpush 功能。
- 关键验证:配置后需确认日志记录的是客户端公网 IP,而非 Cloudflare 节点 IP。
Cloudflare 控制台日志查看(免费 vs 付费)
虽然服务器日志最可靠,但 Cloudflare 控制台也提供部分安全日志。
1. 免费套餐
路径:Dashboard -> Security -> Events。
- 可查看最近的安全事件(如 WAF 拦截、挑战记录)。
- 限制:历史数据保留时间短(通常 72 小时),无法导出完整原始日志,难以进行深度溯源分析。
2. 付费套餐(Pro/Business/Enterprise)
- 提供更长的历史数据保留期。
- 支持 Logpush 功能,可将原始日志推送到自己的存储(如 S3、Splunk),便于长期分析攻击来源。
- 企业版支持更详细的字段和实时日志流。
鉴于免费套餐限制,建议所有用户均在服务器端配置日志记录。
服务器端配置获取真实 IP
Cloudflare 会在 HTTP 请求头中添加 CF-Connecting-IP 字段。需在 Web 服务器中配置信任 Cloudflare 的 IP 段,才能将该头部的值视为真实客户端 IP。
Nginx 配置方案
在 http 或 server 块中添加以下配置。注意:Cloudflare IP 段会变动,建议定期更新。
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
real_ip_header CF-Connecting-IP;配置完成后执行 nginx -t 验证语法,然后 nginx -s reload 重新加载。
自动更新 Cloudflare IP 段(推荐)
为避免 IP 段过期导致获取失败,可编写脚本定期拉取官方列表:
#!/bin/bash
# 获取 IPv4 列表并转换为 Nginx 格式
curl -s https://www.cloudflare.com/ips-v4 | sed 's/^/set_real_ip_from /;' | sed 's/$/;/' > /etc/nginx/conf.d/cloudflare_real_ip.conf
# 验证并重载
nginx -t && nginx -s reload建议将此脚本加入 crontab,每周执行一次。
Apache 配置方案
推荐使用 mod_remoteip 模块,而非旧版的 SetEnvIf 方法。
1. 启用模块
a2enmod remoteip2. 配置信任代理
在 /etc/apache2/conf-available/remoteip.conf 中添加:
RemoteIPHeader CF-Connecting-IP
RemoteIPInternalProxy 173.245.48.0/20
RemoteIPInternalProxy 103.21.244.0/22
# 需补充完整 Cloudflare IP 段,参考上方 Nginx 列表3. 修改日志格式
确保 LogFormat 使用 %a(远程 IP)而非 %h(主机 IP):
LogFormat "%a %l %u %t \"%r\" %>s %b" common重启 Apache 生效:systemctl restart apache2。
验证配置是否生效
配置完成后,必须验证日志是否记录了真实 IP。
- 本地访问测试:使用本地浏览器访问网站,查看服务器日志。
tail -f /var/log/nginx/access.log。 - IP 对比:日志中的 IP 应为你本地的公网 IP,而非 Cloudflare 节点 IP。
- 字段对比:在 Nginx 日志格式中同时记录
$remote_addr和$http_cf_connecting_ip。配置生效后,$remote_addr应自动变为与$http_cf_connecting_ip一致。 - IP 段查询:使用在线工具查询日志中的 IP 归属,确认不属于 Cloudflare ASN。
如果日志仍显示 Cloudflare IP,检查 set_real_ip_from 是否包含当前请求来源的 CF 节点 IP,或确认域名 DNS 是否已开启橙色云朵代理。
常见坑与排查
坑一:IP 段未更新
Cloudflare 会不定期新增 IP 范围。若配置过旧,新节点请求的真实 IP 将无法提取。务必使用上述自动更新脚本或定期查阅官方文档。
坑二:多层代理场景
若架构中存在其他代理(如负载均衡、其他 CDN),X-Forwarded-For 可能包含多个 IP(client, proxy1, proxy2)。此时 CF-Connecting-IP 通常更可靠,因为它由 Cloudflare 直接注入。
坑三:直接暴露源站 IP
配置日志前,若源站 IP 已泄露,攻击者可能绕过 Cloudflare 直接攻击源站。此时服务器日志记录的将是攻击者真实 IP,但流量未经过 CF 防护。建议更换源站 IP 并严格限制防火墙仅允许 Cloudflare IP 段访问。
坑四:隐私合规
记录真实 IP 涉及用户隐私。在欧盟等地区需符合 GDPR 要求。确保日志保留策略合规,避免无限制存储包含个人信息的日志,必要时对日志中的 IP 进行脱敏处理。
参考来源
- Cloudflare 官方 IP 范围文档:https://developers.cloudflare.com/fundamentals/get-started/reference/ip-ranges/
- Cloudflare 安全事件日志:https://developers.cloudflare.com/waf/tools/security-events/
- Nginx ngx_http_realip_module 文档:http://nginx.org/en/docs/http/ngx_http_realip_module.html
- Apache mod_remoteip 文档:https://httpd.apache.org/docs/current/mod/mod_remoteip.html