今天早上一到公司登錄公司官網的時候感覺挺慢,登錄服務器查看官網訪問情況:
[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 dont
# 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 anywheretcp flags:FIN,SYN,RST,ACK/SYN limit: avg 1/sec burst 5
ACCEPT tcp–anywhere anywheretcp flags:FIN,SYN,RST,ACK/RST limit: avg 1/sec burst 5
ACCEPT icmp –anywhere anywhereicmp 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連接數已經下來了。
下一條:不能正常上網-