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 控制并發連接數。兩者結合,能在一定程度上緩解 CC 攻擊帶來的壓力。
解決方案
配置 Nginx 抵御 CC 攻擊,主要通過 limit_req 和 limit_conn 模塊來實現。以下是一個基本的配置示例,并附帶詳細解釋:
-
定義共享內存區域:
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 的并發連接數。
-
應用限制規則:
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。
-
更細粒度的控制 (可選):
可以針對特定的 URL 或用戶代理進行更細粒度的限制。例如,針對 POST 請求進行更嚴格的限制:
location /api/ { limit_req zone=mylimit burst=2 nodelay; limit_conn connlimit 5; # 其他配置... }
-
處理被限制的請求:
默認情況下,被限制的請求會返回 503 Service Unavailable 錯誤。可以通過 error_page 指令自定義錯誤頁面:
這會將 503 錯誤重定向到自定義的 /503.html 頁面。internal 指令確保該頁面只能通過內部重定向訪問。
如何根據業務調整 limit_req 和 limit_conn 的值?
調整 limit_req 和 limit_conn 的值需要結合實際業務情況進行。過低的限制會導致正常用戶受到影響,過高的限制則無法有效防御 CC 攻擊。
-
基線測試: 在正常流量情況下,監控 Nginx 的請求速率和并發連接數。可以使用 Nginx 的 stub_status 模塊或者第三方監控工具(如 prometheus + grafana)來收集數據。
location /nginx_status { stub_status; allow 127.0.0.1; deny all; }
訪問 /nginx_status 可以查看當前的活動連接數、請求速率等信息。
-
逐步調整: 根據基線測試的結果,逐步增加 limit_req 和 limit_conn 的值,同時持續監控服務器的性能。
-
觀察錯誤率: 監控 Nginx 的 503 錯誤率。如果錯誤率過高,說明限制過于嚴格,需要適當放寬限制。
-
動態調整: 使用 Nginx Plus 可以實現動態調整 limit_req 和 limit_conn 的值,無需重啟 Nginx。這在應對突發流量或攻擊時非常有用。
-
考慮用戶體驗: 在設置限制規則時,需要考慮到正常用戶的體驗。可以針對不同的用戶群體設置不同的限制規則。例如,對于登錄用戶,可以放寬限制;對于未登錄用戶,可以設置更嚴格的限制。
除了 limit_req 和 limit_conn,還有哪些方法可以防御 CC 攻擊?
除了 limit_req 和 limit_conn,還有其他一些方法可以防御 CC 攻擊:
-
Web 應用防火墻 (WAF): WAF 可以檢測和過濾惡意請求,例如 sql 注入、跨站腳本攻擊 (xss) 等。一些 WAF 也具有 CC 防護功能。
-
驗證碼 (CAPTCHA): 在關鍵頁面(例如登錄頁面、注冊頁面)添加驗證碼,可以有效防止機器人攻擊。
-
JavaScript 挑戰: 使用 JavaScript 挑戰來驗證客戶端是否是真實的瀏覽器。這可以有效防止一些簡單的 CC 攻擊。
-
HTTP/2 和 HTTP/3 的支持: HTTP/2 和 HTTP/3 協議具有更好的性能和安全性,可以有效緩解 CC 攻擊帶來的壓力。
-
CDN (內容分發網絡): CDN 可以將網站的內容緩存到全球各地的節點,從而減輕源服務器的壓力。
-
黑名單和白名單: 根據 IP 地址、用戶代理等信息,設置黑名單和白名單,可以有效阻止惡意請求。
-
使用 rate limiting 的第三方服務: 像 Cloudflare 這樣的服務提供了強大的 rate limiting 功能,可以根據各種規則來限制請求速率。
如何監控和分析 Nginx 的限流效果?
監控和分析 Nginx 的限流效果對于優化配置至關重要。以下是一些常用的方法:
-
Nginx 日志: 分析 Nginx 的訪問日志,可以了解請求速率、錯誤率等信息。可以使用工具(例如 awk、grep)來提取相關數據。
-
Nginx Plus 的實時監控: Nginx Plus 提供了實時監控功能,可以查看當前的請求速率、錯誤率、連接數等信息。
-
第三方監控工具: 使用 Prometheus + Grafana、Datadog 等第三方監控工具,可以更全面地監控 Nginx 的性能。
-
自定義指標: 可以使用 Nginx 的 ngx_http_stub_status_module 模塊或者 ngx_http_lua_module 模塊來收集自定義指標,例如被限制的請求數量、平均響應時間等。
-
日志分析工具: 使用像 elk Stack (elasticsearch, Logstash, Kibana) 這樣的日志分析工具,可以對 Nginx 日志進行更深入的分析,發現潛在的問題。
通過持續監控和分析 Nginx 的限流效果,可以及時發現問題并進行優化,從而更好地防御 CC 攻擊。