如何抵禦頻發的 DDOS 攻擊?

csdn 發佈 2020-01-03T16:20:05+00:00

作者| 阿文責編 | 郭芮2016年5月,不法黑客針對全球範圍內的多家銀行網站發動了一系列的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的進行抓包。

[root@centos ~]# netstat -ant

Active Internet connections (servers and established)

Proto Recv-Q Send-Q Local Address Foreign Address State

tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN

tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN

tcp 0 0 192.168.10.58:22 13.136.182.140:23107 TIME_WAIT

tcp 0 48 192.168.10.58:22 13.136.182.140:61282 TIME_WAIT

tcp6 0 0 :::22 :::* LISTEN

tcp6 0 0 ::1:25 :::* LISTEN

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_timeoutnet.netfilter.nf_conntrack_tcp_timeout_time_wait,讓系統儘快釋放它們所占用的資源。

  • 開啟埠復用 net.ipv4.tcp_tw_reuse。這樣,被TIME_WAIT狀態占用的埠,還能用到新建的連接中。

  • 增大本地埠的範圍 net.ipv4.ip_local_port_range。這樣就可以支持更多連接,提高整體的並發能力。

  • 增加最大文件描述符的數量。你可以使用fs.nr_openfs.file-max,分別增大進程和系統的最大文件描述符數;或在應用程式的systemd配置文件中,配置LimitNOFILE,設置應用程式的最大文件描述符數。

通過專業的流量清洗系統來防範DDOS攻擊

流量清洗服務是一種針對對其發起的DOS/DDOS攻擊的監控、告警和防護的一種網絡安全服務。在不影響正常業務的前提下,清洗掉異常流量。它會分析和過濾異常流量,將異常的攻擊流量阻擋在門外,從而為正常的請求提供服務。

一般這類系統由專門的服務商提供,大多數會提供10 Gpbs~100Gpbs 的防護能力。

關鍵字: