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