一、應用層ddos攻擊的特徵
應用層(七層/http層)ddos 攻擊通常由木馬程式發起,其可以透過設計更好的利用目標系統的脆弱點。例如,對於無法處理大量並發請求的系統,僅僅透過建立大量的連接,並週期性的發出少量資料包來保持會話就可以耗盡系統的資源,使其無法接受新的連接請求達到 ddos 的目的。其他還有採用發送大量連線請求發送大數據包的請求進行攻擊的形式。因為攻擊是由木馬程式發起,攻擊者可以在很短時間內快速建立大量的連接,並發出大量的請求。
以下是一些ddos的特證,我們可以據此特徵來抵抗ddos(包括但不限於):
攻擊經常來自一些相對固定的ip或ip 段,每個ip 都有遠大於真實使用者的連線數和請求數。 (備註:這並不表示這種請求都是代表著ddos 攻擊。在許多使用nat的網路架構中,很多的客戶端使用網關的ip 位址存取公網資源。但是,即便如此,這樣的請求數和連線數也會遠少於ddos 攻擊。)
因為攻擊是由木馬發出且目的是使伺服器超負荷,請求的頻率會遠遠超過正常人的請求。
user-agent 通常是一個非標準的值
#referer 有時會是容易聯想到攻擊的值
二、使用nginx、nginx plus抵抗ddos攻擊
#結合上面提到的ddos 攻擊的特徵,nginx、nginx plus有很多的特性可以用來有效的防禦ddos 攻擊,可以從調整入口存取流量和控制反向代理到後端伺服器的流量兩個方面來達到抵禦ddos 攻擊的目的。
1. 限制請求速度
設定 nginx、nginx plus 的連線請求在一個真實使用者請求的合理範圍內。例如,如果你覺得一個正常使用者每兩秒可以請求一次登入頁面,你就可以設定 nginx 每兩秒鐘接收一個客戶端 ip 的請求(大約等同於每分鐘30個請求)。
limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; server { ... location /login.html { limit_req zone=one; ... } }
`limit_req_zone` 指令設定了一個叫 one 的共享記憶體區來儲存請求狀態的特定鍵值,在上面的例子中是客戶端 ip($binary_remote_addr)。 location 區塊中的 `limit_req` 透過引用 one 共享記憶體區來實現限制存取 /login.html 的目的。
2. 限制連線數量
設定 nginx、nginx plus 的連線數在一個真實使用者請求的合理範圍內。例如,你可以設定每個客戶端 ip 連線 /store 不可以超過10個。
limit_conn_zone $binary_remote_addr zone=addr:10m; server { ... location /store/ { limit_conn addr 10; ... } }
`limit_conn_zone` 指令設定了一個叫 addr 的共享記憶體區來儲存特定鍵值的狀態,在上面的例子中是客戶端 ip( $binary_remote_addr)。 location 區塊中 `limit_conn` 透過引用 addr 共享記憶體區來限製到 /store/ 的最大連線數為10。
3. 關閉慢連線
有一些ddos 攻擊,例如slowlris,是透過建立大量的連接並週期性的發送一些資料包來保持會話來達到攻擊目的,這種週期通常會低於正常的請求。這種情況我們可以透過關閉慢連線來抵禦攻擊。
`client_body_timeout` 指令用來定義讀取客戶端請求的逾時時間,`client_header_timeout` 指令用來定於讀取客戶端請求頭的逾時時間。這兩個參數的預設值都是60s,我們可以透過下面的指令將他們設定為5s:
server { client_body_timeout 5s; client_header_timeout 5s; ... }
4. 設定ip黑名單
如果確定攻擊來自某些ip 位址,我們可以將其加入黑名單,nginx 就不會再接受他們的請求。例如,你已經確定攻擊來自於從123.123.123.1到123.123.123.16的一段ip 位址,你可以這樣設定:
location / { deny 123.123.123.0/28; ... }
#或你確定攻擊來自123.123.123.3、123.123.123.5、123.幾個ip,可以這樣設定:
location / { deny 123.123.123.3; deny 123.123.123.5; deny 123.123.123.7; ... }
5. 設定ip白名單
如果你的網站僅允許特定的ip 或ip 段訪問,你可以結合使用allow 和deny 指令來限制只允許你指定的ip 位址存取你的網站。如下,你可以設定僅允許 192.168.1.0 段的內網用戶存取:
location / { allow 192.168.1.0/24; deny all; ... }
deny 指令會拒絕除了 allow 指定的 ip 段之外的所有其他 ip 的存取請求。
6. 使用快取進行流量削峰
透過開啟nginx 的快取功能並設定特定的快取參數,可以削減來自攻擊的流量,同時也可以減輕對後端伺服器的請求壓力。以下是一些有用的設定:
proxy_cache_use_stale ` 的 updating 參數告訴 nginx 何時該更新所快取的物件。只需要到後端的一個更新請求,在快取有效期間客戶端對該物件的請求都無需存取後端伺服器。當透過對一個檔案的頻繁請求來實施攻擊時,快取功能可極大的降低到後端伺服器的請求。
proxy_cache_key ` 命令定义的键值通常包含一些内嵌的变量(默认的键值 $scheme$proxy_host$request_uri 包含了三个变量)。如果键值包含 `$query_string` 变量,当攻击的请求字符串是随机的时候就会给 nginx 代理过重的缓存负担,因此我们建议一般情况下不要包含 `$query_string` 变量。
7. 屏蔽特定的请求
可以设置 nginx、nginx plus 屏蔽一些类型的请求:
针对特定 url 的请求
针对不是常见的 user-agent 的请求
针对 referer 头中包含可以联想到攻击的值的请求
针对其他请求头中包含可以联想到攻击的值的请求
比如,如果你判定攻击是针对一个特定的 url:/foo.php,我们就可以屏蔽到这个页面的请求:
location /foo.php { deny all; }
或者你判定攻击请求的 user-agent 中包含 foo 或 bar,我们也可以屏蔽这些请求:
location / { if ($http_user_agent ~* foo|bar) { return 403; } ... }
http_name 变量引用一个请求头,上述例子中是 user-agent 头。可以针对其他的 http 头使用类似的方法来识别攻击。
8. 限制到后端服务器的连接数
一个 nginx、nginx plus 实例可以处理比后端服务器多的多的并发请求。在 nginx plus 中,你可以限制到每一个后端服务器的连接数,比如可以设置 nginx plus 与 website upstream 中的每个后端服务器建立的连接数不得超过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; }
`max_conns` 参数可以针对每一个后端服务器设置 nginx plus 可以与之建立的最大连接数。`queue` 命令设置了当每个后端服务器都达到最大连接数后的队列大小,`timeout` 参数指定了请求在队列中的保留时间。
9. 处理特定类型的攻击
有一种攻击是发送包含特别大的值的请求头,引起服务器端缓冲区溢出。nginx、nginx plus 针对这种攻击类型的防御,可以参考
[using nginx and nginx plus to protect against cve-2015-1635]
)
10. 优化nginx性能
ddos 攻击通常会带来高的负载压力,可以通过一些调优参数,提高 nginx、nginx plus 处理性能,硬抗 ddos 攻击,详细参考:
[tuning nginx for performance]
三、识别ddos攻击
到目前为止,我们都是集中在如何是用 nginx、nginx plus 来减轻 ddos 攻击带来的影响。如何才能让 nginx、nginx plus 帮助我们识别 ddos 攻击呢?`nginx plus status module` 提供了到后端服务器流量的详细统计,可以用来识别异常的流量。nginx plus 提供一个当前服务状态的仪表盘页面,同时也可以在自定义系统或其他第三方系统中通过 api 的方式获取这些统计信息,并根据历史趋势分析识别非正常的流量进而发出告警。
以上是怎麼使用Nginx、Nginx Plus抵禦DDOS攻擊的詳細內容。更多資訊請關注PHP中文網其他相關文章!