此篇文章非原創(chuàng),發(fā)現(xiàn)這篇文章寫的非常不錯汽摹,所以就轉(zhuǎn)載過來李丰,并整理了一下,希望能幫助到更多的人逼泣。原帖地址:點(diǎn)擊查看原帖
*歡迎關(guān)注我的 Github趴泌,會在這里持續(xù)更新滲透測試和 OSCP 考試的相關(guān)學(xué)習(xí)資源。
一拉庶、DDos簡介
DDoS(Distributed DenialofService嗜憔,分布式拒絕服務(wù))攻擊的主要目的是讓指定目標(biāo)無法提供正常服務(wù),甚至從互聯(lián)網(wǎng)上消失氏仗,是目前最強(qiáng)大吉捶、最難防御的攻擊之一。這是一個世界級的難題并沒有解決辦法只能緩解.
按照發(fā)起的方式皆尔,DDoS可以簡單分為三類呐舔。
第一類以力取勝,海量數(shù)據(jù)包從互聯(lián)網(wǎng)的各個角落蜂擁而來慷蠕,堵塞IDC入口珊拼,讓各種強(qiáng)大的硬件防御系統(tǒng)、快速高效的應(yīng)急流程無用武之地流炕。這種類型的攻擊典型代表是ICMP Flood和UDP Flood澎现,現(xiàn)在已不常見。
第二類以巧取勝每辟,靈動而難以察覺昔头,每隔幾分鐘發(fā)一個包甚至只需要一個包,就可以讓豪華配置的服務(wù)器不再響應(yīng)影兽。這類攻擊主要是利用協(xié)議或者軟件的漏洞發(fā)起揭斧,例如Slowloris攻擊、Hash沖突攻擊等,需要特定環(huán)境機(jī)緣巧合下才能出現(xiàn)讹开。
第三類是上述兩種的混合盅视,輕靈渾厚兼而有之,既利用了協(xié)議旦万、系統(tǒng)的缺陷闹击,又具備了海量的流量,例如SYN Flood攻擊成艘、DNS Query Flood攻擊赏半,是當(dāng)前的主流攻擊方式。
本文將一一描述這些最常見淆两、最具代表性攻擊方式断箫,并介紹它們的防御方案。
二秋冰、DDOS基礎(chǔ)攻擊
2.1 SYN Flood
SYN Flood是互聯(lián)網(wǎng)上最經(jīng)典的DDoS攻擊方式之一仲义,最早出現(xiàn)于1999年左右,雅虎是當(dāng)時(shí)最著名的受害者剑勾。SYN Flood攻擊利用了TCP三次握手的缺陷埃撵,能夠以較小代價(jià)使目標(biāo)服務(wù)器無法響應(yīng),且難以追查虽另。
- 標(biāo)準(zhǔn)的TCP三次握手過程如下:客戶端發(fā)送一個包含SYN標(biāo)志的TCP報(bào)文暂刘,SYN即同步(Synchronize),同步報(bào)文會指明客戶端使用的端口以及TCP連接的初始序號捂刺;
- 服務(wù)器在收到客戶端的SYN報(bào)文后谣拣,將返回一個SYN+ACK(即確認(rèn)Acknowledgement)的報(bào)文,表示客戶端的請求被接受叠萍,同時(shí)TCP初始序號自動加1芝发;
- 客戶端也返回一個確認(rèn)報(bào)文ACK給服務(wù)器端绪商,同樣TCP序列號被加1苛谷。
經(jīng)過這三步,TCP連接就建立完成格郁。TCP協(xié)議為了實(shí)現(xiàn)可靠傳輸腹殿,在三次握手的過程中設(shè)置了一些異常處理機(jī)制。第三步中如果服務(wù)器沒有收到客戶端的最終ACK確認(rèn)報(bào)文例书,會一直處于SYN_RECV狀態(tài)锣尉,將客戶端IP加入等待列表,并重發(fā)第二步的SYN+ACK報(bào)文决采。重發(fā)一般進(jìn)行3-5次自沧,大約間隔30秒左右輪詢一次等待列表重試所有客戶端。另一方面,服務(wù)器在自己發(fā)出了SYN+ACK報(bào)文后拇厢,會預(yù)分配資源為即將建立的TCP連接儲存信息做準(zhǔn)備爱谁,這個資源在等待重試期間一直保留。更為重要的是孝偎,服務(wù)器資源有限访敌,可以維護(hù)的SYN_RECV狀態(tài)超過極限后就不再接受新的SYN報(bào)文,也就是拒絕新的TCP連接建立衣盾。
SYN Flood正是利用了上文中TCP協(xié)議的設(shè)定寺旺,達(dá)到攻擊的目的。攻擊者偽裝大量的IP地址給服務(wù)器發(fā)送SYN報(bào)文势决,由于偽造的IP地址幾乎不可能存在阻塑,也就幾乎沒有設(shè)備會給服務(wù)器返回任何應(yīng)答了。因此徽龟,服務(wù)器將會維持一個龐大的等待列表叮姑,不停地重試發(fā)送SYN+ACK報(bào)文,同時(shí)占用著大量的資源無法釋放据悔。更為關(guān)鍵的是传透,被攻擊服務(wù)器的SYN_RECV隊(duì)列被惡意的數(shù)據(jù)包占滿,不再接受新的SYN請求极颓,合法用戶無法完成三次握手建立起TCP連接朱盐。也就是說,這個服務(wù)器被SYN Flood拒絕服務(wù)了菠隆。
對SYN Flood ddos攻擊軟件,有興趣的可以看看http://www.77169.org/hack/201508/205870.shtm 兵琳。
2.2 DNS Query Flood
作為互聯(lián)網(wǎng)最基礎(chǔ)、最核心的服務(wù)骇径,DNS自然也是DDoS攻擊的重要目標(biāo)之一躯肌。打垮DNS服務(wù)能夠間接打垮一家公司的全部業(yè)務(wù),或者打垮一個地區(qū)的網(wǎng)絡(luò)服務(wù)破衔。前些時(shí)候風(fēng)頭正盛的黑客組織anonymous也曾經(jīng)宣布要攻擊全球互聯(lián)網(wǎng)的13臺根DNS服務(wù)器清女,不過最終沒有得手。
UDP攻擊是最容易發(fā)起海量流量的攻擊手段晰筛,而且源IP隨機(jī)偽造難以追查嫡丙。但過濾比較容易,因?yàn)榇蠖鄶?shù)IP并不提供UDP服務(wù)读第,直接丟棄UDP流量即可曙博。所以現(xiàn)在純粹的UDP流量攻擊比較少見了,取而代之的是UDP協(xié)議承載的DNS Query Flood攻擊怜瞒。簡單地說父泳,越上層協(xié)議上發(fā)動的DDoS攻擊越難以防御,因?yàn)閰f(xié)議越上層,與業(yè)務(wù)關(guān)聯(lián)越大惠窄,防御系統(tǒng)面臨的情況越復(fù)雜逝她。
DNS Query Flood就是攻擊者操縱大量傀儡機(jī)器,對目標(biāo)發(fā)起海量的域名查詢請求睬捶。為了防止基于ACL的過濾黔宛,必須提高數(shù)據(jù)包的隨機(jī)性。常用的做法是UDP層隨機(jī)偽造源IP地址擒贸、隨機(jī)偽造源端口等參數(shù)臀晃。在DNS協(xié)議層,隨機(jī)偽造查詢ID以及待解析域名介劫。隨機(jī)偽造待解析域名除了防止過濾外徽惋,還可以降低命中DNS緩存的可能性,盡可能多地消耗DNS服務(wù)器的CPU資源座韵。
關(guān)于DNS Query Flood的代碼险绘,我在2011年7月為了測試服務(wù)器性能曾經(jīng)寫過一份代碼,鏈接是http://www.icylife.net/yunshu/show.php?id=832誉碴。同樣的宦棺,這份代碼人為降低了攻擊性,只做測試用途黔帕。
2.3 HTTP Flood
上文描述的SYN Flood代咸、DNS QueryFlood在現(xiàn)階段已經(jīng)能做到有效防御了,真正令各大廠商以及互聯(lián)網(wǎng)企業(yè)頭疼的是HTTP Flood攻擊成黄。HTTP Flood是針對Web服務(wù)在第七層協(xié)議發(fā)起的攻擊呐芥。它的巨大危害性主要表現(xiàn)在三個方面:發(fā)起方便、過濾困難奋岁、影響深遠(yuǎn)思瘟。
SYN Flood和DNS Query Flood都需要攻擊者以root權(quán)限控制大批量的傀儡機(jī)。收集大量root權(quán)限的傀儡機(jī)很花費(fèi)時(shí)間和精力闻伶,而且在攻擊過程中傀儡機(jī)會由于流量異常被管理員發(fā)現(xiàn)滨攻,攻擊者的資源快速損耗而補(bǔ)充緩慢,導(dǎo)致攻擊強(qiáng)度明顯降低而且不可長期持續(xù)虾攻。HTTP Flood攻擊則不同铡买,攻擊者并不需要控制大批的傀儡機(jī)更鲁,取而代之的是通過端口掃描程序在互聯(lián)網(wǎng)上尋找匿名的HTTP代理或者SOCKS代理霎箍,攻擊者通過匿名代理對攻擊目標(biāo)發(fā)起HTTP請求。匿名代理是一種比較豐富的資源澡为,花幾天時(shí)間獲取代理并不是難事漂坏,因此攻擊容易發(fā)起而且可以長期高強(qiáng)度的持續(xù)。
另一方面,HTTP Flood攻擊在HTTP層發(fā)起顶别,極力模仿正常用戶的網(wǎng)頁請求行為谷徙,與網(wǎng)站業(yè)務(wù)緊密相關(guān),安全廠商很難提供一套通用的且不影響用戶體驗(yàn)的方案驯绎。在一個地方工作得很好的規(guī)則完慧,換一個場景可能帶來大量的誤殺。
最后剩失,HTTP Flood攻擊會引起嚴(yán)重的連鎖反應(yīng)屈尼,不僅僅是直接導(dǎo)致被攻擊的Web前端響應(yīng)緩慢,還間接攻擊到后端的Java等業(yè)務(wù)層邏輯以及更后端的數(shù)據(jù)庫服務(wù)拴孤,增大它們的壓力脾歧,甚至對日志存儲服務(wù)器都帶來影響。
有意思的是演熟,HTTP Flood還有個頗有歷史淵源的昵稱叫做CC攻擊鞭执。CC是Challenge Collapsar的縮寫,而Collapsar是國內(nèi)一家著名安全公司的DDoS防御設(shè)備芒粹。從目前的情況來看兄纺,不僅僅是Collapsar,所有的硬件防御設(shè)備都還在被挑戰(zhàn)著化漆,風(fēng)險(xiǎn)并未解除囤热。
2.4 慢速連接攻擊
提起攻擊,第一反應(yīng)就是海量的流量获三、海量的報(bào)文旁蔼。但有一種攻擊卻反其道而行之,以慢著稱疙教,以至于有些攻擊目標(biāo)被打死了都不知道是怎么死的棺聊,這就是慢速連接攻擊,最具代表性的是rsnake發(fā)明的Slowloris贞谓。
HTTP協(xié)議規(guī)定限佩,HTTP Request以\r\n\r\n結(jié)尾表示客戶端發(fā)送結(jié)束,服務(wù)端開始處理裸弦。那么祟同,如果永遠(yuǎn)不發(fā)送\r\n\r\n會如何?Slowloris就是利用這一點(diǎn)來做DDoS攻擊的理疙。攻擊者在HTTP請求頭中將Connection設(shè)置為Keep-Alive晕城,要求Web Server保持TCP連接不要斷開,隨后緩慢地每隔幾分鐘發(fā)送一個key-value格式的數(shù)據(jù)到服務(wù)端窖贤,如a:b\r\n砖顷,導(dǎo)致服務(wù)端認(rèn)為HTTP頭部沒有接收完成而一直等待贰锁。如果攻擊者使用多線程或者傀儡機(jī)來做同樣的操作,服務(wù)器的Web容器很快就被攻擊者占滿了TCP連接而不再接受新的請求滤蝠。
很快的豌熄,Slowloris開始出現(xiàn)各種變種。比如POST方法向Web Server提交數(shù)據(jù)物咳、填充一大大Content-Length但緩慢的一個字節(jié)一個字節(jié)的POST真正數(shù)據(jù)內(nèi)容等等锣险。關(guān)于Slowloris攻擊,rsnake也給出了一個測試代碼览闰,參見http://ha.ckers.org/slowloris/slowloris.pl囱持。
三、DDoS進(jìn)階攻擊
3.1 混合攻擊
以上介紹了幾種基礎(chǔ)的攻擊手段焕济,其中任意一種都可以用來攻擊網(wǎng)絡(luò)纷妆,甚至擊垮阿里、百度晴弃、騰訊這種巨型網(wǎng)站掩幢。但這些并不是全部,不同層次的攻擊者能夠發(fā)起完全不同的DDoS攻擊上鞠,運(yùn)用之妙际邻,存乎一心。
高級攻擊者從來不會使用單一的手段進(jìn)行攻擊芍阎,而是根據(jù)目標(biāo)環(huán)境靈活組合世曾。普通的SYN Flood容易被流量清洗設(shè)備通過反向探測、SYN Cookie等技術(shù)手段過濾掉谴咸,但如果在SYN Flood中混入SYN+ACK數(shù)據(jù)包轮听,使每一個偽造的SYN數(shù)據(jù)包都有一個與之對應(yīng)的偽造的客戶端確認(rèn)報(bào)文,這里的對應(yīng)是指源IP地址岭佳、源端口血巍、目的IP、目的端口珊随、TCP窗口大小述寡、TTL等都符合同一個主機(jī)同一個TCP Flow的特征,流量清洗設(shè)備的反向探測和SYN Cookie性能壓力將會顯著增大叶洞。其實(shí)SYN數(shù)據(jù)報(bào)文配合其他各種標(biāo)志位鲫凶,都有特殊的攻擊效果,這里不一一介紹衩辟。對DNS Query Flood而言一膨,也有獨(dú)特的技巧牵触。
首先皆愉,DNS可以分為普通DNS和授權(quán)域DNS,攻擊普通DNS崩侠,IP地址需要隨機(jī)偽造,并且指明服務(wù)器要求做遞歸解析落竹;但攻擊授權(quán)域DNS务嫡,偽造的源IP地址則不應(yīng)該是純隨機(jī)的,而應(yīng)該是事先收集的全球各地ISP的DNS地址钥星,這樣才能達(dá)到最大攻擊效果沾瓦,使流量清洗設(shè)備處于添加IP黑名單還是不添加IP黑名單的尷尬處境。添加會導(dǎo)致大量誤殺谦炒,不添加黑名單則每個報(bào)文都需要反向探測從而加大性能壓力贯莺。
另一方面,前面提到宁改,為了加大清洗設(shè)備的壓力不命中緩存而需要隨機(jī)化請求的域名缕探,但需要注意的是,待解析域名必須在偽造中帶有一定的規(guī)律性还蹲,比如說只偽造域名的某一部分而固化一部分爹耗,用來突破清洗設(shè)備設(shè)置的白名單。道理很簡單谜喊,騰訊的服務(wù)器可以只解析騰訊的域名潭兽,完全隨機(jī)的域名可能會直接被丟棄,需要固化斗遏。但如果完全固定山卦,也很容易直接被丟棄,因此又需要偽造一部分诵次。
其次账蓉,對DNS的攻擊不應(yīng)該只著重于UDP端口,根據(jù)DNS協(xié)議逾一,TCP端口也是標(biāo)準(zhǔn)服務(wù)剔猿。在攻擊時(shí),可以UDP和TCP攻擊同時(shí)進(jìn)行嬉荆。
HTTP Flood的著重點(diǎn)归敬,在于突破前端的cache,通過HTTP頭中的字段設(shè)置直接到達(dá)Web Server本身鄙早。另外汪茧,HTTP Flood對目標(biāo)的選取也非常關(guān)鍵,一般的攻擊者會選擇搜索之類需要做大量數(shù)據(jù)查詢的頁面作為攻擊目標(biāo)限番,這是非常正確的舱污,可以消耗服務(wù)器盡可能多的資源。但這種攻擊容易被清洗設(shè)備通過人機(jī)識別的方式識別出來弥虐,那么如何解決這個問題扩灯?很簡單媚赖,盡量選擇正常用戶也通過APP訪問的頁面,一般來說就是各種Web API珠插。正常用戶和惡意流量都是來源于APP惧磺,人機(jī)差別很小,基本融為一體難以區(qū)分捻撑。
之類的慢速攻擊磨隘,是通過巧妙的手段占住連接不釋放達(dá)到攻擊的目的,但這也是雙刃劍顾患,每一個TCP連接既存在于服務(wù)端也存在于自身番捂,自身也需要消耗資源維持TCP狀態(tài),因此連接不能保持太多江解。如果可以解決這一點(diǎn)设预,攻擊性會得到極大增強(qiáng),也就是說Slowloris可以通過stateless的方式發(fā)動攻擊犁河,在客戶端通過嗅探捕獲TCP的序列號和確認(rèn)維護(hù)TCP連接絮缅,系統(tǒng)內(nèi)核無需關(guān)注TCP的各種狀態(tài)變遷,一臺筆記本即可產(chǎn)生多達(dá)65535個TCP連接呼股。
前面描述的耕魄,都是技術(shù)層面的攻擊增強(qiáng)。在人的方面彭谁,還可以有一些別的手段吸奴。如果SYN Flood發(fā)出大量數(shù)據(jù)包正面強(qiáng)攻,再輔之以Slowloris慢速連接缠局,多少人能夠發(fā)現(xiàn)其中的秘密则奥?即使服務(wù)器宕機(jī)了也許還只發(fā)現(xiàn)了SYN攻擊想去加強(qiáng)TCP層清洗而忽視了應(yīng)用層的行為。種種攻擊都可以互相配合狭园,達(dá)到最大的效果读处。攻擊時(shí)間的選擇,也是一大關(guān)鍵唱矛,比如說選擇維護(hù)人員吃午飯時(shí)罚舱、維護(hù)人員下班堵在路上或者在地鐵里無線上網(wǎng)卡都沒有信號時(shí)、目標(biāo)企業(yè)在舉行大規(guī)囊锴活動流量飆升時(shí)等管闷。
這里描述的只是純粹的攻擊行為,因此不提供代碼窃肠,也不做深入介紹包个。
3.2 來自P2P網(wǎng)絡(luò)的攻擊
前面的攻擊方式,多多少少都需要一些傀儡機(jī)冤留,即使是HTTP Flood也需要搜索大量的匿名代理碧囊。如果有一種攻擊树灶,只需要發(fā)出一些指令,就有機(jī)器自動上來執(zhí)行糯而,才是完美的方案天通。這種攻擊已經(jīng)出現(xiàn)了,那就是來自P2P網(wǎng)絡(luò)的攻擊歧蒋。
大家都知道土砂,互聯(lián)網(wǎng)上的P2P用戶和流量都是一個極為龐大的數(shù)字州既。如果他們都去一個指定的地方下載數(shù)據(jù)谜洽,使成千上萬的真實(shí)IP地址連接過來,沒有哪個設(shè)備能夠支撐住吴叶。拿BT下載來說阐虚,偽造一些熱門視頻的種子,發(fā)布到搜索引擎蚌卤,就足以騙到許多用戶和流量了实束,但這只是基礎(chǔ)攻擊。
高級P2P攻擊逊彭,是直接欺騙資源管理服務(wù)器咸灿。如迅雷客戶端會把自己發(fā)現(xiàn)的資源上傳到資源管理服務(wù)器,然后推送給其他需要下載相同資源的用戶侮叮,這樣避矢,一個鏈接就發(fā)布出去。通過協(xié)議逆向囊榜,攻擊者偽造出大批量的熱門資源信息通過資源管理中心分發(fā)出去审胸,瞬間就可以傳遍整個P2P網(wǎng)絡(luò)。更為恐怖的是卸勺,這種攻擊是無法停止的砂沛,即使是攻擊者自身也無法停止,攻擊一直持續(xù)到P2P官方發(fā)現(xiàn)問題更新服務(wù)器且下載用戶重啟下載軟件時(shí)為止曙求。
3.3 CC攻擊
ChallengeCollapsar的名字源于挑戰(zhàn)國內(nèi)知名安全廠商綠盟的抗DDOS設(shè)備-“黑洞”碍庵,通過botnet的傀儡主機(jī)或?qū)ふ夷涿矸?wù)器,向目標(biāo)發(fā)起大量真實(shí)的http請求悟狱,最終消耗掉大量的并發(fā)資源怎抛,拖慢整個網(wǎng)站甚至徹底拒絕服務(wù)。
互聯(lián)網(wǎng)的架構(gòu)追求擴(kuò)展性本質(zhì)上是為了提高并發(fā)能力芽淡,各種SQL性能優(yōu)化措施:消除慢查詢马绝、分表分庫、索引挣菲、優(yōu)化數(shù)據(jù)結(jié)構(gòu)富稻、限制搜索頻率等本質(zhì)都是為了解決資源消耗掷邦,而CC大有反其道而行之的意味,占滿服務(wù)器并發(fā)連接數(shù)椭赋,盡可能使請求避開緩存而直接讀數(shù)據(jù)庫抚岗,讀數(shù)據(jù)庫要找最消耗資源的查詢,最好無法利用索引哪怔,每個查詢都全表掃描宣蔚,這樣就能用最小的攻擊資源起到最大的拒絕服務(wù)效果。
互聯(lián)網(wǎng)產(chǎn)品和服務(wù)依靠數(shù)據(jù)分析來驅(qū)動改進(jìn)和持續(xù)運(yùn)營认境,所以除了前端的APP胚委、中間件和數(shù)據(jù)庫這類OLTP系統(tǒng),后面還有OLAP叉信,從日志收集亩冬,存儲到數(shù)據(jù)處理和分析的大數(shù)據(jù)平臺,當(dāng)CC攻擊發(fā)生時(shí)硼身,不僅OLTP的部分受到了影響硅急,實(shí)際上CC會產(chǎn)生大量日志,直接會對后面的OLAP產(chǎn)生影響佳遂,影響包括兩個層面营袜,一個當(dāng)日的數(shù)據(jù)統(tǒng)計(jì)完全是錯誤的。第二個層面因CC期間訪問日志劇增也會加大后端數(shù)據(jù)處理的負(fù)擔(dān)丑罪。
CC是目前應(yīng)用層攻擊的主要手段之一荚板,在防御上有一些方法,但不能完美解決這個問題巍糯。
反射型攻擊
2004年時(shí)DRDOS第一次披露啸驯,通過將SYN包的源地址設(shè)置為目標(biāo)地址,然后向大量的真實(shí)TCP服務(wù)器發(fā)送TCP的SYN包祟峦,而這些收到SYN包的TCP server為了完成3次握手把SYN|ACK包“應(yīng)答”給目標(biāo)地址罚斗,完成了一次“反射”攻擊,攻擊者隱藏了自身宅楞,但有個問題是攻擊者制造的流量和目標(biāo)收到的攻擊流量是1:1针姿,且SYN|ACK包到達(dá)目標(biāo)后馬上被回以RST包,整個攻擊的投資回報(bào)率不高厌衙。
反射型攻擊的本質(zhì)是利用“質(zhì)詢-應(yīng)答”式協(xié)議距淫,將質(zhì)詢包的源地址通過原始套接字偽造設(shè)置為目標(biāo)地址,則應(yīng)答的“回包”都被發(fā)送至目標(biāo)婶希,如果回包體積比較大或協(xié)議支持遞歸效果榕暇,攻擊流量會被放大,成為一種高性價(jià)比的流量型攻擊。
反射型攻擊利用的協(xié)議目前包括NTP彤枢、Chargen狰晚、SSDP、DNS缴啡、RPC portmap等等壁晒。
四、DDOS 攻擊防御
攻擊流量到底多大业栅,這是一個關(guān)鍵問題秒咐。攻擊量的大小。用的防護(hù)方法不一樣碘裕。下面給你講一講携取,1G之內(nèi)的防護(hù)方式。費(fèi)用在娘汞,<1萬歹茶,每月
談到DDoS防御夕玩,首先就是要知道到底遭受了多大的攻擊你弦。這個問題看似簡單,實(shí)際上卻有很多不為人知的細(xì)節(jié)在里面燎孟。
以SYN Flood為例禽作,為了提高發(fā)送效率在服務(wù)端產(chǎn)生更多的SYN等待隊(duì)列,攻擊程序在填充包頭時(shí)揩页,IP首部和TCP首部都不填充可選的字段旷偿,因此IP首部長度恰好是20字節(jié),TCP首部也是20字節(jié)爆侣,共40字節(jié)萍程。
對于以太網(wǎng)來說,最小的包長度數(shù)據(jù)段必須達(dá)到46字節(jié)兔仰,而攻擊報(bào)文只有40字節(jié)茫负,因此,網(wǎng)卡在發(fā)送時(shí)乎赴,會做一些處理忍法,在TCP首部的末尾,填充6個0來滿足最小包的長度要求榕吼。這個時(shí)候饿序,整個數(shù)據(jù)包的長度為14字節(jié)的以太網(wǎng)頭,20字節(jié)的IP頭羹蚣,20字節(jié)的TCP頭原探,再加上因?yàn)樽钚“L度要求而填充的6個字節(jié)的0,一共是60字節(jié)。
但這還沒有結(jié)束咽弦。以太網(wǎng)在傳輸數(shù)據(jù)時(shí)告匠,還有CRC檢驗(yàn)的要求。網(wǎng)卡會在發(fā)送數(shù)據(jù)之前對數(shù)據(jù)包進(jìn)行CRC檢驗(yàn)离唬,將4字節(jié)的CRC值附加到包頭的最后面后专。這個時(shí)候,數(shù)據(jù)包長度已不再是40字節(jié)输莺,而是變成64字節(jié)了戚哎,這就是常說的SYN小包攻擊,數(shù)據(jù)包結(jié)構(gòu)如下:
|14字節(jié)以太網(wǎng)頭部|20字節(jié)IP頭部|20字節(jié)TCP|6字節(jié)填充|4字節(jié)檢驗(yàn)|
|目的MAC|源MAC|協(xié)議類型| IP頭 |TCP頭|以太網(wǎng)填充 | CRC檢驗(yàn) |
到64字節(jié)時(shí)嫂用,SYN數(shù)據(jù)包已經(jīng)填充完成型凳,準(zhǔn)備開始傳輸了。攻擊數(shù)據(jù)包很小嘱函,遠(yuǎn)遠(yuǎn)不夠最大傳輸單元(MTU)的1500字節(jié)甘畅,因此不會被分片。那么這些數(shù)據(jù)包就像生產(chǎn)流水線上的罐頭一樣往弓,一個包連著一個包緊密地?cái)D在一起傳輸嗎疏唾?事實(shí)上不是這樣的。
以太網(wǎng)在傳輸時(shí)函似,還有前導(dǎo)碼(preamble)和幀間距(inter-frame gap)槐脏。其中前導(dǎo)碼占8字節(jié)(byte),即64比特位撇寞。前導(dǎo)碼前面的7字節(jié)都是10101010顿天,1和0間隔而成。但第八個字節(jié)就變成了10101011蔑担,當(dāng)主機(jī)監(jiān)測到連續(xù)的兩個1時(shí)牌废,就知道后面開始是數(shù)據(jù)了。在網(wǎng)絡(luò)傳輸時(shí)啤握,數(shù)據(jù)的結(jié)構(gòu)如下:
|8字節(jié)前導(dǎo)碼|6字節(jié)目的MAC地址|6字節(jié)源MAC地址|2字節(jié)上層協(xié)議類型|20字節(jié)IP頭|20字節(jié)TCP頭|6字節(jié)以太網(wǎng)填充|4字節(jié)CRC檢驗(yàn)|12字節(jié)幀間距|
也就是說鸟缕,一個本來只有40字節(jié)的SYN包,在網(wǎng)絡(luò)上傳輸時(shí)占的帶寬恨统,其實(shí)是84字節(jié)叁扫。
有了上面的基礎(chǔ),現(xiàn)在可以開始計(jì)算攻擊流量和網(wǎng)絡(luò)設(shè)備的線速問題了畜埋。當(dāng)只填充IP頭和TCP頭的最小SYN包跑在以太網(wǎng)絡(luò)上時(shí)莫绣,100Mbit的網(wǎng)絡(luò),能支持的最大PPS(Packet Per Second)是100×106 / (8 * (64+8+12)) = 148809悠鞍,1000Mbit的網(wǎng)絡(luò)对室,能支持的最大PPS是1488090模燥。
SYN Flood防御
前文描述過,SYN Flood攻擊大量消耗服務(wù)器的CPU掩宜、內(nèi)存資源蔫骂,并占滿SYN等待隊(duì)列。相應(yīng)的牺汤,我們修改內(nèi)核參數(shù)即可有效緩解辽旋。主要參數(shù)如下:
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 2
分別為啟用SYN Cookie、設(shè)置SYN最大隊(duì)列長度以及設(shè)置SYN+ACK最大重試次數(shù)檐迟。
SYN Cookie的作用是緩解服務(wù)器資源壓力补胚。啟用之前,服務(wù)器在接到SYN數(shù)據(jù)包后追迟,立即分配存儲空間溶其,并隨機(jī)化一個數(shù)字作為SYN號發(fā)送SYN+ACK數(shù)據(jù)包。然后保存連接的狀態(tài)信息等待客戶端確認(rèn)敦间。啟用SYN Cookie之后瓶逃,服務(wù)器不再分配存儲空間,而且通過基于時(shí)間種子的隨機(jī)數(shù)算法設(shè)置一個SYN號廓块,替代完全隨機(jī)的SYN號厢绝。發(fā)送完SYN+ACK確認(rèn)報(bào)文之后,清空資源不保存任何狀態(tài)信息剿骨。直到服務(wù)器接到客戶端的最終ACK包代芜,通過Cookie檢驗(yàn)算法鑒定是否與發(fā)出去的SYN+ACK報(bào)文序列號匹配埠褪,匹配則通過完成握手浓利,失敗則丟棄。當(dāng)然钞速,前文的高級攻擊中有SYN混合ACK的攻擊方法贷掖,則是對此種防御方法的反擊,其中優(yōu)劣由雙方的硬件配置決定
tcp_max_syn_backlog則是使用服務(wù)器的內(nèi)存資源渴语,換取更大的等待隊(duì)列長度苹威,讓攻擊數(shù)據(jù)包不至于占滿所有連接而導(dǎo)致正常用戶無法完成握手。net.ipv4.tcp_synack_retries是降低服務(wù)器SYN+ACK報(bào)文重試次數(shù)驾凶,盡快釋放等待資源牙甫。這三種措施與攻擊的三種危害一一對應(yīng),完完全全地對癥下藥调违。但這些措施也是雙刃劍窟哺,可能消耗服務(wù)器更多的內(nèi)存資源,甚至影響正常用戶建立TCP連接技肩,需要評估服務(wù)器硬件資源和攻擊大小謹(jǐn)慎設(shè)置且轨。
除了定制TCP/IP協(xié)議棧之外,還有一種常見做法是TCP首包丟棄方案,利用TCP協(xié)議的重傳機(jī)制識別正常用戶和攻擊報(bào)文旋奢。當(dāng)防御設(shè)備接到一個IP地址的SYN報(bào)文后泳挥,簡單比對該IP是否存在于白名單中,存在則轉(zhuǎn)發(fā)到后端至朗。如不存在于白名單中屉符,檢查是否是該IP在一定時(shí)間段內(nèi)的首次SYN報(bào)文,不是則檢查是否重傳報(bào)文锹引,是重傳則轉(zhuǎn)發(fā)并加入白名單筑煮,不是則丟棄并加入黑名單。是首次SYN報(bào)文則丟棄并等待一段時(shí)間以試圖接受該IP的SYN重傳報(bào)文粤蝎,等待超時(shí)則判定為攻擊報(bào)文加入黑名單真仲。
首包丟棄方案對用戶體驗(yàn)會略有影響,因?yàn)閬G棄首包重傳會增大業(yè)務(wù)的響應(yīng)時(shí)間初澎,有鑒于此發(fā)展出了一種更優(yōu)的TCP Proxy方案秸应。所有的SYN數(shù)據(jù)報(bào)文由清洗設(shè)備接受,按照SYN Cookie方案處理碑宴。和設(shè)備成功建立了TCP三次握手的IP地址被判定為合法用戶加入白名單,由設(shè)備偽裝真實(shí)客戶端IP地址再與真實(shí)服務(wù)器完成三次握手延柠,隨后轉(zhuǎn)發(fā)數(shù)據(jù)。而指定時(shí)間內(nèi)沒有和設(shè)備完成三次握手的IP地址贞间,被判定為惡意IP地址屏蔽一定時(shí)間。除了SYN Cookie結(jié)合TCP Proxy外增热,清洗設(shè)備還具備多種畸形TCP標(biāo)志位數(shù)據(jù)包探測的能力,通過對SYN報(bào)文返回非預(yù)期應(yīng)答測試客戶端反應(yīng)的方式來鑒別正常訪問和惡意行為峻仇。
清洗設(shè)備的硬件具有特殊的網(wǎng)絡(luò)處理器芯片和特別優(yōu)化的操作系統(tǒng)、TCP/IP協(xié)議棧摄咆,可以處理非常巨大的流量和SYN隊(duì)列。
HTTP Flood防御
HTTP Flood攻擊防御主要通過緩存的方式進(jìn)行吭从,盡量由設(shè)備的緩存直接返回結(jié)果來保護(hù)后端業(yè)務(wù)。大型的互聯(lián)網(wǎng)企業(yè)影锈,會有龐大的CDN節(jié)點(diǎn)緩存內(nèi)容芹务。
當(dāng)高級攻擊者穿透緩存時(shí)蝉绷,清洗設(shè)備會截獲HTTP請求做特殊處理。最簡單的方法就是對源IP的HTTP請求頻率做統(tǒng)計(jì)枣抱,高于一定頻率的IP地址加入黑名單熔吗。這種方法過于簡單,容易帶來誤殺佳晶,并且無法屏蔽來自代理服務(wù)器的攻擊桅狠,因此逐漸廢止,取而代之的是JavaScript跳轉(zhuǎn)人機(jī)識別方案轿秧。
HTTP Flood是由程序模擬HTTP請求中跌,一般來說不會解析服務(wù)端返回?cái)?shù)據(jù),更不會解析JS之類代碼菇篡。因此當(dāng)清洗設(shè)備截獲到HTTP請求時(shí)漩符,返回一段特殊JavaScript代碼,正常用戶的瀏覽器會處理并正常跳轉(zhuǎn)不影響使用驱还,而攻擊程序會攻擊到空處嗜暴。
DNS Flood防御
DNS攻擊防御也有類似HTTP的防御手段,第一方案是緩存议蟆。其次是重發(fā)闷沥,可以是直接丟棄DNS報(bào)文導(dǎo)致UDP層面的請求重發(fā),可以是返回特殊響應(yīng)強(qiáng)制要求客戶端使用TCP協(xié)議重發(fā)DNS查詢請求咐容。
特殊的舆逃,對于授權(quán)域DNS的保護(hù),設(shè)備會在業(yè)務(wù)正常時(shí)期提取收到的DNS域名列表和ISP DNS IP列表備用戳粒,在攻擊時(shí)路狮,非此列表的請求一律丟棄,大幅降低性能壓力享郊。對于域名览祖,實(shí)行同樣的域名白名單機(jī)制,非白名單中的域名解析請求炊琉,做丟棄處理。
慢速連接攻擊防御
Slowloris攻擊防御比較簡單又活,主要方案有兩個苔咪。
第一個是統(tǒng)計(jì)每個TCP連接的時(shí)長并計(jì)算單位時(shí)間內(nèi)通過的報(bào)文數(shù)量即可做精確識別。一個TCP連接中柳骄,HTTP報(bào)文太少和報(bào)文太多都是不正常的,過少可能是慢速連接攻擊耐薯,過多可能是使用HTTP 1.1協(xié)議進(jìn)行的HTTP Flood攻擊丝里,在一個TCP連接中發(fā)送多個HTTP請求杯聚。
第二個是限制HTTP頭部傳輸?shù)淖畲笤S可時(shí)間幌绍。超過指定時(shí)間HTTP Header還沒有傳輸完成故响,直接判定源IP地址為慢速連接攻擊彩届,中斷連接并加入黑名單。
五糜值、總結(jié)
DDOS攻擊很難通過某一種手段做到完全防御寂汇,很多中小型企業(yè)捣染,沒有能力也沒有財(cái)力來對抗DDOS攻擊。但通過下面的幾點(diǎn)榕栏,還是可以做到簡單的防御:
-
保證服務(wù)器系統(tǒng)的安全
首先要確保服務(wù)器軟件沒有任何漏洞扒磁,防止攻擊者入侵式曲。確保服務(wù)器采用最新系統(tǒng)吝羞,并打上安全補(bǔ)丁。在服務(wù)器上刪除未使用的服務(wù)敦腔,關(guān)閉未使用的端口恨溜。對于服務(wù)器上運(yùn)行的網(wǎng)站找前,確保其打了最新的補(bǔ)丁躺盛,沒有安全漏洞颗品。
-
隱藏服務(wù)器真實(shí)IP
服務(wù)器前端加CDN中轉(zhuǎn)(免費(fèi)的有百度云加速沃缘、360網(wǎng)站衛(wèi)士槐臀、加速樂、安全寶等)得糜,如果資金充裕的話朝抖,可以購買高防的盾機(jī)谍珊,用于隱藏服務(wù)器真實(shí)IP,域名解析使用CDN的IP侮邀,所有解析的子域名都使用CDN的IP地址贝润。此外打掘,服務(wù)器上部署的其他域名也不能使用真實(shí)IP解析,全部都使用CDN來解析唯绍。 另外枝誊,防止服務(wù)器對外傳送信息泄漏IP叶撒,最常見的是,服務(wù)器不使用發(fā)送郵件功能压汪,如果非要發(fā)送郵件止剖,可以通過第三方代理(例如sendcloud)發(fā)送落君,這樣對外顯示的IP是代理的IP绎速。 總之,只要服務(wù)器的真實(shí)IP不泄露洒宝,10G以下小流量DDOS的預(yù)防花不了多少錢雁歌,免費(fèi)的CDN就可以應(yīng)付得了知残。如果攻擊流量超過20G,那么免費(fèi)的CDN可能就頂不住了较坛,需要購買一個高防的盾機(jī)來應(yīng)付了扒最,而服務(wù)器的真實(shí)IP同樣需要隱藏吧趣。