DDOS 攻擊的防範教程--轉載自阮一峯的博客

一個多月前,個人我的網站遭受 DDOS 攻擊,下線了50多個小時。這篇文章就來談談,如何應對這種攻擊。php

須要說明的是,我對 DDOS 並不精通,從沒想過本身會成爲攻擊目標。攻擊發生之後,不少素昧生平的朋友提供了各類幫助和建議,讓我學到了不少東西。這裏記錄的就是對我最有幫助的一些解決方案。html

1、DDOS 是什麼?

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

舉例來講,我開了一家餐廳,正常狀況下,最多能夠容納30我的同時進餐。你直接走進餐廳,找一張桌子坐下點餐,立刻就能夠吃到東西。nginx

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

這就是 DDOS 攻擊,它在短期內發起大量請求,耗盡服務器的資源,沒法響應正常的訪問,形成網站實質下線。github

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

2、DDOS 的種類

DDOS 不是一種攻擊,而是一大類攻擊的總稱。它有幾十種類型,新的攻擊方法還在不斷髮明出來。網站運行的各個環節,均可以是攻擊目標。只要把一個環節攻破,使得整個流程跑不起來,就達到了癱瘓服務的目的。apache

其中,比較常見的一種攻擊是 cc 攻擊。它就是簡單粗暴地送來大量正常的請求,超出服務器的最大承受量,致使宕機。我遭遇的就是 cc 攻擊,最多的時候全世界大概20多個 IP 地址輪流發出請求,每一個地址的請求量在每秒200次~300次。我看訪問日誌的時候,就以爲那些請求像洪水同樣涌來,一眨眼就是一大堆,幾分鐘的時間,日誌文件的體積就大了100MB。說實話,這隻能算小攻擊,可是個人我的網站沒有任何防禦,服務器仍是跟其餘人共享的,這種流量一來馬上就下線了。緩存

本文如下的內容都是針對 cc 攻擊。bash

3、備份網站

防範 DDOS 的第一步,就是你要有一個備份網站,或者最低限度有一個臨時主頁。生產服務器萬一下線了,能夠馬上切換到備份網站,不至於毫無辦法。

備份網站不必定是全功能的,若是能作到全靜態瀏覽,就能知足需求。最低限度應該能夠顯示公告,告訴用戶,網站出了問題,正在全力搶修。個人我的網站下線的時候,我就作了一個臨時主頁,很簡單的幾行 HTML 代碼

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

4、HTTP 請求的攔截

若是惡意請求有特徵,對付起來很簡單:直接攔截它就好了。

HTTP 請求的特徵通常有兩種:IP 地址和 User Agent 字段。好比,惡意請求都是從某個 IP 段發出的,那麼把這個 IP 段封掉就好了。或者,它們的 User Agent 字段有特徵(包含某個特定的詞語),那就把帶有這個詞語的請求攔截。

攔截能夠在三個層次作。

(1)專用硬件

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

(2)本機防火牆

操做系統都帶有軟件防火牆,Linux 服務器通常使用 iptables。好比,攔截 IP 地址1.2.3.4的請求,能夠執行下面的命令

$ iptables -A INPUT -s 1.2.3.4 -j DROP 

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

(3)Web 服務器

Web 服務器也能夠過濾請求。攔截 IP 地址1.2.3.4,nginx 的寫法以下。

location / { deny 1.2.3.4; } 

Apache 的寫法是在.htaccess文件裏面,加上下面一段。

<RequireAll> Require all granted Require not ip 1.2.3.4 </RequireAll> 

若是想要更精確的控制(好比自動識別並攔截那些頻繁請求的 IP 地址),就要用到 WAF。這裏就不詳細介紹了,nginx 這方面的設置能夠參考這裏這裏

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

5、帶寬擴容

上一節的 HTTP 攔截有一個前提,就是請求必須有特徵。可是,真正的 DDOS 攻擊是沒有特徵的,它的請求看上去跟正常請求同樣,並且來自不一樣的 IP 地址,因此無法攔截。這就是爲何 DDOS 特別難防的緣由。

固然,這樣的 DDOS 攻擊的成本不低,普通的網站不會有這種待遇。不過,真要遇到了該怎麼辦呢,有沒有根本性的防範方法呢?

答案很簡單,就是設法把這些請求都消化掉。30我的的餐廳來了300人,那就想辦法把餐廳擴大(好比臨時再租一個門面,並請一些廚師),讓300我的都能坐下,那麼就不影響正常的用戶了。對於網站來講,就是在短期內急劇擴容,提供幾倍或幾十倍的帶寬,頂住大流量的請求。這就是爲何雲服務商能夠提供防禦產品,由於他們有大量冗餘帶寬,能夠用來消化 DDOS 攻擊。

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

6、CDN

CDN 指的是網站的靜態內容分發到多個服務器,用戶就近訪問,提升速度。所以,CDN 也是帶寬擴容的一種方法,能夠用來防護 DDOS 攻擊。

網站內容存放在源服務器,CDN 上面是內容的緩存。用戶只容許訪問 CDN,若是內容不在 CDN 上,CDN 再向源服務器發出請求。這樣的話,只要 CDN 夠大,就能夠抵禦很大的攻擊。不過,這種方法有一個前提,網站的大部份內容必須能夠靜態緩存。對於動態內容爲主的網站(好比論壇),就要想別的辦法,儘可能減小用戶對動態數據的請求。

上一節提到的鏡像服務器,本質就是本身搭建一個微型 CDN。各大雲服務商提供的高防 IP,背後也是這樣作的:網站域名指向高防 IP,它提供一個緩衝層,清洗流量,並對源服務器的內容進行緩存。

這裏有一個關鍵點,一旦上了 CDN,千萬不要泄露源服務器的 IP 地址,不然攻擊者能夠繞過 CDN 直接攻擊源服務器,前面的努力都白費。搜一下"繞過 CDN 獲取真實 IP 地址",你就會知道國內的黑產行業有多猖獗。

cloudflare 是一個免費 CDN 服務,並提供防火牆,高度推薦。我還要感謝 v2ex.com 的站長 @livid 熱情提供幫助,我如今用的就是他們的 CDN 產品。

更新(6月27日)

攻擊者看來訂閱了個人微博。昨天這篇文章發佈沒多久,我就又遭受了攻擊,他繞過CDN直接攻擊源服務器(我不知道 IP 地址怎麼泄漏的),流量還大過上一次。

感謝騰訊雲的朋友,提供了一個高防 IP,使得網站能夠從新上線。如今,個人防禦措施是,源服務器前面有 CDN。若是攻擊域名,CDN 能夠擋住;若是直接攻擊源服務器,我買了彈性 IP ,能夠動態掛載主機實例,受到攻擊就換一個地址。這只是一個技術博客,內容都是免費的,要防到這種地步,我也是無語了。

(完)

相關文章
相關標籤/搜索