【DDOS】巧用iptables 幾招搞定 SYN洪水攻擊!

天府雲創發表於2019-04-25

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

攻擊原理

正常的三次握手:

  1. 先發起一個 SYN=1 的包,並且帶一個序列號( Seq );
  2. 伺服器收到這個包以後,將這個資料放入到一個佇列中,這個佇列叫 syn_table 。並且傳送一個返回包,作為響應,這個返回包有自己的序列號( Seq ),以及一個 Ack , Ack 的值就是客戶端發來的 Seq 值加一;
  3. 客戶端收到返回資訊以後,將伺服器的 Seq 加一作為 Ack 又發給伺服器;
  4. 伺服器收到這第三個包,驗證沒問題以後,就將這個連線放入到 request_sock_queue,三次握手完成。

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

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

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


 
  1. # netstat -n -p TCP 

反饋如圖

防禦 SYN Flood攻擊

配置iptables規則

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

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

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

  1. #iptables -A INPUT -f -j DROP 

丟棄格式錯誤的XMAS資料包。

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

丟棄格式錯誤的NULL資料包。

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

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

  1. # nmap -v -f FIREWALL IP 
  2. # nmap -v -sX FIREWALL IP 
  3. # nmap -v -sN FIREWALL IP 

例如:

 

其他防禦方式:

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

方式1:減少SYN-ACK資料包的重發次數(預設是5次)

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

方式2:使用SYN Cookie技術

  1. sysctl -w net.ipv4.tcp_syncookies=1 

方式3:增加backlog佇列(預設是1024):

  1. sysctl -w net.ipv4.tcp_max_syn_backlog=2048 

方式4:限制SYN併發數:

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

相關文章