Nginx防止DDOS攻擊
分散式拒絕服務攻擊(DDoS)指的是通過多臺機器向一個服務或者網站傳送大量看似合法的資料包使其網路阻塞、資源耗盡從而不能為正常使用者提供正常服務的攻擊手段。隨著網際網路頻寬的增加和相關工具的不斷髮布,這種攻擊的實施難度越來越低,有大量IDC託管機房、商業站點、遊戲服務商一直飽受DDoS攻擊的困擾,那麼如何緩解甚至解決DDoS呢?最近Rick Nelson在Nginx的官方部落格上發表了一篇文章,介紹了如何通過Nginx和Nginx Plus緩和DDoS攻擊。
Rick Nelson首先介紹了DDoS攻擊的一些特點,例如攻擊的流量通常來源於一些固定的IP地址,每一個IP地址會建立比真實使用者多得多的連線和請求;同時由於流量全部是由機器產生的,其速率要比人類使用者高的多。此外,進行攻擊的機器其User-Agent頭也不是標準的值,Referer頭有時也會被設定成能夠與攻擊關聯起來的值。針對這些特點,Rick Nelson認為Nginx和Nginx Plus有很多能夠通過調節或控制流量來應對或者減輕DDoS攻擊的特性。
限制請求率
將Nginx和Nginx Plus可接受的入站請求率限制為某個適合真實使用者的值。例如,通過下面的配置讓一個真正的使用者每兩秒鐘才能訪問一次登入頁面:
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;
server {
…
location /login.html {
limit_req zone=one;
…
}
}
在該配置中,limit_req_zone指令配置了一個名為one的共享記憶體zone用來儲存$binary_remote_addr的請求狀態,location塊中/login.html的limit_req指令引用了共享記憶體zone。
限制連線的數量
將某個客戶端IP地址所能開啟的連線數限制為真實使用者的合理值。例如,限制每一個IP對網站/store部分開啟的連線數不超過10個:
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
…
location /store/ {
limit_conn addr 10;
…
}
}
該配置中,limit_conn_zone指令配置了一個名為addr的共享記憶體zone用來儲存 $binary_remote_addr的請求,location塊中/store/的limit_conn指令引用了共享記憶體zone,並將最大連線數設定為10.
關閉慢連線
關閉那些一直保持開啟同時寫資料又特別頻繁的連線,因為它們會降低伺服器接受新連線的能力。Slowloris就是這種型別的攻擊。對此,可以通過client_body_timeout和client_header_timeout指令控制請求體或者請求頭的超時時間,例如,通過下面的配置將等待時間控制在5s之內:
server {
client_body_timeout 5s;
client_header_timeout 5s;
…
}
設定IP黑名單
如果能識別攻擊者所使用的客戶端IP地址,那麼通過deny指令將其遮蔽,讓Nginx和Nginx Plus拒絕來自這些地址的連線或請求。例如,通過下面的指令拒絕來自123.123.123.3、123.123.123.5和123.123.123.7的請求:
location / {
deny 123.123.123.3;
deny 123.123.123.5;
deny 123.123.123.7;
…
}
設定IP白名單
如果允許訪問的IP地址比較固定,那麼通過allow和deny指令讓網站或者應用程式只接受來自於某個IP地址或者某個IP地址段的請求。例如,通過下面的指令將訪問限制為本地網路的一個IP段:
location / {
allow 192.168.1.0/24;
deny all;
…
}
通過快取削減流量峰值
通過啟用快取並設定某些快取引數讓Nginx和Nginx Plus吸收攻擊所產生的大部分流量峰值。例如,通過proxy_cache_use_stale指令的updating引數告訴Nginx何時需要更新過期的快取物件,避免因重複傳送更新請求對後端伺服器產生壓力。另外,proxy_cache_key指令定義的鍵通常會包含嵌入的變數,例如預設的鍵$scheme$proxy_host$request_uri包含了三個變數,如果它包含$query_string變數,那麼攻擊者可以通過傳送隨機的query_string值來耗盡快取,因此,如果沒有特別原因,不要在該鍵中使用$query_string變數。
阻塞請求
配置Nginx和Nginx Plus阻塞以下型別的請求:
以某個特定URL為目標的請求
User-Agent頭中的值不在正常客戶端範圍之內的請求
Referer頭中的值能夠與攻擊關聯起來的請求
其他頭中存在能夠與攻擊關聯在一起的值的請求
例如,通過下面的配置阻塞以/foo.php為目標的攻擊:
location /foo.php {
deny all;
}
或者通過下面的配置阻塞已識別出的User-Agent頭的值是foo或者bar的DDoS攻擊:
location / {
if ($http_user_agent ~* foo|bar) {
return 403;
}
…
}
限制對後端伺服器的連線數
通常Nginx和Nginx Plus例項能夠處理比後端伺服器多得多的連線數,因此可以通過Nginx Plus限制到每一個後端伺服器的連線數。例如,通過下面的配置限制Nginx Plus和每一臺後端伺服器之間建立的連線數不多於200個:
upstream website {
server 192.168.100.1:80 max_conns=200;
server 192.168.100.2:80 max_conns=200;
queue 10 timeout=30s;
}
另外,Rick Nelson還提到了如何處理基於範圍的攻擊和如何處理高負載的問題,以及如何使用Nginx Plus Status模組發現異常的流量模式,定位DDoS攻擊。
感謝魏星對本文的審校。
相關文章
- CDN到底能不能防止DDoS攻擊呢?高防CDN是如何防ddos攻擊呢?
- DDos攻擊
- 什麼是DDoS攻擊?如何防範DDoS攻擊?
- 防止惡意攻擊,伺服器DDoS防禦軟體科普伺服器
- 恆訊科技分析:雲伺服器怎麼防止ddos攻擊?伺服器
- DDoS攻擊的危害是什麼?如何防禦DDoS攻擊?
- 瞭解DDoS攻擊
- 知道DDoS攻擊嗎?
- 如何防止XSS攻擊
- 遊戲伺服器防ddos攻擊,三招搞定ddos攻擊遊戲伺服器
- DDoS攻擊、CC攻擊的攻擊方式和防禦方法
- DDoS攻擊頻發,科普防禦DDoS攻擊的幾大有效方法
- 什麼是DDoS攻擊?哪些行業最需要預防DDoS攻擊?行業
- 什麼是DDoS攻擊?DDOS攻擊的表現形式是什麼?
- 如何有效防禦DDoS攻擊和CC攻擊?
- 什麼是DDOS攻擊?
- DDoS攻擊有哪些危害
- 網站如何防止攻擊網站
- 如何防範DDoS攻擊,使自己的網站減緩DDoS攻擊呢?網站
- 在Linux中,什麼是DDoS攻擊?如何在Linux中防禦DDoS攻擊?Linux
- DDOS 攻擊的防範教程
- 預防ddos攻擊檢測
- 前端實現csrf防止攻擊前端
- DDoS攻擊是什麼?其攻擊現象有哪些?
- DDoS攻擊與CC攻擊的區別是什麼?
- DDoS攻擊是什麼?是如何進行攻擊的?
- 淺談DDos攻擊與防禦
- 基於TCP反射DDoS攻擊分析TCP反射
- DDOS攻擊常見的型別型別
- 淺析DDOS攻擊防護思路
- 如何判斷是否遭到DDOS攻擊
- DDoS攻擊激增,分享高效可靠的DDoS防禦方案
- Mybatis如何防止SQL隱碼攻擊MyBatisSQL
- Web安全防範-----防止重放攻擊Web
- 【故障公告】遭遇用心良苦的瘋狂攻擊:DDoS + CC攻擊
- 什麼是DDoS攻擊?與CC攻擊有什麼聯絡?
- 什麼是CC攻擊?與DDoS攻擊有什麼區別?
- Nginx配置各種響應頭防止XSS,點選劫持,frame惡意攻擊Nginx