[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?就不寫(xiě)出了,是山東棗莊聯(lián)通的一個(gè)ip),只是這一個(gè)ip就發(fā)出了這么多的syn請(qǐng)求連接,本來(lái)我們web服務(wù)器的并發(fā)數(shù)不是很高,這樣一來(lái)正常的用戶請(qǐng)求得不到相應(yīng),頁(yè)面無(wú)法打開(kāi)。因?yàn)橛布阑饓w集團(tuán)IT部管理,我沒(méi)有權(quán)限,所以只能在本地服務(wù)器上做些措施對(duì)SYN攻擊進(jìn)行部分減緩。
首先說(shuō)一下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ù)器開(kāi)始傳送數(shù)據(jù).
如果用戶與服務(wù)器發(fā)起連接請(qǐng)求只進(jìn)行到第二次握手而不再響應(yīng)服務(wù)器,服務(wù)器就會(huì)不停地等待用戶的確認(rèn),如果過(guò)多這樣的連接就會(huì)把服務(wù)器端的連接隊(duì)列占滿就會(huì)導(dǎo)致正常的用戶無(wú)法建立連接。所以我們直接從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ì)列的長(zhǎng)度,加大SYN隊(duì)列長(zhǎng)度可以容納更多等待連接的網(wǎng)絡(luò)連接數(shù)。tcp_syncookies是一個(gè)開(kāi)關(guān),是否打開(kāi)SYN?Cookie?功能,該功能可以防止部分SYN攻擊。tcp_synack_retries和tcp_syn_retries定義SYN?的重試連接次數(shù),將默認(rèn)的參數(shù)減小來(lái)控制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?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
為了不重啟服務(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
也有的人喜歡用訪問(wèn)控制列表來(lái)防止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?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
再次進(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