惠州做網(wǎng)站的公司百度指數(shù)怎么看排名
文章目錄
- 1.什么是 SYN Flood 攻擊?
- 2.半連接與全連接隊列
- 3.如何防范 SYN Flood 攻擊?
- 增大半連接隊列
- 開啟 SYN Cookie
- 減少 SYN+ACK 重傳次數(shù)
- 參考文獻
1.什么是 SYN Flood 攻擊?
SYN Flood 是互聯(lián)網(wǎng)上最原始、最經(jīng)典的 DDoS(Distributed Denial of Service)攻擊之一。
SYN 報文指的是 TCP 協(xié)議中的 Synchronize 報文,是 TCP 三次握手過程中的首個報文。讓我們先來了解一個正常的TCP三次握手過程。
TCP 連接建立需要三次握手,假設攻擊者短時間偽造不同 IP 地址的 SYN 報文,服務端每接收到一個 SYN 報文,就進 SYN_RECV 狀態(tài),但服務端發(fā)送出去的 ACK + SYN 報文,無法得到未知 IP 主機的 ACK 應答,久而久之就會占滿服務端的半連接隊列,使得服務端不能為正常用戶服務。
這就是 SYN Flood 攻擊。
2.半連接與全連接隊列
什么是 TCP 半連接和全連接隊列?
TCP 三次握手時,Linux 內(nèi)核會維護兩個隊列:
- 半連接隊列,也稱 SYN 隊列。
- 全連接隊列,也稱 Accept 隊列。
我們先來看下 Linux 內(nèi)核的半連接隊列與全連接隊列是如何工作的?
- 當服務端接收到客戶端的 SYN 報文時,會創(chuàng)建一個半連接的對象,然后將其加入到內(nèi)核的「 SYN 隊列」。
- 接著發(fā)送 SYN + ACK 給客戶端,等待客戶端回應 ACK 報文。
- 服務端接收到 ACK 報文后,從「 SYN 隊列」取出一個半連接對象,然后創(chuàng)建一個新的連接對象放入到「 Accept 隊列」。
- 應用通過調(diào)用 accpet() socket 接口,從「 Accept 隊列」取出連接對象。
不管是半連接隊列還是全連接隊列,都有最大長度限制,超過限制時,默認情況都會丟棄報文。
SYN Flood 攻擊方式最直接的表現(xiàn)就會把 TCP 半連接隊列打滿,這樣當 TCP 半連接隊列滿了,后續(xù)再收到 SYN 報文就會丟棄,導致客戶端無法和服務端建立連接。
3.如何防范 SYN Flood 攻擊?
SYN Flood 的目的是占滿服務器的連接數(shù),消耗服務器的系統(tǒng)資源。對于服務器自身來說,最直接的做法就是提高服務能力,比如組建集群,升級硬件。但是這種方式成本巨大,且對于海量的攻擊報文來說,并沒有太大的作用,僅多撐幾分鐘甚至幾秒而已。
防范 SYN Flood 攻擊,可以有以下幾種方法:
增大半連接隊列
增大 TCP 半連接隊列,要同時增大下面這三個參數(shù):
增大 net.ipv4.tcp_max_syn_backlog
增大 listen() 函數(shù)中的 backlog
增大 net.core.somaxconn
開啟 SYN Cookie
開啟 SYN Cookie 功能就可以在不使用 SYN 半連接隊列的情況下成功建立連接,相當于繞過了 SYN 半連接來建立連接。
- 當 「 SYN 隊列」?jié)M之后,后續(xù)服務端收到 SYN 包,不會丟棄,而是根據(jù)算法,計算出一個 Cookie 值。Cookie 包含了一些與連接相關的信息,如初始序列號等,但不會在服務器端保存連接狀態(tài)。
- 服務端將 Cookie 值放到第二次握手報文的「序列號」里回給客戶端。
- 服務端接收到客戶端的 ACK 報文時,通過將 ACK 報文減去 1 獲取 Cookie,然后根據(jù) Cookie 判斷報文的合法性并重建連接狀態(tài),然后將該連接對象放入「 Accept 隊列」。
- 最后應用程序通過調(diào)用 accpet() 函數(shù),從「 Accept 隊列」取出連接。
可以看到,當開啟了 SYN Cookie 了,即使受到 SYN 攻擊而導致 SYN 隊列滿時,也能保證正常的連接成功建立。
net.ipv4.tcp_syncookies 參數(shù)主要有以下三個值:
0 值,表示關閉該功能
1 值,表示僅當 SYN 半連接隊列放不下時,再啟用它
2 值,表示無條件開啟功能
那么在應對 SYN 攻擊時,只需要設置為 1 即可。
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
減少 SYN+ACK 重傳次數(shù)
當服務端受到 SYN 攻擊時,就會有大量處于 SYN_RECV 狀態(tài)的 TCP 連接,處于這個狀態(tài)的 TCP 會重傳 SYN+ACK ,當重傳超過次數(shù)達到上限后,就會斷開連接。
那么針對 SYN 攻擊的場景,我們可以減少 SYN-ACK 的重傳次數(shù),以加快處于 SYN_REVC 狀態(tài)的 TCP 連接斷開。
SYN-ACK 報文的最大重傳次數(shù)由 tcp_synack_retries內(nèi)核參數(shù)決定(默認值是 5 次),比如將 tcp_synack_retries 減少到 2 次:
echo 2 > /proc/sys/net/ipv4/tcp_synack_retries
參考文獻
SYN 洪水DDoS 攻擊 - Cloudflare
什么是SYN Flood?如何防御SYN Flood? - 華為
4.1 TCP 三次握手與四次揮手面試題 - 小林coding
TCP 半連接隊列和全連接隊列滿了會發(fā)生什么?又該如何應對?
SYN cookies - wikipedia