今天早上一到公司登錄公司官網(wǎng)的時(shí)候感覺挺慢,登錄服務(wù)器查看官網(wǎng)訪問情況:
[root@web ~]# netstat -anp |awk {print $6}|sort|uniq -c |sort -rn
172 ESTABLISHED
59 CONNECTED
589 SYN_RECV
15 STREAM
SYN居然這么高,繼續(xù)追查是那些ip發(fā)出的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就不寫出了,是山東棗莊聯(lián)通的一個(gè)ip),只是這一個(gè)ip就發(fā)出了這么多的syn請(qǐng)求連接,本來我們web服務(wù)器的并發(fā)數(shù)不是很高,這樣一來正常的用戶請(qǐng)求得不到相應(yīng),頁面無法打開。因?yàn)橛布阑饓w集團(tuán)IT部管理,我沒有權(quán)限,所以只能在本地服務(wù)器上做些措施對(duì)SYN攻擊進(jìn)行部分減緩。
首先說一下SYN的攻擊原理:
在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。
第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。 完成三次握手,客戶端與服務(wù)器開始傳送數(shù)據(jù).
如果用戶與服務(wù)器發(fā)起連接請(qǐng)求只進(jìn)行到第二次握手而不再響應(yīng)服務(wù)器,服務(wù)器就會(huì)不停地等待用戶的確認(rèn),如果過多這樣的連接就會(huì)把服務(wù)器端的連接隊(duì)列占滿就會(huì)導(dǎo)致正常的用戶無法建立連接。所以我們直接從SYN的連接上進(jìn)行如下改動(dòng):
查看linux默認(rèn)的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隊(duì)列的長度(計(jì)算機(jī)基礎(chǔ)知識(shí)),加大SYN隊(duì)列長度可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。tcp_syncookies是一個(gè)開關(guān),是否打開SYN Cookie 功能,該功能可以防止部分SYN攻擊。tcp_synack_retries和tcp_syn_retries定義SYN 的重試連接次數(shù),將默認(rèn)的參數(shù)減小來控制SYN連接次數(shù)的盡量少。
以下是我修改后的參數(shù),可以根據(jù)自己服務(wù)器的實(shí)際情況進(jìn)行修改:
[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
為了不重啟服務(wù)器而使配置立即生效,可以執(zhí)行
#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并發(fā)數(shù)每秒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
進(jìn)行查看,#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
再次進(jìn)行查看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連接數(shù)已經(jīng)下來了。
下一條:不能正常上網(wǎng)-