lexus 2011-11-10 16:13
Linux 防止Syn Flood Attack - 遭遇SYN攻擊解法方法
<p>SYN Flood攻擊屬於DOS攻擊的一種,它利用TCP協議缺陷,通過發送大量的半連接請求,耗費CPU和內存資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網絡系統,事實上SYN攻擊並不管目標是什麼系統,只要這些系統打開TCP服務就可以實施。</p>
<p> </p>
<p>Service接收到連接請求(syn=j),將此信息加入未連接隊列,並發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。當服務器未收到客戶端的確認包時,重發請求包,一直到超時,才將此條目從未連接隊列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,客戶端在短時間內偽造大量不存在的IP地址,向服務器不斷地發送syn包,服務器回復確認包,並等待客戶的確認,由於源地址是不存在的,服務器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連接隊列,正常的SYN請求被丟棄,目標系統運行緩慢,嚴重者引起網絡堵塞甚至系統癱瘓。 </p>
<p> </p>
<p>一般的SYN Food攻擊是利用特殊的程序,設置TCP的Header,向服務器端不斷地成倍發送只有SYN標誌的TCP連接請求。當服務器接收的時候,都認為是沒有建立起來的連接請求,於是為這些請求建立會話,排到緩衝區隊列中。如果你的SYN請求超過了服務器能容納的限度,緩衝區隊列滿,那麼服務器就不再接收新的請求了。其他合法用戶的連接都被拒絕掉。此時,服務器已經無法再提供正常的服務了,所以SYN Food攻擊是拒絕服務攻擊。 </p>
<p> </p>
<p>檢測SYN攻擊: </p>
<p> 檢測SYN攻擊非常的方便,當你在服務器上看到大量的半連接狀態時,特別是Source IP地址是隨機的,基本上可以斷定這是一次SYN Flood 攻擊。我們使用系統自帶的netstat 工具來檢測SYN攻擊: </p>
<p> </p>
<p> # netstat -nap|grep SYN_RECV <br> tcp 0 0 10.22.22.22:80 124.173.152.8:25882 SYN_RECV - <br> tcp 0 0 10.22.22.22:80 236.15.133.204:2577 SYN_RECV - <br> tcp 0 0 10.22.22.22:80 127.160.6.129:51748 SYN_RECV - <br> tcp 0 0 10.22.22.22:80 222.220.13.25:47393 SYN_RECV - <br> tcp 0 0 10.22.22.22:80 212.200.204.182:60427 SYN_RECV - <br> tcp 0 0 10.22.22.22:80 232.115.18.38:278 SYN_RECV - <br> tcp 0 0 10.22.22.22:80 239.116.95.96:5122 SYN_RECV - <br> tcp 0 0 10.22.22.22:80 236.219.139.207:49162 SYN_RECV - <br> ... </p>
<p> 上面是在LINUX系統中看到的,很多連接處於SYN_RECV狀態,Source IP地址都是隨機的,表明這是一種帶有IP欺騙的SYN攻擊。 <br></p>
<p><font color="green" size="3"></font> </p>
<p><font color="green" size="3">底下是應付攻擊的基本方法:</font></p>
<p> </p>
<p><font color="darkred">(1)SYN cookie</font><br></p>
<p>在linux下以root權限執行:</p>
<p> </p>
<p>echo 1 > /proc/sys/net/ipv4/tcp_syncookies</p>
<p> </p>
<p>這個方法打開了syncookie功能,但實際效果幾乎感覺不到。</p>
<p> </p>
<p><font color="darkred">(2)增大backlog</font><br></p>
<p>通過增加backlog的數值,可以一定程度減緩大量SYN請求導致TCP連接阻塞的狀況,一般這個數值系統默認是1024,實驗增加到1280~2048:</p>
<p> </p>
<p>echo "2048" > /proc/sys/net/ipv4/tcp_max_syn_backlog</p>
<p> </p>
<p>這樣在強度不是很高的攻擊下,系統響應能力提高了一點。</p>
<p> </p>
<p><font color="darkred">(3)縮短retries次數</font><br>Linux系統默認的tcp_synack_retries是5次,將這個數值減少可以提高系統響應能力,實驗改為2次:</p>
<p> </p>
<p>echo "2" > /proc/sys/net/ipv4/tcp_synack_retries</p>
<p> </p>
<p>修改後,SYN_RECV的數量有了少量減少,系統響應也快了一些。</p>
<p> </p>
<p><font color="darkred">(4)限制SYN頻率</font></p>
<p><br>上述的幾個方法實際效果並不理想,尤其是DDOS攻擊基本無效,目前比較有效的是對SYN的頻率和次數進行限制,這樣最大限度的控制了單個IP地址發動攻擊的能力。</p>
<p>例如將SYN請求的次數限制在1次/每秒鐘,系統默認是5次/秒,顯然太高,同時將burst從默認的5個降低到2個。</p>
<p> </p>
<p>/sbin/iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -m limit --limit 1/s --limit-burst 2 -j ACCEPT</p>
<p> </p>
<p>進行此操作後,對正常的用戶而言無任何感覺上的差異,而並發的SYN請求量下降了不少,服務響應基本正常了。</p>
<p> </p>
<p><font color="darkred">(5)封鎖IP網段</font><br>對於某些單獨IP的DOS攻擊,封ip簡單有效,方法也非常容易,但是如果IP是偽造的,效果就有限了:</p>
<p>/sbin/iptables -A INPUT -s a.b.c.d -j REJECT</p>
<p> </p>
<p>以上第(1)~(4)點都只能當下有效...系統重開機就不見囉...如果要每次重開機都生效,就要寫入 /etc/sysctl.conf 檔,在這個檔的最下面加上</p>
<p>[quote]</p>
<p><br>############# 預防 Syn_RECV #############</p>
<p>net.ipv4.tcp_syn_retries = 2<br>net.ipv4.tcp_synack_retries = 2<br>net.ipv4.tcp_max_syn_backlog = 2048</p>
<p> </p>
<p>############# 預防大量 Time_Wait #############</p>
<p>net.ipv4.tcp_tw_reuse = 1<br>net.ipv4.tcp_tw_recycle = 1<br>net.ipv4.ip_local_port_range = 5000 65000</p>
<p># Decrease the time default value for tcp_fin_timeout connection<br>net.ipv4.tcp_fin_timeout = 30<br># Decrease the time default value for tcp_keepalive_time connection<br>net.ipv4.tcp_keepalive_time = 300<br># 探測次數<br>net.ipv4.tcp_keepalive_probes=2<br># 探測間隔秒數<br>net.ipv4.tcp_keepalive_intvl=2</p>
<p>[/quote]</p>
<p> </p>
<p>最後執行指令生效 </p>
<p># sysctl -p</p>
<p> </p>
<p>這樣就可以囉~~</p><p><br></p><p>參考網站:</p><p>http://blog.xuite.net/huenlil/note/9584716<br>http://www.sphinxsearch.org/archives/10<br>http://www.lalulalu.com/thread-778572-1-1.html<br></p>