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
首先說一下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連接數已經下來了