- 相關(guān)推薦
TCP洪水攻擊SYN Flood的診斷和處理
SYN Flood是當(dāng)前最流行的DoS(拒絕服務(wù)攻擊)與DDoS(分布式拒絕服務(wù)攻擊)的方式之一,這是一種利用TCP協(xié)議缺陷,發(fā)送大量偽造的TCP連接請(qǐng)求,常用假冒的IP或IP號(hào)段發(fā)來(lái)海量的請(qǐng)求連接的第一個(gè)握手包(SYN包),被攻擊服務(wù)器回應(yīng)第二個(gè)握手包(SYN+ACK包),因?yàn)閷?duì)方是假冒IP,對(duì)方永遠(yuǎn)收不到包且不會(huì)回應(yīng)第三個(gè)握手包。導(dǎo)致被攻擊服務(wù)器保持大量SYN_RECV狀態(tài)的“半連接”,并且會(huì)重試默認(rèn)5次回應(yīng)第二個(gè)握手包,塞滿TCP等待連接隊(duì)列,資源耗盡(CPU滿負(fù)荷或內(nèi)存不足),讓正常的業(yè)務(wù)請(qǐng)求連接不進(jìn)來(lái)。關(guān)于TCP洪水攻擊SYN Flood詳細(xì)的原理,網(wǎng)上有很多介紹,應(yīng)對(duì)辦法也很多,但大部分沒什么效果,這里介紹我們是如何診斷和應(yīng)對(duì)的。
診斷
我們看到業(yè)務(wù)曲線大跌時(shí),檢查機(jī)器和DNS,發(fā)現(xiàn)只是對(duì)外的web機(jī)響應(yīng)慢、CPU負(fù)載高、ssh登陸慢甚至有些機(jī)器登陸不上,檢查系統(tǒng)syslog:
# tail -f /var/log/messages
Apr 18 11:21:56 web5 kernel: possible SYN flooding on port 80. Sending cookies.
檢查連接數(shù)增多,并且SYN_RECV 連接特別多:
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 16855
CLOSE_WAIT 21
SYN_SENT 99
FIN_WAIT1 229
FIN_WAIT2 113
ESTABLISHED 8358
SYN_RECV 48965
CLOSING 3
LAST_ACK 313
根據(jù)經(jīng)驗(yàn),正常時(shí)檢查連接數(shù)如下:
# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 42349
CLOSE_WAIT 1
SYN_SENT 4
FIN_WAIT1 298
FIN_WAIT2 33
ESTABLISHED 12775
SYN_RECV 259
CLOSING 6
LAST_ACK 432
以上就是TCP洪水攻擊的兩大特征。執(zhí)行netstat -na>指定文件,保留罪證。
應(yīng)急處理
根據(jù)netstat查看到的對(duì)方IP特征:
# netstat -na |grep SYN_RECV|more
利用iptables臨時(shí)封掉最大嫌疑攻擊的IP或IP號(hào)段,例如對(duì)方假冒173.*.*.*號(hào)段來(lái)攻擊,短期禁用173.*.*.*這個(gè)大號(hào)段(要確認(rèn)小心不要封掉自己的本地IP了!)
# iptables -A INPUT -s 173.0.0.0/8 -p tcp –dport 80 -j DROP
再分析剛才保留的罪證,分析業(yè)務(wù),用iptables解封正常173.*.*.*號(hào)段內(nèi)正常的ip和子網(wǎng)段。這樣應(yīng)急處理很容易誤傷,甚至可能因?yàn)榉忮e(cuò)了導(dǎo)致ssh登陸不了服務(wù)器,并不是理想方式。
使用F5擋攻擊
應(yīng)急處理畢竟太被動(dòng),因?yàn)楸緳C(jī)房的F5比較空閑,運(yùn)維利用F5來(lái)?yè)豕,采用方式:讓客戶端先和F5三次握手,連接建立之后F5才轉(zhuǎn)發(fā)到后端業(yè)務(wù)服務(wù)器。后來(lái)被攻擊時(shí)F5上看到的現(xiàn)象:
?
1、連接數(shù)比平時(shí)多了500萬(wàn),攻擊停止后恢復(fù)。
2、修改F5上我們業(yè)務(wù)的VS模式后,F(xiàn)5的CPU消耗比平時(shí)多7%,攻擊停止后恢復(fù)。
3、用F5擋效果明顯,后來(lái)因攻擊無(wú)效后,用戶很少來(lái)攻擊了,畢竟攻擊也是有成本的。
調(diào)整系統(tǒng)參數(shù)擋攻擊
沒有F5這種高級(jí)且昂貴的設(shè)備怎么辦?我測(cè)試過(guò)以下參數(shù)組合能明顯減小影響,準(zhǔn)備以后不用F5抗攻擊。
第一個(gè)參數(shù)tcp_synack_retries = 0是關(guān)鍵,表示回應(yīng)第二個(gè)握手包(SYN+ACK包)給客戶端IP后,如果收不到第三次握手包(ACK包)后,不進(jìn)行重試,加快回收“半連接”,不要耗光資源。
不修改這個(gè)參數(shù),模擬攻擊,10秒后被攻擊的80端口即無(wú)法服務(wù),機(jī)器難以ssh登錄; 用命令netstat -na |grep SYN_RECV檢測(cè)“半連接”hold住180秒;
修改這個(gè)參數(shù)為0,再模擬攻擊,持續(xù)10分鐘后被攻擊的80端口都可以服務(wù),響應(yīng)稍慢些而已,只是ssh有時(shí)也登錄不上;檢測(cè)“半連接”只hold住3秒即釋放掉。
修改這個(gè)參數(shù)為0的副作用:網(wǎng)絡(luò)狀況很差時(shí),如果對(duì)方?jīng)]收到第二個(gè)握手包,可能連接服務(wù)器失敗,但對(duì)于一般網(wǎng)站,用戶刷新一次頁(yè)面即可。這些可以在高峰期或網(wǎng)絡(luò)狀況不好時(shí)tcpdump抓包驗(yàn)證下。
根據(jù)以前的抓包經(jīng)驗(yàn),這種情況很少,但為了保險(xiǎn)起見,可以只在被tcp洪水攻擊時(shí)臨時(shí)啟用這個(gè)參數(shù)。
tcp_synack_retries默認(rèn)為5,表示重發(fā)5次,每次等待30~40秒,即“半連接”默認(rèn)hold住大約180秒。詳細(xì)解釋:
The tcp_synack_retries setting tells the kernel how many times to retransmit the SYN,ACK reply to
an SYN request. In other words, this tells the system how many times to try to establish a passive
TCP connection that was started by another host.
This variable takes an integer value, but should under no circumstances be larger than 255 for the
same reasons as for the tcp_syn_retries variable. Each retransmission will take aproximately 30-40
seconds. The default value of the tcp_synack_retries variable is 5, and hence the default timeout
of passive TCP connections is aproximately 180 seconds.
之所以可以把tcp_synack_retries改為0,因?yàn)榭蛻舳诉有tcp_syn_retries參數(shù),默認(rèn)是5,即使服務(wù)器端沒有重發(fā)SYN+ACK包,客戶端也會(huì)重發(fā)SYN握手包。詳細(xì)解釋:
The tcp_syn_retries variable tells the kernel how many times to try to retransmit the initial SYN
packet for an active TCP connection attempt.
This variable takes an integer value, but should not be set higher than 255 since each
retransmission will consume huge amounts of time as well as some amounts of bandwidth. Each
connection retransmission takes aproximately 30-40 seconds. The default setting is 5, which
would lead to an aproximate of 180 seconds delay before the connection times out.
第二個(gè)參數(shù)net.ipv4.tcp_max_syn_backlog = 200000也重要,具體多少數(shù)值受限于內(nèi)存。
以下配置,第一段參數(shù)是最重要的,第二段參數(shù)是輔助的,其余參數(shù)是其他作用的:
# vi /etc/sysctl.conf
使配置生效:
# sysctl -p
注意,以下參數(shù)面對(duì)外網(wǎng)時(shí),不要打開。因?yàn)楦弊饔煤苊黠@,具體原因請(qǐng)google,如果已打開請(qǐng)顯式改為0,然后執(zhí)行sysctl -p關(guān)閉。因?yàn)榻?jīng)過(guò)試驗(yàn),大量TIME_WAIT狀態(tài)的連接對(duì)系統(tǒng)沒太大影響:
為了處理大量連接,還需改大另一個(gè)參數(shù):
# vi /etc/security/limits.conf
在底下添加一行表示允許每個(gè)用戶都最大可打開409600個(gè)文件句柄(包括連接):
* – nofile 409600
參考資料
文件句柄不要超過(guò)系統(tǒng)限制/usr/include/linux/fs.h,相關(guān)鏈接:http://blog.yufeng.info/archives/1380
#define NR_OPEN (1024*1024) /* Absolute upper limit on fd num */
【TCP洪水攻擊SYN Flood的診斷和處理】相關(guān)文章:
服務(wù)器遭受攻擊后的處理流程01-14
網(wǎng)站日志分析診斷和作用03-04
公衛(wèi)執(zhí)業(yè)醫(yī)師考點(diǎn):登革熱診斷標(biāo)準(zhǔn)及處理原則08-22
臨床助理執(zhí)業(yè)醫(yī)師考點(diǎn)速記:血胸的診斷與處理04-01
計(jì)算機(jī)常見的網(wǎng)絡(luò)故障診斷及處理措施03-31
公衛(wèi)執(zhí)業(yè)醫(yī)師考點(diǎn):炭疽診斷標(biāo)準(zhǔn)及處理原則—附錄A03-21