前言

某一天,系統突然開始出現詭異的現象:使用者回報網站時好時壞,重新整理一次可能好,但下一秒又壞了。查看記錄檔發現大量的 403 Forbidden 錯誤,但最讓人困惑的是,同一個檔案,有時候能載入,有時候卻被封鎖。這到底是怎麼回事?

1. 檔案/資料夾權限設定問題

先從最常見的原因開始排查:

  1. 確認網站資料夾的 NTFS 權限是否正確
  2. IIS_IUSRS 和 IUSR 使用者需要有讀取權限
  3. Application Pool 身份對網站目錄需要有讀取權限

2. IIS 設定檢查

  1. 在 IIS 管理員中確認網站的身份驗證設定
  2. 檢查是否啟用了正確的驗證方式(如匿名驗證)
  3. 確認網站綁定設定是否正確

以上全部確認過,都沒有問題,403 依然持續出現。

問題的關鍵:動態 IP 限制設定

以上都查過沒問題之後,只能在網站上重複重新整理,同時盯著 IIS 記錄檔看。記錄檔裡確實有很多 403,但看不出理由。接著注意到一件事:原本 403 的檔案忽然正常了,反而其他檔案變成 403。多重整幾次,每次被影響的檔案都不一樣。

到這裡方向就清楚了。這不是靜態的權限問題,而是動態封鎖——問題的源頭是 IIS 的「動態 IP 限制」功能。這個原本用來防止 DDoS 的機制,把正常的頁面載入請求當成攻擊流量給擋掉了。

讓我用一張圖來說明這個機制是如何運作的:

使用者請求 動態 IP 限制 網站資源 403 Forbidden

為什麼會發生這個問題?

現代網站通常需要載入大量的 JavaScript 檔案和其他資源。當使用者開啟網站時,瀏覽器會在短時間內對同一個伺服器發出多個請求來載入這些資源。如果動態 IP 限制的門檻設太低,這些正常的載入請求就可能被誤判成攻擊流量。

解決方案

1. 調整動態 IP 限制設定



這是我原先的設定,門檻太低導致一般使用者也被擋。修改為以下設定:

  1. 「同時要求的動態 IP 位址」:50
    現代網站首次載入通常會在短時間內觸發多個資源請求,設 50 可以避免誤判正常的頁面載入行為。

  2. 「要求的最大數目」:100
    一般使用者很少在短時間內產生大量請求,設 100 允許正常的頁面切換和操作。

  3. 「時間週期」:5 秒(5000 毫秒)
    縮短計算週期,讓封鎖更快失效,也讓正常使用者不會被連帶卡太久。DDoS 通常會在短時間內持續發送大量請求,這個設定仍然能偵測到。

2. 設定 IP 白名單

  • 開啟 IIS 管理器

  • 在左側選擇您的網站

  • 找到「IP 位址和網域限制」功能並雙擊

  • 在右側「動作」面板點選「新增允許項目」

  • 輸入要允許的 IP 或 IP 範圍:

  • 單一 IP:直接輸入 IP(如:192.168.0.1)

  • IP 範圍:輸入網段和遮罩(如:192.168.0.0,遮罩:255.255.255.0)

3. 依請求類型調整安全規則

如果站內有明確的路徑區分(例如 /api//static/),可以在 IIS 的「IP 位址和網域限制」針對不同路徑設定不同的動態 IP 限制閾值,不需要對整個站套同一個規則:

  • 靜態資源路徑(圖片、CSS、JS):限制可以放寬,這類請求量大但行為規律
  • API 端點:維持中等門檻
  • 敏感操作路徑(登入、上傳等):維持較嚴格的限制

補充建議

如果調整完動態 IP 限制後,403 頻率明顯下降,可以再考慮從資源面下手減少並發請求數量,讓門檻不需要設太鬆:

  • 合併 JavaScript 檔案:減少首次載入的請求數
  • 啟用瀏覽器快取:回訪使用者不會重新觸發所有資源請求
  • 使用 CDN:把靜態資源分流到 CDN 節點,不走 IIS 主站

另外建議定期查一下 IIS 記錄檔,特別是 403 的來源 IP,確認封鎖的是正常使用者還是真的攻擊流量,視情況再調整門檻。

結論

這次的問題排查過程說明一件事:403 不一定是權限設錯,也可能是安全機制誤殺了正常流量。動態 IP 限制的預設值是為了防 DDoS 設計的,套在一般公開網站上門檻往往太低。調整成符合實際流量的數值,並搭配 IP 白名單處理內部或信任 IP,通常就能解決這類間歇性 403。

參考資源

  1. Configure Dynamic IP Security in IIS
  2. IIS Security Best Practices
  3. Web Application Security Guidelines