Cloudflare等CDN是如何检测直接IP地址访问请求的?
Cloudflare直接IP访问被拦截的核心原因
Cloudflare边缘节点采用共享IP架构,单个公网IP会同时承载数十万不同托管站点的访问流量,节点必须依赖请求携带的域名标识匹配对应站点的配置、回源规则、安全策略,无明确域名标识的请求无法路由到正确的站点资源,默认就会返回Error 1003 Direct IP access not allowed拦截提示。
识别直接IP访问的核心判断逻辑
- HTTP请求Host头校验
HTTP/1.1及以上版本协议强制要求所有请求携带Host请求头,字段值为客户端要访问的目标域名。通过域名正常访问时,浏览器会自动将地址栏中的域名填入该字段,Cloudflare节点拿到字段值后,匹配内部绑定的站点列表,找到对应配置后再处理请求、回源返回内容。如果直接在地址栏输入IP访问,浏览器填入Host头的值就是输入的IP地址,节点无法匹配到任何托管站点的规则,直接触发拦截。 - TLS握手阶段SNI校验
HTTPS请求在正式传输HTTP内容前,需要先完成TLS握手协商。TLS握手的SNI(服务器名称指示)扩展会在握手初始阶段,由客户端明文告知服务器要访问的目标域名,Cloudflare节点会依据这个字段返回对应站点的SSL证书,同时提前匹配站点规则。直接输入IP访问时,客户端要么在SNI字段填入IP地址,要么不携带有效SNI,节点在握手阶段就可以识别出这是无明确目标站点的直接IP请求,直接走拦截逻辑。
域名访问未被拦截的原因
通过域名访问时,浏览器的执行流程虽然也是先做DNS解析拿到Cloudflare节点IP,再向该IP发起请求,但整个过程会自动完成两个关键操作:TLS握手时将目标域名填入SNI字段,发起HTTP请求时将目标域名填入Host头,节点拿到两个有效域名标识后,可以正常匹配对应站点的所有配置,因此不会触发拦截。
补充说明:即便手动修改请求的Host头和SNI,试图通过节点IP访问未在Cloudflare上绑定到该IP的站点,也会触发Cloudflare的其他安全规则拦截,不会返回正常站点内容。错误提示中的Ray ID是Cloudflare为每一个经过节点的请求生成的唯一追踪标识,可用于定位请求的全链路日志。
内容的提问来源于stack exchange,提问作者The Entity
相关产品推荐
相关产品推荐

