網站遭遇CC攻擊怎么破?


最近,有朋友反映自家網站訪問速度明顯慢了許多,用 top 命令查看發現 CPU 快被占滿了,HTTP 連接數不斷攀升,愈演愈烈。了解后得知,這已經不是網站第一次遭受 CC 攻擊了,之前試過使用 Apache 做反向代理配置,可是 Apache 也沒扛住。

一、何為CC攻擊

那么,什么是 CC 攻擊呢?

這里用一個段子做引,顧客點了份魚香肉絲沒有肉絲,找店家理論,店家矢口否認,於是第二天顧客找了 N 多閑雜人等把小飯館全部坐滿,還不消費,正常顧客無法消費就餐,店主損失巨大。

這,就是店家不懂 CC 攻擊的下場。

CC 攻擊/Challenge Collapsar 是指攻擊者控制某些主機,不斷發送大量數據包給網站服務器,造成服務器資源耗盡,直到宕機崩潰。大家或多或少都有過網頁訪問人數過多導致網頁打不開或者打開非常慢的經歷,CC 攻擊就會造成如此結果。CC 攻擊由 DDoS 攻擊而生出,是 DDoS 的子集,它的攻擊對象是網站頁面,會模擬多個用戶 (多少線程就是多少用戶) 不停地訪問那些需要大量數據操作 (意味着需要大量 CPU 時間) 的頁面,造成服務器資源浪費,CPU 長時間處於 100% 的狀態,處理不盡的連接導致網絡擁塞,正常訪問便會被中止。

CC攻擊的特點

  1. 攻擊的 IP 都是真實的、有效的,無法拒絕;
  2. 發送的數據包都是正常的數據包;
  3. 攻擊的是網頁,服務器可以連接,就是網頁訪問不了;
  4. 攻擊成本低、技術含量低、容易實施,主機影響巨大。

二、如何判斷CC攻擊

CC 攻擊發生時,經常出現帶寬資源被嚴重消耗,網站癱瘓;CPU、內存利用率飆升,主機癱瘓;瞬間快速打擊,無法快速響應這些現象。這時,比較簡單直接的判斷方法就是查看 80 端口的連接數,對比正常情況,如果相差懸殊,甚至無法統計,基本可以斷定是 CC 攻擊了。

netstat -an|grep ':80' -c

三、測試&防御

我們使用 Apache 自帶的壓力測試工具 ab 做並發測試,可以模擬多用戶訪問。

環境VMware、CentOS Linux release 7.7、Apache/2.4.38 (event 加載方式) 和 Nginx/1.16.0。

測試 I

模擬 600 個用戶同時訪問,共訪問 10000 次,執行:

ab.exe -n 10000 -c 600 -r   http://www.cc.com/test.html

ab 返回的結果如下:

Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests

Server Software:        Apache/2.4.38
Server Hostname:        10.232.16.55
Server Port:            80

Document Path:          /test.html
Document Length:        24738 bytes
Concurrency Level:      600
Time taken for tests:   56.949 seconds
Complete requests:      10000

Apache 日志:

10.232.18.53 - - [04/Dec/2019:20:51:04 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:05 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:05 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:06 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:07 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:07 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:08 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:10 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:10 +0800] "GET /test.html HTTP/1.0" 200 24738
10.232.18.53 - - [04/Dec/2019:20:51:10 +0800] "GET /test.html HTTP/1.0" 200 24738

可以看到,Apache 可以綽綽有余地應付,訪問一切正常。

測試 II

將並發數提高到 900,再來看 Apache 的反應,執行:

ab.exe -n 10000 -c 900 -r   http://www.cc.com/test.html

ab 返回的結果為:

Total of 1 requests completed

Apache 錯誤日志:

[Wed Dec 04 21:08:25.654731 2019] [mpm_event:error] [pid 46995:tid 139688010909504] AH00484: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

這一次的訪問量,Apache 已無法應對,頁面出現無法訪問的情況:

在這里插入圖片描述

Apache 防御模塊

Apache 可以通過加載 mod_evasive 模塊緩解 CC 攻擊。mod_evasive 模塊提供多個可選參數,通過簡單設置這些參數,可以在遭受攻擊期間規避操作,並可通過電子郵件和系統日志工具報告濫用行為,如匹配設定參數則發送 403 響應並記錄 IP 地址 。

可選參數:

<IfModule mod_evasive20.c>
    DOSHashTableSize 3097
    DOSPageCount 2
    DOSSiteCount 50
    DOSPageInterval 1
    DOSSiteInterval 1
    DOSBlockingPeriod 60
    DOSEmailNotify <someone@somewhere.com>
