首頁技術文章正文

DDOS攻擊防范教程

更新時間:2018-10-26 來源:黑馬程序員 瀏覽量:

一、DDOS 是什么?

首先,我來解釋一下,DDOS 是什么。

舉例來說,我開了一家餐廳,正常情況下,最多可以容納30個人同時進餐。你直接走進餐廳,找一張桌子坐下點餐,馬上就可以吃到東西。

很不幸,我得罪了一個流氓。他派出300個人同時涌進餐廳。這些人看上去跟正常的顧客一樣,每個都說"趕快上餐"。但是,餐廳的容量只有30個人,根本不可能同時滿足這么多的點餐需求,加上他們把門口都堵死了,里三層外三層,正常用餐的客人根本進不來,實際上就把餐廳癱瘓了。

這就是 DDOS 攻擊,它在短時間內(nèi)發(fā)起大量請求,耗盡服務器的資源,無法響應正常的訪問,造成網(wǎng)站實質(zhì)下線。

DDOS 里面的 DOS 是 denial of service(停止服務)的縮寫,表示這種攻擊的目的,就是使得服務中斷。最前面的那個 D 是 distributed (分布式),表示攻擊不是來自一個地方,而是來自四面八方,因此更難防。你關了前門,他從后門進來;你關了后門,他從窗口跳起來。

二、DDOS 的種類

DDOS 不是一種攻擊,而是一大類攻擊的總稱。它有幾十種類型,新的攻擊方法還在不斷發(fā)明出來。網(wǎng)站運行的各個環(huán)節(jié),都可以是攻擊目標。只要把一個環(huán)節(jié)攻破,使得整個流程跑不起來,就達到了癱瘓服務的目的。

其中,比較常見的一種攻擊是 cc 攻擊。它就是簡單粗暴地送來大量正常的請求,超出服務器的最大承受量,導致宕機。我遭遇的就是 cc 攻擊,最多的時候全世界大概20多個 IP 地址輪流發(fā)出請求,每個地址的請求量在每秒200次~300次。我看訪問日志的時候,就覺得那些請求像洪水一樣涌來,一眨眼就是一大堆,幾分鐘的時間,日志文件的體積就大了100MB。說實話,這只能算小攻擊,但是我的個人網(wǎng)站沒有任何防護,服務器還是跟其他人共享的,這種流量一來立刻就下線了。

本文以下的內(nèi)容都是針對 cc 攻擊。

三、備份網(wǎng)站

防范 DDOS 的第一步,就是你要有一個備份網(wǎng)站,或者最低限度有一個臨時主頁。生產(chǎn)服務器萬一下線了,可以立刻切換到備份網(wǎng)站,不至于毫無辦法。

備份網(wǎng)站不一定是全功能的,如果能做到全靜態(tài)瀏覽,就能滿足需求。最低限度應該可以顯示公告,告訴用戶,網(wǎng)站出了問題,正在全力搶修。我的個人網(wǎng)站下線的時候,我就做了一個臨時主頁,很簡單的幾行 HTML 代碼。

這種臨時主頁建議放到 Github Pages 或者 Netlify,它們的帶寬大,可以應對攻擊,而且都支持綁定域名,還能從源碼自動構建。

四、HTTP 請求的攔截

如果惡意請求有特征,對付起來很簡單:直接攔截它就行了。

HTTP 請求的特征一般有兩種:IP 地址和 User Agent 字段。比如,惡意請求都是從某個 IP 段發(fā)出的,那么把這個 IP 段封掉就行了?;蛘?,它們的 User Agent 字段有特征(包含某個特定的詞語),那就把帶有這個詞語的請求攔截。

攔截可以在三個層次做。

(1)專用硬件

Web 服務器的前面可以架設硬件防火墻,專門過濾請求。這種效果最好,但是價格也最貴。

(2)本機防火墻

操作系統(tǒng)都帶有軟件防火墻,Linux 服務器一般使用 iptables。比如,攔截 IP 地址1.2.3.4的請求,可以執(zhí)行下面的命令。

