更新時間:2018-10-26 來源:黑馬程序員 瀏覽量:
一、DDOS 是什么?
首先,我來解釋一下,DDOS 是什么。
舉例來說,我開了一家餐廳,正常情況下,最多可以容納30個人同時進(jìn)餐。你直接走進(jìn)餐廳,找一張桌子坐下點(diǎn)餐,馬上就可以吃到東西。
很不幸,我得罪了一個流氓。他派出300個人同時涌進(jìn)餐廳。這些人看上去跟正常的顧客一樣,每個都說"趕快上餐"。但是,餐廳的容量只有30個人,根本不可能同時滿足這么多的點(diǎn)餐需求,加上他們把門口都堵死了,里三層外三層,正常用餐的客人根本進(jìn)不來,實(shí)際上就把餐廳癱瘓了。
這就是 DDOS 攻擊,它在短時間內(nèi)發(fā)起大量請求,耗盡服務(wù)器的資源,無法響應(yīng)正常的訪問,造成網(wǎng)站實(shí)質(zhì)下線。
DDOS 里面的 DOS 是 denial of service(停止服務(wù))的縮寫,表示這種攻擊的目的,就是使得服務(wù)中斷。最前面的那個 D 是 distributed (分布式),表示攻擊不是來自一個地方,而是來自四面八方,因此更難防。你關(guān)了前門,他從后門進(jìn)來;你關(guān)了后門,他從窗口跳起來。
二、DDOS 的種類DDOS 不是一種攻擊,而是一大類攻擊的總稱。它有幾十種類型,新的攻擊方法還在不斷發(fā)明出來。網(wǎng)站運(yùn)行的各個環(huán)節(jié),都可以是攻擊目標(biāo)。只要把一個環(huán)節(jié)攻破,使得整個流程跑不起來,就達(dá)到了癱瘓服務(wù)的目的。
其中,比較常見的一種攻擊是 cc 攻擊。它就是簡單粗暴地送來大量正常的請求,超出服務(wù)器的最大承受量,導(dǎo)致宕機(jī)。我遭遇的就是 cc 攻擊,最多的時候全世界大概20多個 IP 地址輪流發(fā)出請求,每個地址的請求量在每秒200次~300次。我看訪問日志的時候,就覺得那些請求像洪水一樣涌來,一眨眼就是一大堆,幾分鐘的時間,日志文件的體積就大了100MB。說實(shí)話,這只能算小攻擊,但是我的個人網(wǎng)站沒有任何防護(hù),服務(wù)器還是跟其他人共享的,這種流量一來立刻就下線了。
本文以下的內(nèi)容都是針對 cc 攻擊。
三、備份網(wǎng)站防范 DDOS 的第一步,就是你要有一個備份網(wǎng)站,或者最低限度有一個臨時主頁。生產(chǎn)服務(wù)器萬一下線了,可以立刻切換到備份網(wǎng)站,不至于毫無辦法。
備份網(wǎng)站不一定是全功能的,如果能做到全靜態(tài)瀏覽,就能滿足需求。最低限度應(yīng)該可以顯示公告,告訴用戶,網(wǎng)站出了問題,正在全力搶修。我的個人網(wǎng)站下線的時候,我就做了一個臨時主頁,很簡單的幾行 HTML 代碼。
這種臨時主頁建議放到 Github Pages 或者 Netlify,它們的帶寬大,可以應(yīng)對攻擊,而且都支持綁定域名,還能從源碼自動構(gòu)建。
四、HTTP 請求的攔截如果惡意請求有特征,對付起來很簡單:直接攔截它就行了。
HTTP 請求的特征一般有兩種:IP 地址和 User Agent 字段。比如,惡意請求都是從某個 IP 段發(fā)出的,那么把這個 IP 段封掉就行了?;蛘撸鼈兊?User Agent 字段有特征(包含某個特定的詞語),那就把帶有這個詞語的請求攔截。
攔截可以在三個層次做。
(1)專用硬件
Web 服務(wù)器的前面可以架設(shè)硬件防火墻,專門過濾請求。這種效果最好,但是價格也最貴。
(2)本機(jī)防火墻
操作系統(tǒng)都帶有軟件防火墻,Linux 服務(wù)器一般使用 iptables。比如,攔截 IP 地址1.2.3.4的請求,可以執(zhí)行下面的命令。
$ iptables -A INPUT -s 1.2.3.4 -j DROPiptables 比較復(fù)雜,我也不太會用。它對服務(wù)器性能有一定影響,也防不住大型攻擊。
(3)Web 服務(wù)器
Web 服務(wù)器也可以過濾請求。攔截 IP 地址1.2.3.4,nginx 的寫法如下。
如果想要更精確的控制(比如自動識別并攔截那些頻繁請求的 IP 地址),就要用到 WAF。這里就不詳細(xì)介紹了,nginx 這方面的設(shè)置可以參考這里和這里。
Web 服務(wù)器的攔截非常消耗性能,尤其是 Apache。稍微大一點(diǎn)的攻擊,這種方法就沒用了。
五、帶寬擴(kuò)容上一節(jié)的 HTTP 攔截有一個前提,就是請求必須有特征。但是,真正的 DDOS 攻擊是沒有特征的,它的請求看上去跟正常請求一樣,而且來自不同的 IP 地址,所以沒法攔截。這就是為什么 DDOS 特別難防的原因。
當(dāng)然,這樣的 DDOS 攻擊的成本不低,普通的網(wǎng)站不會有這種待遇。不過,真要遇到了該怎么辦呢,有沒有根本性的防范方法呢?
答案很簡單,就是設(shè)法把這些請求都消化掉。30個人的餐廳來了300人,那就想辦法把餐廳擴(kuò)大(比如臨時再租一個門面,并請一些廚師),讓300個人都能坐下,那么就不影響正常的用戶了。對于網(wǎng)站來說,就是在短時間內(nèi)急劇擴(kuò)容,提供幾倍或幾十倍的帶寬,頂住大流量的請求。這就是為什么云服務(wù)商可以提供防護(hù)產(chǎn)品,因?yàn)樗麄冇写罅咳哂鄮?,可以用來消?DDOS 攻擊。
一個朋友傳授了一個方法,給我留下深刻印象。某云服務(wù)商承諾,每個主機(jī)保 5G 流量以下的攻擊,他們就一口氣買了5個。網(wǎng)站架設(shè)在其中一個主機(jī)上面,但是不暴露給用戶,其他主機(jī)都是鏡像,用來面對用戶,DNS 會把訪問量均勻分配到這四臺鏡像服務(wù)器。一旦出現(xiàn)攻擊,這種架構(gòu)就可以防住 20G 的流量,如果有更大的攻擊,那就買更多的臨時主機(jī),不斷擴(kuò)容鏡像。
六、CDNCDN 指的是網(wǎng)站的靜態(tài)內(nèi)容分發(fā)到多個服務(wù)器,用戶就近訪問,提高速度。因此,CDN 也是帶寬擴(kuò)容的一種方法,可以用來防御 DDOS 攻擊。
網(wǎng)站內(nèi)容存放在源服務(wù)器,CDN 上面是內(nèi)容的緩存。用戶只允許訪問 CDN,如果內(nèi)容不在 CDN 上,CDN 再向源服務(wù)器發(fā)出請求。這樣的話,只要 CDN 夠大,就可以抵御很大的攻擊。不過,這種方法有一個前提,網(wǎng)站的大部分內(nèi)容必須可以靜態(tài)緩存。對于動態(tài)內(nèi)容為主的網(wǎng)站(比如論壇),就要想別的辦法,盡量減少用戶對動態(tài)數(shù)據(jù)的請求。
上一節(jié)提到的鏡像服務(wù)器,本質(zhì)就是自己搭建一個微型 CDN。各大云服務(wù)商提供的高防 IP,背后也是這樣做的:網(wǎng)站域名指向高防 IP,它提供一個緩沖層,清洗流量,并對源服務(wù)器的內(nèi)容進(jìn)行緩存。
這里有一個關(guān)鍵點(diǎn),一旦上了 CDN,千萬不要泄露源服務(wù)器的 IP 地址,否則攻擊者可以繞過 CDN 直接攻擊源服務(wù)器,前面的努力都白費(fèi)。搜一下"繞過 CDN 獲取真實(shí) IP 地址",你就會知道國內(nèi)的黑產(chǎn)行業(yè)有多猖獗。
作者:黑馬程序員人工智能+Python培訓(xùn)學(xué)院