星期六我們一位客戶受到攻擊,我們的網(wǎng)絡(luò)監(jiān)測(cè)顯示有連續(xù)6小時(shí)的巨大異常流量,我們立即聯(lián)系了客戶,沒(méi)有得到回應(yīng),我們修改和限制了客戶的 VPS,使得個(gè)別 VPS 受攻擊不會(huì)對(duì)整個(gè)服務(wù)器和其他 VPS 用戶造成任何影響,我們一直保持這個(gè) VPS 為開(kāi)通狀態(tài)(盡管一直受攻擊),攻擊又持續(xù)了24小時(shí),星期天攻擊仍在繼續(xù),我們?nèi)虩o(wú)可忍,但是仍然無(wú)法聯(lián)系到客戶,我們向客戶網(wǎng)站的另一負(fù)責(zé)人詢問(wèn)是否需要我們介入來(lái)幫助解決,這位負(fù)責(zé)人答應(yīng)后我們立即投入到與 DDoS 的戰(zhàn)斗中(我們動(dòng)態(tài)掃描屏蔽壞 IP,現(xiàn)在客戶網(wǎng)站已恢復(fù)。整個(gè)過(guò)程很有意思,以后有時(shí)間再寫(xiě)一篇博客來(lái)描述)。登錄到客戶 VPS 第一件事情就是查當(dāng)前連接和 IP,來(lái)自中國(guó)的大量 IP 不斷侵占80端口,典型的 DDos. 所以第一件事是切斷攻擊源,既然攻擊只攻80端口,那有很多辦法可以切斷,直接關(guān)閉網(wǎng)站服務(wù)器、直接用防火墻/iptables 切斷80端口或者關(guān)閉所有連接、把 VPS 網(wǎng)絡(luò)關(guān)掉、換一個(gè) IP,⋯,等等。因?yàn)楣粼丛趪?guó)內(nèi),所以 VPSee 決定切斷來(lái)自國(guó)內(nèi)的所有訪問(wèn),這樣看上去網(wǎng)站好像是被墻了而不是被攻擊了,有助于維護(hù)客戶網(wǎng)站的光輝形象。那么如何屏蔽來(lái)自某個(gè)特定國(guó)家的 IP 呢?
方法很容易,先到 IPdeny 下載以國(guó)家代碼編制好的 IP 地址列表,比如下載 cn.zone:
# wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone
有了國(guó)家的所有 IP 地址,要想屏蔽這些 IP 就很容易了,直接寫(xiě)個(gè)腳本逐行讀取 cn.zone 文件并加入到 iptables 中:
#!/bin/bash # Block traffic from a specific country # written by vpsee.com COUNTRY = "cn" IPTABLES = /sbin/iptables EGREP = /bin/egrep if [ "$(id -u)" != "0" ]; then echo "you must be root" 1>&2 exit 1 fi resetrules() { $IPTABLES -F $IPTABLES -t nat -F $IPTABLES -t mangle -F $IPTABLES -X } resetrules for c in $COUNTRY do country_file = $c.zone IPS = $($EGREP -v "^#|^$" $country_file) for ip in $IPS do echo "blocking $ip" $IPTABLES -A INPUT -s $ip -j DROP done done exit 0
好 IP 和壞 IP 都被屏蔽掉了,這種辦法當(dāng)然不高明,屏蔽 IP 也沒(méi)有解決被攻擊的問(wèn)題,但是是解決問(wèn)題的第一步,屏蔽了攻擊源以后我們才有帶寬、時(shí)間和心情去檢查 VPS 的安全問(wèn)題。公布一份我們客戶被攻擊的網(wǎng)絡(luò)流量圖,在18點(diǎn)到0點(diǎn)所有帶寬都被攻擊流量占用,這時(shí)候客戶無(wú)法登錄 VPS,訪問(wèn)者也無(wú)法訪問(wèn)網(wǎng)站: