字體:  

Linux 防止Syn Flood Attack - 遭遇SYN攻擊解法方法

lexus 發表於: 2011-11-10 16:13 來源: ADJ網路控股集團


SYN Flood攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的半連接請求,耗費CPU和內存資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網絡系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統打開TCP服務就可以實施。

 

Service接收到連接請求(syn=j),將此信息加入未連接隊列,並發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。當服務器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連接隊列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回復確認包,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。

 

一般的SYN Food攻擊是利用特殊的程序,設置TCP的Header,向服務器端不斷地成倍發送只有SYN標誌的TCP連接請求。當服務器接收的時候,都認為是沒有建立起來的連接請求,於是為這些請求建立會話,排到緩衝區隊列中。如果你的SYN請求超過了服務器能容納的限度,緩衝區隊列滿,那麼服務器就不再接收新的請求了。其他合法用戶的連接都被拒絕掉。此時,服務器已經無法再提供正常的服務了,所以SYN Food攻擊是拒絕服務攻擊。

 

檢測SYN攻擊:

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

 

  # netstat -nap|grep SYN_RECV
  tcp 0  0 10.22.22.22:80  124.173.152.8:25882  SYN_RECV -
  tcp 0  0 10.22.22.22:80  236.15.133.204:2577  SYN_RECV -
  tcp 0  0 10.22.22.22:80  127.160.6.129:51748  SYN_RECV -
  tcp 0  0 10.22.22.22:80  222.220.13.25:47393  SYN_RECV -
  tcp 0  0 10.22.22.22:80  212.200.204.182:60427 SYN_RECV -
  tcp 0  0 10.22.22.22:80  232.115.18.38:278   SYN_RECV -
  tcp 0  0 10.22.22.22:80  239.116.95.96:5122  SYN_RECV -
  tcp 0  0 10.22.22.22:80  236.219.139.207:49162 SYN_RECV -
  ...

  上面是在LINUX系統中看到的,很多連接處於SYN_RECV狀態,Source IP地址都是隨機的,表明這是一種帶有IP欺騙的SYN攻擊。

 

底下是應付攻擊的基本方法:

 

(1)SYN cookie

在linux下以root權限執行:

 

echo 1 > /proc/sys/net/ipv4/tcp_syncookies

 

這個方法打開了syncookie功能,但實際效果幾乎感覺不到。

 

(2)增大backlog

通過增加backlog的數值,可以一定程度減緩大量SYN請求導致TCP連接阻塞的狀況,一般這個數值系統默認是1024,實驗增加到1280~2048:

 

echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog

 

這樣在強度不是很高的攻擊下,系統響應能力提高了一點。

 

(3)縮短retries次數
Linux系統默認的tcp_synack_retries是5次,將這個數值減少可以提高系統響應能力,實驗改為2次:

 

echo "2" > /proc/sys/net/ipv4/tcp_synack_retries

 

修改後,SYN_RECV的數量有了少量減少,系統響應也快了一些。

 

(4)限制SYN頻率


上述的幾個方法實際效果並不理想,尤其是DDOS攻擊基本無效,目前比較有效的是對SYN的頻率和次數進行限制,這樣最大限度的控制了單個IP地址發動攻擊的能力。

例如將SYN請求的次數限制在1次/每秒鐘,系統默認是5次/秒,顯然太高,同時將burst從默認的5個降低到2個。

 

/sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m limit --limit 1/s --limit-burst 2 -j ACCEPT

 

進行此操作後,對正常的用戶而言無任何感覺上的差異,而並發的SYN請求量下降了不少,服務響應基本正常了。

 

(5)封鎖IP網段
對於某些單獨IP的DOS攻擊,封ip簡單有效,方法也非常容易,但是如果IP是偽造的,效果就有限了:

/sbin/iptables -A INPUT -s a.b.c.d -j REJECT

 

以上第(1)~(4)點都只能當下有效...系統重開機就不見囉...如果要每次重開機都生效,就要寫入 /etc/sysctl.conf 檔,在這個檔的最下面加上

QUOTE:


############# 預防 Syn_RECV #############

net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog = 2048

 

############# 預防大量 Time_Wait #############

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.ip_local_port_range = 5000 65000

# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 30
# Decrease the time default value for tcp_keepalive_time connection
net.ipv4.tcp_keepalive_time = 300
# 探測次數
net.ipv4.tcp_keepalive_probes=2
# 探測間隔秒數
net.ipv4.tcp_keepalive_intvl=2

 

最後執行指令生效

# sysctl -p

 

這樣就可以囉~~


參考網站:

http://blog.xuite.net/huenlil/note/9584716
http://www.sphinxsearch.org/archives/10
http://www.lalulalu.com/thread-778572-1-1.html