</IfModule>

DOSPageCountDOSSiteCount 是比較溫和的兩個值,以避免客戶端被不必要地阻塞。

DOSPageCount 是對每個 IP 地址單位時間 (通常為 1s) 內對同一個 URL 頁面的請求數量限制。超過該時間間隔的閾值,客戶端的 IP 地址會自動被加到阻止列表中。

DOSSiteCount 是對每個 IP 地址單位時間 (通常為 1s) 內對整個網站的請求總數限制。可以酌情修改為更大的值。

如下例子中,Apache 配置文件 httpd.conf 中設置以下參數:

LoadModule evasive20_module /usr/lib64/httpd/modules/mod_evasive24.so 
<IfModule evasive20_module>
    DOSPageCount 2
    DOSSiteCount 100
    DOSLogDir /var/log
</IfModule>

再次測試 900 的並發數,執行 ab.exe-n10000-c900-r http://www.cc.com/test.html,看 Apache 作何反應。在前面完全沒有防護措施的場景中,Apache 無法應對這種測試。

Apache 日志:

[Wed Dec 04 21:52:40.582741 2019] [:error] [pid 49596:tid 139700899661568] [client 10.232.18.53:58234] client denied by server configuration: /usr/local/apache2.4/htdocs/test.html
[Wed Dec 04 21:52:40.583081 2019] [:error] [pid 49596:tid 139700899661568] [client 10.232.18.53:58235] client denied by server configuration: /usr/local/apache2.4/htdocs/test.html
[Wed Dec 04 21:52:40.583323 2019] [:error] [pid 49596:tid 139700899661568] [client 10.232.18.53:58236] client denied by server configuration: /usr/local/apache2.4/htdocs/test.html

可以看出,mod_evasive 模塊已生效,阻止同一用戶非正常的大量並發訪問,而其他用戶訪問正常。

Nginx 防御模塊

當 Web 服務器軟件切換為 Nginx,測試內容與 Apache 相同。雖然 Nginx 處理並發的能力遠遠大過 Apache,但並發量不斷增加,同樣會耗盡資源。我們不禁會問,Apache 有 mod_evasive 模塊,那 Nginx 呢?

Nginx 主要通過 ngx_http_limit_conn_modulengx_http_limit_req_module 這兩個內置模塊來防御 CC 攻擊。

ngx_http_limit_conn_module 可以限制單個 IP 地址的連接數。但並不是所有的連接都會被計數,只有當一個請求的整個請求頭都已經被讀取並且正在被服務器處理,這個請求所在的連接才會被計數。

ngx_http_limit_req_module 則可以限制單個 IP 每秒請求數。通過漏斗算法,限制每秒固定處理請求數,推遲過多請求。

nginx.conf 中的配置如下:

http {

    limit_conn_zone $binary_remote_addr zone=cc_conn:10m;
    limit_req_zone $binary_remote_addr zone=cc_req:10m rate=1r/s;
    ...

    server {
        limit_conn cc_test 20;  #同一個ip並發連接數不能超過20個
        ...

        location / {
            limit_req zone=cc_req burst=20 nodelay;  #限制平均每秒不超過一個請求,同時允許超過頻率限制的請求數不多於20個,用nodelay參數表示不希望超過的請求被延遲。
            ...
            }
        }
    }

再次測試 1000 的並發數,執行:

ab.exe -n 10000 -c 1000 http://www.cc.com/test.html

結果是這樣的:

10.232.18.153 - - [05/Dec/2019:22:42:19 +0800] "GET /test.html HTTP/1.0" 200 24738 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:19 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"
10.232.18.153 - - [05/Dec/2019:22:42:20 +0800] "GET /test.html HTTP/1.0" 503 494 "-" "ApacheBench/2.3"

返回 503 (limit_conn和limit_req 的默認返回碼),說明大量非正常並發連接已被攔截。


通過以上測試可以看出,Apache 通過加載 mod_evasive 模塊、Nginx 通過加載內置 ngx_http_limit_conn_modulengx_http_limit_req_module 模塊都可以實現防御 CC 攻擊的效果。當然如果配合 iptables 等機制限制 IP 黑名單,效果會更好。

以上方法都是通過限制並發連接數量的手段,達到防止 CC 攻擊的目的。當然還有另外的方法,如接入 CDN,多台做負載均衡,擴大帶寬等。(盧岩 | 天存信息)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM