症状速查
通过curl -v或浏览器开发者工具查看响应头中的X-Tengine-Error字段,对照下表快速定位原因:
说明:如果响应头中存在X-Tengine-Error但值不在上表中,或域名开启了远程鉴权功能,请参见远程鉴权导致的403。
如何判断403是CDN返回的还是源站返回的?
访问加速资源返回403时,先判断403的来源,再按对应症状族排查:
URL鉴权导致的403
开启URL鉴权功能后,如果请求未携带鉴权参数或鉴权参数无效,CDN会返回403。通过响应头中的X-Tengine-Error: denied by req auth信息判断具体原因。
说明:URL鉴权仅控制访问权限,鉴权结果不影响CDN的缓存行为。鉴权通过后,CDN节点会去除URL中的鉴权参数(如auth_key),使用原始URL作为缓存标识(Cache Key),不同用户针对同一资源生成的不同鉴权URL命中同一份缓存。鉴权过期仅导致后续新请求被拦截返回403,不会使已缓存的资源失效。
报错denied by req auth: no url arg auth_key(未携带鉴权参数)
报错denied by req auth: expired timestamp(鉴权过期)
报错denied by req auth: invalid md5hash(鉴权计算错误)
Referer黑白名单导致的403
配置Referer黑白名单后,如果请求的Referer与规则不匹配,CDN会返回403,响应头中的错误信息为X-Tengine-Error: denied by Referer ACL。您可以使用curl -e "<Referer值>" <加速资源URL>命令模拟携带指定Referer的请求进行验证。
携带Referer的请求被拦截(denied by Referer ACL)
问题原因:请求携带的Referer不在白名单内,或命中了黑名单。常见于黑白名单白名单配置遗漏了实际引用资源的站点域名。
诊断方法:在CDN控制台查看该加速域名的Referer黑白名单配置,判断被拦截请求的Referer是否匹配规则。也可以通过下载CDN日志找到对应访问记录的Referer头。
解决方案:将被拦截的Referer加入白名单(或从黑名单移除)。配置方法请参见配置Referer黑/白名单。
空Referer的请求被拦截(直接访问URL返回403)
问题原因:以下场景的请求不携带Referer(即空Referer):通过浏览器地址栏直接访问资源URL;在APP或客户端程序中构造请求未设置Referer头;HTTPS页面引用HTTP资源时浏览器根据默认Referrer-Policy不发送Referer;页面显式设置了Referrer-Policy: no-referrer;使用curl、wget等命令行工具默认不携带Referer。如果Referer黑白名单配置未勾选允许通过浏览器地址栏直接访问资源URL,空Referer请求会被拦截。
解决方案:如果业务需要允许空Referer访问,在Referer黑白名单配置中勾选允许通过浏览器地址栏直接访问资源URL;如果是为了防范空Referer盗刷而有意拦截,请勿放开,并参见流量异常与恶意盗刷配置更精细的防护策略。配置方法请参见配置Referer黑/白名单。
CDN其他访问控制导致的403
IP黑白名单导致的403
配置IP黑/白名单后,如果客户端IP命中黑名单或不在白名单内,CDN节点拒绝请求并返回403。响应头X-Tengine-Error: denied by IP ACL = blacklist表示命中IP黑名单,X-Tengine-Error: denied by IP ACL = not in whitelist表示不在IP白名单内。
诊断方法:先确认客户端的真实公网IP(可通过curl ifconfig.me或curl myip.ipip.net查询)。如果请求经过了代理或负载均衡,CDN获取的客户端IP可能是代理IP而非终端用户IP,需确认CDN节点实际识别到的客户端IP。在CDN控制台查看该域名的IP黑/白名单配置,确认该IP是否匹配规则。
解决方案:先确认拦截是否符合预期。如需放行该IP,在CDN控制台的域名管理中单击目标域名对应的管理,在左侧导航栏单击访问控制,在IP黑/白名单区域调整规则。配置方法请参见配置IP黑/白名单。如果IP黑名单中的IP仍可访问资源,请参见为什么IP黑名单中的IP仍可访问资源?。
UA黑白名单导致的403
配置UA黑/白名单后,如果请求头中的User-Agent命中UA黑名单或不在UA白名单内,CDN节点拒绝请求并返回403。响应头X-Tengine-Error: black ua表示命中UA黑名单,X-Tengine-Error: not in white ua表示不在UA白名单内。
诊断方法:通过curl -v <加速资源URL>查看请求实际发出的User-Agent值,或在浏览器开发者工具的请求头中查看。在CDN控制台查看该域名的UA黑/白名单规则,确认是否匹配。注意UA黑白名单支持通配符匹配,检查是否被通配规则意外命中。
解决方案:先确认拦截是否符合预期。如需放行,在CDN控制台的域名管理中单击目标域名对应的管理,在左侧导航栏单击访问控制,在UA黑/白名单页签下调整规则。配置方法请参见配置UA黑白名单。
远程鉴权导致的403
开启远程鉴权后,CDN节点会将请求转发给您指定的鉴权服务器验证,以下两种情况会拦截请求并返回403:
鉴权服务器返回了配置中定义的鉴权失败状态码(例如403),CDN判定鉴权失败,拒绝用户请求。
鉴权超时(CDN节点与鉴权服务器的交互未在配置的超时时长内完成),且鉴权超时之后的动作配置为拒绝。
诊断方法:如果403不属于上述URL鉴权、Referer、IP ACL、UA ACL中的任何一种(响应头中的X-Tengine-Error值均不匹配),且域名开启了远程鉴权功能,则应优先排查远程鉴权。在CDN控制台查看该域名远程鉴权配置的鉴权失败状态码、鉴权超时配置与鉴权超时之后的动作,再结合鉴权服务器的访问日志,确认鉴权服务器实际返回的状态码以及是否存在超时。
解决方案:如果拦截不符合预期,请调整鉴权服务器的验证逻辑或鉴权失败状态码配置;如果鉴权频繁超时,请排查鉴权服务器性能(超时时长最长可设置为3000毫秒),或结合业务风险评估将鉴权超时之后的动作调整为通过。配置方法请参见配置远程鉴权。
源站返回的403
如果响应头中不包含X-Tengine-Error字段,且X-Cache为MISS,说明CDN未命中缓存、请求回源后由源站返回了403。此时需要排查源站自身的访问控制策略。
源站为OSS时的403(AccessDenied等报错)
403由OSS源站返回,常见报错有三种:
报错You have no right to access this object because of bucket acl:源Bucket为私有读权限,CDN回源请求未通过OSS鉴权。建议在CDN控制台开启OSS私有Bucket回源授权。配置方法请参见OSS私有Bucket回源。
报错You are denied by bucket referer policy:Bucket设置了Referer黑白名单,CDN回源请求的Referer不符合Bucket黑白名单规则。在OSS控制台检查Bucket黑白名单设置,允许CDN回源请求访问(例如允许空Referer,或将CDN回源时携带的Referer加入白名单)。
报错You are forbidden to list buckets:同时开启了CDN私有Bucket回源与OSS静态网站托管,两个功能存在冲突。需关闭其中一个:关闭CDN私有Bucket回源授权,或关闭OSS静态网站托管功能。冲突说明请参见CDN回源OSS私有Bucket功能与OSS静态网站托管功能的默认首页配置冲突。
回源HOST或其他源站策略导致的403
问题原因:CDN回源时,回源HOST决定了回源请求访问源站IP地址上的哪个站点。如果回源HOST配置错误,可能匹配到源站上未提供服务或有访问限制的站点,导致源站返回403。此外,源站自身的防火墙规则、WAF策略或应用层访问控制也可能拦截CDN的回源请求。
诊断方法:通过绑定hosts的方式将加速域名指向源站IP,直接访问源站验证是否也返回403。检查CDN控制台中的回源HOST配置,确认其指向源站上实际提供服务的站点。
解决方案:修正回源HOST配置,确保回源HOST指向源站上实际提供服务的站点。如果源站有防火墙或WAF拦截了CDN回源请求,将CDN回源IP段加入源站白名单。源站侧通用排查方法请参见回源排障指南。
流量异常与恶意盗刷
域名被恶意攻击或流量被恶意盗刷,会产生突发高带宽或大流量,主要带来两类风险:
域名被切入沙箱:阿里云CDN是公共加速服务,默认不提供抗攻击能力。当域名遭受攻击时,CDN系统有权根据业务情况与攻击影响程度将域名切入沙箱,防止影响其他用户的加速服务。攻击较严重时,同账户下的其他域名也可能被切入沙箱,并限制账号下的新域名接入。域名进入沙箱后,CDN不再保证服务质量。关于沙箱的详细说明,请见沙箱说明。
恶意访问带来高额账单:攻击与盗刷行为实际消耗了CDN带宽资源,产生的流量带宽费用由您自行承担,极易出现高额账单,甚至导致账户欠费停机。关于延停服务、费用控制等,请见高额账单风险警示。
如何防护和处理?
建议提前做好防护:通过报警设置功能配置带宽峰值和下行流量的报警规则,达到阈值时及时收到通知;根据攻击特征配置IP黑名单、Referer黑名单、UA黑名单或URL鉴权等访问控制策略进行拦截。针对盗刷场景的拦截方案请参见防范流量盗刷最佳实践。
如果域名已被切入沙箱,需等待攻击流量消退后提交工单申请解除沙箱。为避免再次触发,建议在解除前配置好访问控制策略。