1.DDOS是一種通過大流量的請(qǐng)求對(duì)目標(biāo)進(jìn)行轟炸式訪問,導(dǎo)致提供服務(wù)的服務(wù)器資源耗盡進(jìn)而無法繼續(xù)提供服務(wù)的攻擊手段。
一般情況下,攻擊者通過大量請(qǐng)求與連接使服務(wù)器處于飽和狀態(tài),以至于無法接受新的請(qǐng)求或變得很慢。
2.應(yīng)用層DDOS攻擊的特征
應(yīng)用層(七層/HTTP層)DDOS攻擊通常由木馬程序發(fā)起,其可以通過設(shè)計(jì)更好的利用目標(biāo)系統(tǒng)的脆弱點(diǎn)。例如,對(duì)于無法處理大量并發(fā)請(qǐng)求的系統(tǒng),僅僅通過建立大量的連接,并周期性的發(fā)出少量數(shù)據(jù)包來保持會(huì)話就可以耗盡系統(tǒng)的資源,使其無法接受新的連接請(qǐng)求達(dá)到DDOS的目的。其他還有采用發(fā)送大量連接請(qǐng)求發(fā)送大數(shù)據(jù)包的請(qǐng)求進(jìn)行攻擊的形式。因?yàn)楣羰怯赡抉R程序發(fā)起,攻擊者可以在很短時(shí)間內(nèi)快速建立大量的連接,并發(fā)出大量的請(qǐng)求。
以下是一些DDOS的特證,我們可以據(jù)此特征來抵抗DDOS(包括但不限于):攻擊經(jīng)常來源于一些相對(duì)固定的IP或IP段,每個(gè)IP都有遠(yuǎn)大于真實(shí)用戶的連接數(shù)和請(qǐng)求數(shù)。備注:這并不表明這種請(qǐng)求都是代表著DDOS攻擊。在很多使用NAT的網(wǎng)絡(luò)架構(gòu)中,很多的客戶端使用網(wǎng)關(guān)的IP地址訪問公網(wǎng)資源。但是,即便如此,這樣的請(qǐng)求數(shù)和連接數(shù)也會(huì)遠(yuǎn)少于DDOS攻擊。因?yàn)楣羰怯赡抉R發(fā)出且目的是使服務(wù)器超負(fù)荷,請(qǐng)求的頻率會(huì)遠(yuǎn)遠(yuǎn)超過正常人的請(qǐng)求。User-Agent通常是一個(gè)非標(biāo)準(zhǔn)的值Referer有時(shí)是一個(gè)容易聯(lián)想到攻擊的值
3.使用Nginx、Nginx Plus抵抗DDOS攻擊
結(jié)合上面提到的DDOS攻擊的特征,Nginx、Nginx Plus有很多的特性可以用來有效的防御DDOS攻擊,可以從調(diào)整入口訪問流量和控制反向代理到后端服務(wù)器的流量?jī)蓚€(gè)方面來達(dá)到抵御DDOS攻擊的目的。
限制請(qǐng)求速度
設(shè)置Nginx的連接請(qǐng)求在一個(gè)真實(shí)用戶請(qǐng)求的合理范圍內(nèi)。比如,如果你覺得一個(gè)正常用戶每?jī)擅肟梢哉?qǐng)求一次登錄頁(yè)面,你就可以設(shè)置Nginx每?jī)擅腌娊邮找粋€(gè)客戶端IP的請(qǐng)求(大約等同于每分鐘30個(gè)請(qǐng)求)。
limit_req_zone $binary_remote_addr
zone=one:10m rate=30r/m;server {...location /login.html {limit_req
zone=one;...}}
`limit_req_zone`命令設(shè)置了一個(gè)叫one的共享內(nèi)存區(qū)來存儲(chǔ)請(qǐng)求狀態(tài)的特定鍵值,在上面的例子中是客戶端IP($binary_remote_addr)。location塊中的`limit_req`通過引用one共享內(nèi)存區(qū)來實(shí)現(xiàn)限制訪問/login.html的目的。
4.限制連接數(shù)量
設(shè)置Nginx的連接數(shù)在一個(gè)真實(shí)用戶請(qǐng)求的合理范圍內(nèi)。比如,你可以設(shè)置每個(gè)客戶端IP連接/store不可以超過10個(gè)。
limit_conn_zone $binary_remote_addr
zone=addr:10m;server {...location /store/ {limit_conn addr 10;...}}
`limit_conn_zone`命令設(shè)置了一個(gè)叫addr的共享內(nèi)存區(qū)來存儲(chǔ)特定鍵值的狀態(tài),在上面的例子中是客戶端IP( $binary_remote_addr)。location塊中`limit_conn`通過引用addr共享內(nèi)存區(qū)來限制到/store/的最大連接數(shù)為10。
5.關(guān)閉慢連接
有一些DDOS攻擊,比如Slowlris,是通過建立大量的連接并周期性的發(fā)送一些數(shù)據(jù)包保持會(huì)話來達(dá)到攻擊目的,這種周期通常會(huì)低于正常的請(qǐng)求。這種情況我們可以通過關(guān)閉慢連接來抵御攻擊。
`client_body_timeout`命令用來定義讀取客戶端請(qǐng)求的超時(shí)時(shí)間,`client_header_timeout`命令用來定于讀取客戶端請(qǐng)求頭的超時(shí)時(shí)間。這兩個(gè)參數(shù)的默認(rèn)值都是60s,我們可以通過下面的命令將他們?cè)O(shè)置為5s:
server {client_body_timeout 5s;client_header_timeout
5s;...}
6.設(shè)置IP黑名單
如果確定攻擊來源于某些IP地址,我們可以將其加入黑名單,Nginx就不會(huì)再接受他們的請(qǐng)求。比如,你已經(jīng)確定攻擊來自于從123.123.123.1到123.123.123.16的一段IP地址,你可以這樣設(shè)置:
location / {deny 123.123.123.0/28;...}
或者你確定攻擊來源于123.123.123.3、123.123.123.5、123.123.123.7幾個(gè)IP,可以這樣設(shè)置:
location / {deny 123.123.123.3;deny
123.123.123.5;deny 123.123.123.7;...}
7.設(shè)置IP白名單
如果你的網(wǎng)站僅允許特定的IP或IP段訪問,你可以結(jié)合使用allow和deny命令來限制僅允許你指定的IP地址訪問你的網(wǎng)站。如下,你可以設(shè)置僅允許192.168.1.0段的內(nèi)網(wǎng)用戶訪問:
location / {allow 192.168.1.0/24;deny
all;...}
deny命令會(huì)拒絕除了allow指定的IP段之外的所有其他IP的訪問請(qǐng)求。