癥狀速查
通過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頻寬資源,產生的流量頻寬費用由您自行承擔,極易出現高額賬單,甚至導致賬戶欠費停機。關於延停服務、費用控制等,請見高額賬單風險警示。
如何確認網域名稱是否遭受盜刷或攻擊?
通過以下方式初步確認:
登入CDN控制台,在監控報表中查看網域名稱的頻寬和流量趨勢,觀察是否存在非業務時段的異常峰值。
下載網域名稱的CDN訪問日誌,分析訪問來源的IP分布、Referer分布和UA分布,識別是否存在高頻訪問的異常IP段、異常Referer來源或爬蟲類UA。
在CloudMonitor中檢查是否已觸發頻寬或流量警示。
如何防護和處理?
建議提前做好防護:通過警示設定功能配置頻寬峰值和下行流量的警示規則,達到閾值時及時收到通知;根據攻擊特徵配置IP黑名單、Referer黑名單、UA黑名單或URL鑒權等存取控制策略進行攔截。針對盜刷情境的攔截方案請參見防範流量盜刷最佳實務。
如果網域名稱已被切入沙箱,需等待攻擊流量消退後提交工單申請解除沙箱。為避免再次觸發,建議在解除前配置好存取控制策略。