linux下如何防SYN***

今天早上一到公司登錄公司官網的時候感覺挺慢,登錄服務器查看官網訪問情況:

  [root@web ~]# netstat -anp |awk '{print $6}'|sort|uniq -c |sort -rn

  172 ESTABLISHED

  59 CONNECTED

  589 SYN_RECV

  15 STREAM

  SYN居然這麼高,繼續追查是那些ip發出的SYN:

  [root@tweb ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

  570 x.x.x.x

  (ip 就不寫出了,是山東棗莊聯通的一個ip),只是這一個ip就發出了這麼多的syn請求連接,本來我們web服務器的併發數不是很高,這樣一來正常的用戶請 求得不到相應,頁面無法打開。因爲硬件防火牆歸集團IT部管理,我沒有權限,所以只能在本地服務器上做些措施對SYN***進行部分減緩。

 

 

SYN的***原理:

  在TCP/IP協議中,TCP協議提供可靠的連接服務,採用三次握手建立一個連接。

  第一次握手:建立連接時,客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;

  第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

  第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。 完成三次握手,客戶端與服務器開始傳送數據.

 

 

如果用戶與服務器發起連接請求只進行到第二次握手而不再響應服務器,服務器就會不停地等待用戶的確認,如果過多這樣的連接就會把服務器端的連接隊列佔滿就會導致正常的用戶無法建立連接。所以我們直接從SYN的連接上進行如下改動:

 

  查看linux默認的syn配置:

 [root@web ~]# sysctl -a | grep _syn

  net.ipv4.tcp_max_syn_backlog = 1024

  net.ipv4.tcp_syncookies = 1

  net.ipv4.tcp_synack_retries = 5

  net.ipv4.tcp_syn_retries = 5

 

 tcp_max_syn_backlog 是SYN隊列的長度,加大SYN隊列長度可以容納更多等待連接的網絡連接數。tcp_syncookies是一個開關,是否打開SYN Cookie 功能,該功能可以防止部分SYN***。tcp_synack_retries和tcp_syn_retries定義SYN 的重試連接次數,將默認的參數減小來控制SYN連接次數的儘量少。

  以下是我修改後的參數,可以根據自己服務器的實際情況進行修改:

 [root@web ~]# more /etc/rc.d/rc.local

  #!/bin/sh

  # This script will be executed *after* all the other init scripts.

  # You can put your own initialization stuff in here if you don't

  # want to do the full Sys V style init stuff.

  touch /var/lock/subsys/local

  ulimit -HSn 65535

  /usr/local/apache2/bin/apachectl start

  #####

  sysctl -w net.ipv4.tcp_max_syn_backlog=2048

  sysctl -w net.ipv4.tcp_syncookies=1

  sysctl -w net.ipv4.tcp_synack_retries=3

  sysctl -w net.ipv4.tcp_syn_retries=3

  爲了不重啓服務器而使配置立即生效,可以執行

  #sysctl -w net.ipv4.tcp_max_syn_backlog=2048

  #sysctl -w net.ipv4.tcp_syncookies=1

  #sysctl -w net.ipv4.tcp_synack_retries=3

  #sysctl -w net.ipv4.tcp_syn_retries=3

  也有的人喜歡用訪問控制列表來防止SYN的***,在一定程度上減緩了syn的***:

  Syn 洪水***

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

  --limit 1/s 限制syn併發數每秒1次

  防端口掃描

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

  死亡之ping

  # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

  #>iptables-save >/etc/sysconfig/iptables

  進行查看,#iptables -L

  ACCEPT tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1/sec burst 5

  ACCEPT tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/RST limit: avg 1/sec burst 5

  ACCEPT icmp -- anywhere anywhere icmp echo-request limit: avg 1/sec burst 5

  再次進行查看syn連接:

  [root@web ~]# netstat -an | grep SYN | awk '{print $5}' | awk -F: '{print $1}' | sort | uniq -c | sort -nr | more

  20 10.92.10.220

  1 125.43.36.199

  明顯SYN連接數已經下來了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章