$ iptables -A INPUT -s 1.2.3.4 -j DROP

iptables 比較復雜,我也不太會用。它對服務器性能有一定影響,也防不住大型攻擊。

(3)Web 服務器

Web 服務器也可以過濾請求。攔截 IP 地址1.2.3.4,nginx 的寫法如下。1554269910959_1540543617800067342.png

如果想要更精確的控制(比如自動識別并攔截那些頻繁請求的 IP 地址),就要用到 WAF。這里就不詳細介紹了,nginx 這方面的設置可以參考這里和這里。

Web 服務器的攔截非常消耗性能,尤其是 Apache。稍微大一點的攻擊,這種方法就沒用了。

五、帶寬擴容

上一節(jié)的 HTTP 攔截有一個前提,就是請求必須有特征。但是,真正的 DDOS 攻擊是沒有特征的,它的請求看上去跟正常請求一樣,而且來自不同的 IP 地址,所以沒法攔截。這就是為什么 DDOS 特別難防的原因。

當然,這樣的 DDOS 攻擊的成本不低,普通的網(wǎng)站不會有這種待遇。不過,真要遇到了該怎么辦呢,有沒有根本性的防范方法呢?

答案很簡單,就是設法把這些請求都消化掉。30個人的餐廳來了300人,那就想辦法把餐廳擴大(比如臨時再租一個門面,并請一些廚師),讓300個人都能坐下,那么就不影響正常的用戶了。對于網(wǎng)站來說,就是在短時間內(nèi)急劇擴容,提供幾倍或幾十倍的帶寬,頂住大流量的請求。這就是為什么云服務商可以提供防護產(chǎn)品,因為他們有大量冗余帶寬,可以用來消化 DDOS 攻擊。

一個朋友傳授了一個方法,給我留下深刻印象。某云服務商承諾,每個主機保 5G 流量以下的攻擊,他們就一口氣買了5個。網(wǎng)站架設在其中一個主機上面,但是不暴露給用戶,其他主機都是鏡像,用來面對用戶,DNS 會把訪問量均勻分配到這四臺鏡像服務器。一旦出現(xiàn)攻擊,這種架構就可以防住 20G 的流量,如果有更大的攻擊,那就買更多的臨時主機,不斷擴容鏡像。

六、CDN

CDN 指的是網(wǎng)站的靜態(tài)內(nèi)容分發(fā)到多個服務器,用戶就近訪問,提高速度。因此,CDN 也是帶寬擴容的一種方法,可以用來防御 DDOS 攻擊。

網(wǎng)站內(nèi)容存放在源服務器,CDN 上面是內(nèi)容的緩存。用戶只允許訪問 CDN,如果內(nèi)容不在 CDN 上,CDN 再向源服務器發(fā)出請求。這樣的話,只要 CDN 夠大,就可以抵御很大的攻擊。不過,這種方法有一個前提,網(wǎng)站的大部分內(nèi)容必須可以靜態(tài)緩存。對于動態(tài)內(nèi)容為主的網(wǎng)站(比如論壇),就要想別的辦法,盡量減少用戶對動態(tài)數(shù)據(jù)的請求。

上一節(jié)提到的鏡像服務器,本質(zhì)就是自己搭建一個微型 CDN。各大云服務商提供的高防 IP,背后也是這樣做的:網(wǎng)站域名指向高防 IP,它提供一個緩沖層,清洗流量,并對源服務器的內(nèi)容進行緩存。

這里有一個關鍵點,一旦上了 CDN,千萬不要泄露源服務器的 IP 地址,否則攻擊者可以繞過 CDN 直接攻擊源服務器,前面的努力都白費。搜一下"繞過 CDN 獲取真實 IP 地址",你就會知道國內(nèi)的黑產(chǎn)行業(yè)有多猖獗。

   

作者:黑馬程序員人工智能+Python培訓學院
首發(fā):http://python.itheima.com/


分享到:
在線咨詢 我要報名
和我們在線交談!