You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何验证请求确实由CloudFlare代理?防范cf-connecting-ip伪造风险

如何确保请求确实由Cloudflare代理?

嘿,这个问题抓得很准——直接信任cf-connecting-ip确实存在安全漏洞,要是攻击者绕开Cloudflare直接访问你的真实服务器,随便伪造个请求头就能伪装成合法代理请求。下面是几个经实践验证的可靠方法,帮你把这个风险堵上:

1. 验证请求源IP是否属于Cloudflare官方IP段

Cloudflare会公开所有用于代理用户请求的IP地址范围,你可以通过这个方式先把非Cloudflare来源的请求直接拦截。只有当请求的源IP在Cloudflare的官方IP列表里时,后续的cf-connecting-ip等请求头才值得信任。

举个Nginx配置的例子(你可以把IP段单独写到一个文件里用include引入,方便后续更新):

# 初始化标记变量
set $is_cloudflare 0;
# 匹配Cloudflare的IP段(这里只写了部分,实际要包含所有官方IP)
if ($remote_addr ~* ^103\.21\.244\.[0-9]+|^103\.22\.200\.[0-9]+|^103\.31\.4\.[0-9]+) {
    set $is_cloudflare 1;
}
# 非Cloudflare来源直接拒绝
if ($is_cloudflare = 0) {
    return 403;
}

注意:Cloudflare的IP段会不定期更新,建议写个简单的脚本定时拉取官方最新列表并更新服务器配置,避免漏掉新的IP范围。

2. 启用Cloudflare Authenticated Origin Pulls(认证源拉取)

这是更安全的加密级验证方式:Cloudflare会用它专属的SSL证书向你的服务器发起请求,你的服务器只接受带有合法Cloudflare客户端证书的请求。就算攻击者知道你的真实IP,没有Cloudflare的证书也根本无法伪造通过验证的请求。

启用步骤大概是:

  • 在Cloudflare控制台的域名设置里开启Authenticated Origin Pulls功能
  • 下载Cloudflare的根证书到你的服务器
  • 配置Web服务器(比如Nginx、Apache)强制验证客户端证书

以Nginx为例,配置片段如下:

# 指定Cloudflare根证书路径
ssl_client_certificate /etc/nginx/ssl/cloudflare-origin-pull-ca.pem;
# 开启客户端证书验证
ssl_verify_client on;

这种方法比单纯的IP验证更可靠,属于双重保险的首选方案。

3. 别单独依赖任何请求头做验证

像你提到的cf-request-id,它只是每个请求的唯一标识,没有内置的安全密钥,攻击者完全可以生成一个格式类似的字符串伪造这个请求头。所以永远不要只靠某个请求头来判断请求是否来自Cloudflare,必须结合上面的IP段验证或证书验证,再去使用cf-connecting-ip这类头信息。


内容的提问来源于stack exchange,提问作者Ronin

火山引擎 最新活动