如何抵御频发的 DDOS 攻击?
作者 |?阿文
責(zé)編 | 郭芮
2016年5月,不法黑客針對全球范圍內(nèi)的多家銀行網(wǎng)站發(fā)動了一系列的DDoS攻擊。導(dǎo)致約旦、韓國以及摩納哥等央行網(wǎng)絡(luò)系統(tǒng)陷入了半小時的癱瘓狀態(tài),無法進(jìn)行正常工作。
2016年11月,俄羅斯五家主流銀行遭遇長達(dá)兩天的DDoS攻擊。來自30個國家2.4萬臺計算機(jī)構(gòu)成的僵尸網(wǎng)絡(luò)持續(xù)不斷發(fā)動強(qiáng)大的DDOS攻擊。
2017年4月初,江蘇省某網(wǎng)絡(luò)公司服務(wù)器頻繁遭到DDoS流量攻擊,導(dǎo)致掛載在服務(wù)器上的多個網(wǎng)站無法正常運(yùn)營,損失嚴(yán)重。
2018年3月,Github遭受了迄今為止記錄的最大的DDoS攻擊。攻擊者通過公共互聯(lián)網(wǎng)發(fā)送小字節(jié)的基于UDP的數(shù)據(jù)包請求到配置錯誤的memcached服務(wù)器,作為回應(yīng),memcached服務(wù)器通過向Github發(fā)送大量不成比例的響應(yīng),形成巨大規(guī)模的DDoS攻擊。
2019年9月初,北京市公安局網(wǎng)絡(luò)安全保衛(wèi)總隊(以下簡稱“網(wǎng)安總隊”)發(fā)起了針對“分布式拒絕服務(wù)攻擊”類違法犯罪的全國性專項打擊行動。三個月內(nèi),網(wǎng)安總隊在全國范圍內(nèi)共抓獲違法犯罪嫌疑人379名,清理在京被控主機(jī)7268臺。
什么是DDOS攻擊?
舉個例子,我開了一家飯店,這家飯店可以容納100人同時就餐,我的一個競爭對手在對門也開了一家飯店,競爭對手雇傭了300人來這個飯店坐著不吃不喝,導(dǎo)致飯店滿滿當(dāng)當(dāng)無法正常營業(yè),這在計算機(jī)中的表現(xiàn)就是分布式拒絕服務(wù)。
在計算機(jī)系統(tǒng)中它利用網(wǎng)絡(luò)協(xié)議和操作系統(tǒng)的一些缺陷,采用欺騙和偽裝的策略來進(jìn)行網(wǎng)絡(luò)攻擊,使網(wǎng)站服務(wù)器充斥大量要求回復(fù)的信息,消耗網(wǎng)絡(luò)帶寬或系統(tǒng)資源,導(dǎo)致網(wǎng)絡(luò)或系統(tǒng)不勝負(fù)荷以至于癱瘓而停止提供正常的網(wǎng)絡(luò)服務(wù)。
分布式拒絕服務(wù)攻擊(英文意思是Distributed Denial of Service,簡稱DDoS)是指處于不同位置的多個攻擊者同時向一個或數(shù)個目標(biāo)發(fā)動攻擊,或者一個攻擊者控制了位于不同位置的多臺機(jī)器并利用這些機(jī)器對受害者同時實(shí)施攻擊。
在進(jìn)行攻擊的時候,可以對源IP地址進(jìn)行偽造,通常攻擊者會在發(fā)起DDOS 攻擊之前就控制著成千上萬個存在漏洞的計算機(jī),這些計算機(jī)我們稱之為“肉雞”,入侵者通過這些“肉雞”向目標(biāo)機(jī)器在相同時間內(nèi)發(fā)起并發(fā)請求,導(dǎo)致目標(biāo)機(jī)器的系統(tǒng)資源瞬間被打滿,無法正常對外提供服務(wù)。
與DoS攻擊由單臺主機(jī)發(fā)起攻擊相比較,分布式拒絕服務(wù)攻擊DDoS是借助數(shù)百、甚至數(shù)千臺被入侵后安裝了攻擊進(jìn)程的主機(jī)同時發(fā)起的集團(tuán)行為。
攻擊方式
SYN Flood攻擊
SYN Flood 攻擊是當(dāng)前網(wǎng)絡(luò)上最為常見的DDoS攻擊,它利用了TCP協(xié)議實(shí)現(xiàn)上的一個缺陷。通過向網(wǎng)絡(luò)服務(wù)所在端口發(fā)送大量的偽造源地址的攻擊報文,就可能造成目標(biāo)服務(wù)器中的半開連接隊列被占滿,從而阻止其他合法用戶進(jìn)行訪問。
眾所周知,TCP要建立連接,需要進(jìn)行三次握手,通信的雙方最少得經(jīng)過3次成功的信息交換才能進(jìn)入連接全開狀態(tài)(Full-Open)。一個正常的連接建立需要如下步驟:
首先,客戶端向服務(wù)器發(fā)送SYN數(shù)據(jù)包,以便啟動連接;
服務(wù)器響應(yīng)該初始包與SYN / ACK包,以確認(rèn)通信;
最后,客戶端返回ACK數(shù)據(jù)包以確認(rèn)從服務(wù)器接收到的數(shù)據(jù)包。完成這個數(shù)據(jù)包發(fā)送和接收序列后,TCP連接打開并能發(fā)送和接收數(shù)據(jù)。
攻擊者利用TCP握手這一機(jī)制,在接收到初始SYN數(shù)據(jù)包之后,服務(wù)器將用一個或多個SYN / ACK數(shù)據(jù)包進(jìn)行響應(yīng),并等待握手中的最后一步。這是它的工作原理:
攻擊者向目標(biāo)服務(wù)器發(fā)送大量SYN數(shù)據(jù)包,通常會使用欺騙性的IP地址。
服務(wù)器響應(yīng)每個連接請求,并留下開放端口準(zhǔn)備好接收響應(yīng)。
服務(wù)器等待從未到達(dá)的最終ACK數(shù)據(jù)包時,攻擊者繼續(xù)發(fā)送更多的SYN數(shù)據(jù)包。每個新的SYN數(shù)據(jù)包的到達(dá)導(dǎo)致服務(wù)器暫時維持新的開放端口連接一段時間,一旦所有可用端口被使用,服務(wù)器就無法正常工作。
當(dāng)服務(wù)器斷開連接但連接另一端的機(jī)器沒有連接時,連接被認(rèn)為是半開的。在這種類型的DDoS攻擊中,目標(biāo)服務(wù)器不斷離開打開的連接,等待每個連接超時,然后端口再次可用。結(jié)果是這種攻擊可以被認(rèn)為是“半開攻擊”。
UDP Flood攻擊
UDP Flood 是日漸猖厥的流量型DDoS攻擊,原理也很簡單。常見的情況是利用大量UDP小包沖擊DNS服務(wù)器或Radius認(rèn)證服務(wù)器、流媒體視頻服務(wù)器。由于UDP協(xié)議是一種無連接的服務(wù),在UDP Flood攻擊中,攻擊者可發(fā)送大量偽造源IP地址的小UDP包。
ICMP Flood攻擊
ICMP Flood攻擊屬于流量型的攻擊方式,是利用大的流量給服務(wù)器帶來較大的負(fù)載,影響服務(wù)器的正常服務(wù)。由于目前很多防火墻直接過濾ICMP報文。因此ICMP Flood出現(xiàn)的頻度較低。
Connection Flood攻擊
Connection Flood是典型的利用小流量沖擊大帶寬網(wǎng)絡(luò)服務(wù)的攻擊方式,這種攻擊的原理是利用真實(shí)的IP地址向服務(wù)器發(fā)起大量的連接。并且建立連接之后很長時間不釋放,占用服務(wù)器的資源,造成服務(wù)器上殘余連接(WAIT狀態(tài))過多,效率降低,甚至資源耗盡,無法響應(yīng)其他客戶所發(fā)起的鏈接。
HTTP Get攻擊
這種攻擊主要是針對存在ASP、JSP、PHP、CGI等腳本程序,特征是和服務(wù)器建立正常的TCP連接,并不斷的向腳本程序提交查詢、列表等大量耗費(fèi)數(shù)據(jù)庫資源的調(diào)用。這種攻擊的特點(diǎn)是可以繞過普通的防火墻防護(hù),可通過Proxy代理實(shí)施攻擊,缺點(diǎn)是攻擊靜態(tài)頁面的網(wǎng)站效果不佳,會暴露攻擊者的lP地址。
UDP DNS Query Flood攻擊
UDP DNS Query Flood攻擊采用的方法是向被攻擊的服務(wù)器發(fā)送大量的域名解析請求,通常請求解析的域名是隨機(jī)生成或者是網(wǎng)絡(luò)世界上根本不存在的域名。域名解析的過程給服務(wù)器帶來了很大的負(fù)載,每秒鐘域名解析請求超過一定的數(shù)星就會造成DNS服務(wù)器解析域名超時。
DDOS 的防范
通過 Linux 自帶防火墻防范攻擊
以 DDOS SYN Flood 攻擊為例,我們可以通過系統(tǒng)自帶的iptables 防火墻來進(jìn)行防護(hù)。
第一種方式是禁止攻擊來源IP,但是通常攻擊源都不只一個IP,這種方式防護(hù)比較弱。
$?iptables?-I?INPUT?-s?192.168.0.2?-p?tcp?-j?REJECT第二鐘方式是 限制syn并發(fā)的次數(shù)以及同一個IP 新建連接數(shù)的數(shù)量。
#?限制?syn?并發(fā)數(shù)為每秒?1?次 $?iptables?-A?INPUT?-p?tcp?--syn?-m?limit?--limit?1/s?-j?ACCEPT #?限制單個?IP?在?60?秒新建立的連接數(shù)為?10 $?iptables?-I?INPUT?-p?tcp?--dport?80?--syn?-m?recent?--name?SYN_FLOOD?--update?--seconds?60?--hitcount?10?-j?REJECT但是如果攻擊源特別多,其實(shí)還是很難阻擋。SYN Flood 會導(dǎo)致 SYN_RECV 狀態(tài)的連接急劇增大,可以通過調(diào)整半連接容量大小,例如調(diào)整為 1024
$?sysctl?-w?net.ipv4.tcp_max_syn_backlog=1024 net.ipv4.tcp_max_syn_backlog?=?1024另外,每個SYN_RECV 如果失敗,內(nèi)核還會自動重試,默認(rèn)是 5次,可以修改為1次。
$?sysctl?-w?net.ipv4.tcp_synack_retries=1 net.ipv4.tcp_synack_retries?=?1此外,TCP SYN Cookies 是一種專門防御 SYN Flood 攻擊的方法,其原理是基于連接信息(包括源地址、源端口、目的地址、目的端口等)以及一個加密種子(如系統(tǒng)啟動時間),計算出一個哈希值(SHA1),這個哈希值稱為 cookie。
這個 cookie 就被用作序列號,來應(yīng)答 SYN+ACK 包,并釋放連接狀態(tài)。當(dāng)客戶端發(fā)送完三次握手的最后一次 ACK 后,服務(wù)器就會再次計算這個哈希值,確認(rèn)是上次返回的 SYN+ACK 的返回包,才會進(jìn)入 TCP 的連接狀態(tài)。因而,開啟 SYN Cookies 后,就不需要維護(hù)半開連接狀態(tài)了,進(jìn)而也就沒有了半連接數(shù)的限制。
注意開啟 TCP syncookies 后,內(nèi)核選項 net.ipv4.tcp_max_syn_backlog 也就無效了。可以通過下面的方式開啟:
$?sysctl?-w?net.ipv4.tcp_syncookies=1 net.ipv4.tcp_syncookies?=?1優(yōu)化網(wǎng)絡(luò)相關(guān)的內(nèi)核參數(shù)
當(dāng)遭遇攻擊時,請求數(shù)會較大,你可能會看到大量處于TIME. WAIT狀態(tài)的連接。
linux查看tcp的狀態(tài)命令:
netstat -nat查看TCP各個狀態(tài)的數(shù)量;
lsof -i:port 可以檢測到打開套接字的狀況;
sar -n SOCK 查看tcp創(chuàng)建的連接數(shù);
tcpdump -iany tcp port 6000 對tcp端口為6000的進(jìn)行抓包。
TCP狀態(tài)及其描述:
| LISTEN | 等待來自遠(yuǎn)程TCP應(yīng)用程序的請求 |
| SYN_SENT | 發(fā)送連接請求后等待來自遠(yuǎn)程端點(diǎn)的確認(rèn)。TCP第一次握手后客戶端所處的狀態(tài) |
| SYN-RECEIVED | 該端點(diǎn)已經(jīng)接收到連接請求并發(fā)送確認(rèn)。該端點(diǎn)正在等待最終確認(rèn)。TCP第二次握手后服務(wù)端所處的狀態(tài) |
| ESTABLISHED | 代表連接已經(jīng)建立起來了。這是連接數(shù)據(jù)傳輸階段的正常狀態(tài) |
| FIN_WAIT_1 | 等待來自遠(yuǎn)程TCP的終止連接請求或終止請求的確認(rèn) |
| FIN_WAIT_2 | 在此端點(diǎn)發(fā)送終止連接請求后,等待來自遠(yuǎn)程TCP的連接終止請求 |
| CLOSE_WAIT | 該端點(diǎn)已經(jīng)收到來自遠(yuǎn)程端點(diǎn)的關(guān)閉請求,此TCP正在等待本地應(yīng)用程序的連接終止請求 |
| CLOSING | 等待來自遠(yuǎn)程TCP的連接終止請求確認(rèn) |
| LAST_ACK | 等待先前發(fā)送到遠(yuǎn)程TCP的連接終止請求的確認(rèn) |
| TIME_WAIT | 等待足夠的時間來確保遠(yuǎn)程TCP接收到其連接終止請求的確認(rèn) |
它們會占用大量內(nèi)存和端口資源。這時,我們可以優(yōu)化與TIME_ WAIT狀態(tài)相關(guān)的內(nèi)核選項,比如采取下面幾種措施:
增大處于 TIME_WAIT 狀態(tài)的連接數(shù)量 net.ipv4.tcp_max_tw_buckets ,并增大連接跟蹤表的大小 net.netfilter.nf_conntrack_max。
減小 net.ipv4.tcp_fin_timeout 和 net.netfilter.nf_conntrack_tcp_timeout_time_wait ,讓系統(tǒng)盡快釋放它們所占用的資源。
開啟端口復(fù)用 net.ipv4.tcp_tw_reuse。這樣,被 TIME_WAIT 狀態(tài)占用的端口,還能用到新建的連接中。
增大本地端口的范圍 net.ipv4.ip_local_port_range。這樣就可以支持更多連接,提高整體的并發(fā)能力。
增加最大文件描述符的數(shù)量。你可以使用fs.nr_open 和 fs.file-max ,分別增大進(jìn)程和系統(tǒng)的最大文件描述符數(shù);或在應(yīng)用程序的 systemd 配置文件中,配置 LimitNOFILE ,設(shè)置應(yīng)用程序的最大文件描述符數(shù)。
通過專業(yè)的流量清洗系統(tǒng)來防范DDOS攻擊
流量清洗服務(wù)是一種針對對其發(fā)起的DOS/DDOS攻擊的監(jiān)控、告警和防護(hù)的一種網(wǎng)絡(luò)安全服務(wù)。在不影響正常業(yè)務(wù)的前提下,清洗掉異常流量。它會分析和過濾異常流量,將異常的攻擊流量阻擋在門外,從而為正常的請求提供服務(wù)。
一般這類系統(tǒng)由專門的服務(wù)商提供,大多數(shù)會提供10 Gpbs~100Gpbs 的防護(hù)能力。
有道無術(shù),術(shù)可成;有術(shù)無道,止于術(shù)
歡迎大家關(guān)注Java之道公眾號
好文章,我在看??
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的如何抵御频发的 DDOS 攻击?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NYOJ 590 相同的和
- 下一篇: 策略模式在公司项目中的运用实践,看完又可