Nginx 抵御 CC 攻擊的限流模塊配置(limit_req/limit_conn)

nginx抵御cc攻擊的核心在于限制請求速率和并發連接數。1. 使用limit_req模塊控制請求速率,如每秒每個ip最多1個請求;2. 使用limit_conn模塊限制并發連接數,如單ip最大10個連接;3. 可結合burst參數允許突發流量,并通過nodelay控制拒絕策略;4. 可針對特定url或用戶代理進行更細粒度的限制;5. 通過error_page自定義限流后的錯誤頁面;6. 調整參數時需結合基線測試、逐步優化并考慮用戶體驗;7. 配合waf、驗證碼、cdn、黑名單等手段增強防護;8. 利用nginx日志、stub_status模塊及第三方工具監控限流效果并持續優化配置

Nginx 抵御 CC 攻擊的限流模塊配置(limit_req/limit_conn)

Nginx 抵御 CC 攻擊,核心在于限制請求速率和并發連接數。limit_req 控制請求速率,limit_conn 控制并發連接數。兩者結合,能在一定程度上緩解 CC 攻擊帶來的壓力。

解決方案

配置 Nginx 抵御 CC 攻擊,主要通過 limit_req 和 limit_conn 模塊來實現。以下是一個基本的配置示例,并附帶詳細解釋:

  1. 定義共享內存區域:

    http {     limit_req_zone $binary_remote_addr zone=mylimit:10m rate=1r/s;     limit_conn_zone $binary_remote_addr zone=connlimit:10m; }
    • limit_req_zone: 定義一個名為 mylimit 的共享內存區域,大小為 10MB。$binary_remote_addr 作為 key,表示基于客戶端 IP 地址進行限制。rate=1r/s 表示允許每個 IP 地址每秒最多發起 1 個請求。
    • limit_conn_zone: 定義一個名為 connlimit 的共享內存區域,大小為 10MB。同樣使用 $binary_remote_addr 作為 key,用于限制單個 IP 的并發連接數。
  2. 應用限制規則:

    server {     location / {         limit_req zone=mylimit burst=5 nodelay;         limit_conn connlimit 10;         # 其他配置...     } }
    • limit_req zone=mylimit burst=5 nodelay;: 對 / 路徑應用 mylimit 區域定義的限制規則。burst=5 允許客戶端在超過速率限制時,最多可以有 5 個請求被緩沖(突發流量)。nodelay 表示超過 burst 值的請求立即被拒絕。如果不加 nodelay,Nginx 會嘗試延遲處理這些請求,可能會消耗更多資源。
    • limit_conn connlimit 10;: 限制單個 IP 地址到 / 路徑的并發連接數為 10。
  3. 更細粒度的控制 (可選):

    可以針對特定的 URL 或用戶代理進行更細粒度的限制。例如,針對 POST 請求進行更嚴格的限制:

    location /api/ {     limit_req zone=mylimit burst=2 nodelay;     limit_conn connlimit 5;     # 其他配置... }
  4. 處理被限制的請求:

    默認情況下,被限制的請求會返回 503 Service Unavailable 錯誤。可以通過 error_page 指令自定義錯誤頁面:

    error_page 503 /503.html; location = /503.html {     root /usr/share/nginx/html;     internal; }

    這會將 503 錯誤重定向到自定義的 /503.html 頁面。internal 指令確保該頁面只能通過內部重定向訪問。

如何根據業務調整 limit_req 和 limit_conn 的值?

調整 limit_req 和 limit_conn 的值需要結合實際業務情況進行。過低的限制會導致正常用戶受到影響,過高的限制則無法有效防御 CC 攻擊。

  1. 基線測試: 在正常流量情況下,監控 Nginx 的請求速率和并發連接數。可以使用 Nginx 的 stub_status 模塊或者第三方監控工具(如 prometheus + grafana)來收集數據。

    location /nginx_status {     stub_status;     allow 127.0.0.1;     deny all; }

    訪問 /nginx_status 可以查看當前的活動連接數、請求速率等信息。

  2. 逐步調整: 根據基線測試的結果,逐步增加 limit_req 和 limit_conn 的值,同時持續監控服務器的性能。

  3. 觀察錯誤率: 監控 Nginx 的 503 錯誤率。如果錯誤率過高,說明限制過于嚴格,需要適當放寬限制。

  4. 動態調整: 使用 Nginx Plus 可以實現動態調整 limit_req 和 limit_conn 的值,無需重啟 Nginx。這在應對突發流量或攻擊時非常有用。

  5. 考慮用戶體驗: 在設置限制規則時,需要考慮到正常用戶的體驗。可以針對不同的用戶群體設置不同的限制規則。例如,對于登錄用戶,可以放寬限制;對于未登錄用戶,可以設置更嚴格的限制。

除了 limit_req 和 limit_conn,還有哪些方法可以防御 CC 攻擊?

除了 limit_req 和 limit_conn,還有其他一些方法可以防御 CC 攻擊:

  1. Web 應用防火墻 (WAF): WAF 可以檢測和過濾惡意請求,例如 sql 注入、跨站腳本攻擊 (xss) 等。一些 WAF 也具有 CC 防護功能。

  2. 驗證碼 (CAPTCHA): 在關鍵頁面(例如登錄頁面、注冊頁面)添加驗證碼,可以有效防止機器人攻擊。

  3. JavaScript 挑戰: 使用 JavaScript 挑戰來驗證客戶端是否是真實的瀏覽器。這可以有效防止一些簡單的 CC 攻擊。

  4. HTTP/2 和 HTTP/3 的支持: HTTP/2 和 HTTP/3 協議具有更好的性能和安全性,可以有效緩解 CC 攻擊帶來的壓力。

  5. CDN (內容分發網絡): CDN 可以將網站的內容緩存到全球各地的節點,從而減輕源服務器的壓力。

  6. 黑名單和白名單: 根據 IP 地址、用戶代理等信息,設置黑名單和白名單,可以有效阻止惡意請求。

  7. 使用 rate limiting 的第三方服務: 像 Cloudflare 這樣的服務提供了強大的 rate limiting 功能,可以根據各種規則來限制請求速率。

如何監控和分析 Nginx 的限流效果?

監控和分析 Nginx 的限流效果對于優化配置至關重要。以下是一些常用的方法:

  1. Nginx 日志: 分析 Nginx 的訪問日志,可以了解請求速率、錯誤率等信息。可以使用工具(例如 awk、grep)來提取相關數據。

  2. Nginx Plus 的實時監控: Nginx Plus 提供了實時監控功能,可以查看當前的請求速率、錯誤率、連接數等信息。

  3. 第三方監控工具: 使用 Prometheus + Grafana、Datadog 等第三方監控工具,可以更全面地監控 Nginx 的性能。

  4. 自定義指標: 可以使用 Nginx 的 ngx_http_stub_status_module 模塊或者 ngx_http_lua_module 模塊來收集自定義指標,例如被限制的請求數量、平均響應時間等。

  5. 日志分析工具: 使用像 elk Stack (elasticsearch, Logstash, Kibana) 這樣的日志分析工具,可以對 Nginx 日志進行更深入的分析,發現潛在的問題。

通過持續監控和分析 Nginx 的限流效果,可以及時發現問題并進行優化,從而更好地防御 CC 攻擊。

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享