你還在花錢防禦DDoS?巧用iptables 5招免費搞定 SYN洪水攻擊!

SYN Flood (SYN洪水) 是種典型的DoS (Denial of Service,拒絕服務) 攻擊,屬於DDos攻擊的一種。遭受攻擊後服務器TCP連接資源耗盡,最後停止響應正常的TCP連接請求。儘管這種攻擊已經出現了十多年,但它的變種至今仍能看到。雖然能有效對抗SYN洪泛的技術已經存在,但是沒有對於TCP實現的一個標準的補救方法出現。今天小編將詳述這種攻擊原理以及對抗SYN洪水的方法~

你還在花錢防禦DDoS?巧用iptables 5招免費搞定 SYN洪水攻擊!

攻擊原理

正常的三次握手:

  1. 先發起一個 SYN=1 的包,並且帶一個序列號( Seq );
  2. 服務器收到這個包以後,將這個數據放入到一個隊列中,這個隊列叫 syn_table 。並且發送一個返回包,作為響應,這個返回包有自己的序列號( Seq ),以及一個 Ack , Ack 的值就是客戶端發來的 Seq 值加一;
  3. 客戶端收到返回信息以後,將服務器的 Seq 加一作為 Ack 又發給服務器;
  4. 服務器收到這第三個包,驗證沒問題以後,就將這個連接放入到 request_sock_queue,三次握手完成。
你還在花錢防禦DDoS?巧用iptables 5招免費搞定 SYN洪水攻擊!

SYN Flood 主要是利用了TCP協議的三次握手的缺陷,在這個攻擊中,Flood帶有一系列的syn數據包,每個數據包都會導致服務端發送SYN-ACK響應,然後服務器等待SYN+ACK之後的第三次握手ACK,由於客戶端是軟件生成的虛擬IP,永遠不會再發送ACK響應服務端,服務端會利用從傳機制直到超時後刪除,整個系統資源也會被隊列積壓消耗,導致服務器無法對正常的請求進行服務。

你還在花錢防禦DDoS?巧用iptables 5招免費搞定 SYN洪水攻擊!

如何判斷自己是否遭受 SYN 攻擊?

檢測SYN攻擊非常的簡單,當你在服務器上看到大量的半連接狀態時,特別是源IP地址是隨機的,基本上可以斷定這是一次SYN攻擊。我們使用系統自帶的netstat 工具來檢測SYN攻擊:

# netstat -n -p TCP 

反饋如圖

你還在花錢防禦DDoS?巧用iptables 5招免費搞定 SYN洪水攻擊!

防禦 SYN Flood攻擊

配置iptables規則

Iptables防火牆我們可以理解為Linux系統下的訪問控制功能,我們可以利用Iptables來配置一些規則來防禦這種攻擊。強制SYN數據包檢查,保證傳入的tcp鏈接是SYN數據包,如果不是就丟棄。

#iptables -A INPUT -p tcp --syn -m state --state NEW -j DROP

強制檢查碎片包,把帶有傳入片段的數據包丟棄。

#iptables -A INPUT -f -j DROP

丟棄格式錯誤的XMAS數據包。

#iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

丟棄格式錯誤的NULL數據包。

#iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

當Iptables配置完成後我們可以使用nmap命令對其驗證

# nmap -v -f FIREWALL IP
# nmap -v -sX FIREWALL IP
# nmap -v -sN FIREWALL IP

例如:

你還在花錢防禦DDoS?巧用iptables 5招免費搞定 SYN洪水攻擊!

其他防禦方式:

除此之外針對SYN攻擊的幾個環節,我們還可以使用以下處理方法:

方式1:減少SYN-ACK數據包的重發次數(默認是5次)

sysctl -w net.ipv4.tcp_synack_retries=3
sysctl -w net.ipv4.tcp_syn_retries=3

方式2:使用SYN Cookie技術

sysctl -w net.ipv4.tcp_syncookies=1

方式3:增加backlog隊列(默認是1024):

sysctl -w net.ipv4.tcp_max_syn_backlog=2048

方式4:限制SYN併發數:

iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT --limit 1/s


分享到:


相關文章: