教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

DDOS攻擊防范教程

更新時間:2018年07月25日09時34分 來源:傳智播客 瀏覽次數(shù):

一、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 DROP
iptables 比較復(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ò)容鏡像。
六、CDN
  CDN 指的是網(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é)院
首發(fā):http://python.itcast.com/

0 分享到:
和我們在線交談!