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