|
在本系列的第一篇文章中,我們介紹了我們客服系統(tǒng)遇到DDoS攻擊的情況,以及我們?yōu)槭裁礇Q定采用自建CDN的方式來解決這個問題的原因。 之后,我們介紹了自建CDN的具體建設(shè)規(guī)劃,主要從以下幾個方面進(jìn)行考量:硬件成本、帶寬成本、架構(gòu)設(shè)計、實際部署。 本文是《自建CDN防御DDoS》系列的第三篇,介紹CDN架構(gòu)的后續(xù)改進(jìn)。后續(xù)改進(jìn)主要包括三個方面:DNS智能解析+輪詢+存活監(jiān)測,集中式日志分析+攻擊防御,以及多節(jié)點CDN的快速部署+圖形化管理。 1、DNS智能解析+輪詢+存活監(jiān)測A. 部署智能DNS就近匹配CDN節(jié)點我們自建CDN的另外一個目的是做訪問路徑優(yōu)化,因為這些加速節(jié)點是我們精心挑選之后部署的,無論是帶寬質(zhì)量、機房環(huán)境、安全風(fēng)險等指標(biāo)均能滿足可靠可控的需求。 因此當(dāng)部署完多個CDN節(jié)點后,為使這些節(jié)點協(xié)同運作,同時優(yōu)化用戶的訪問路徑,我們可以通過配置Bind的View視圖把訪客IP指定到相應(yīng)的CDN節(jié)點,使得訪客能夠根據(jù)自己所在的區(qū)域和線路類型,就近從CDN節(jié)點上獲取頁面內(nèi)容,從而優(yōu)化訪客的路由。 B. DNS自動輪詢+故障監(jiān)測我們可以利用DNS輪詢來為網(wǎng)站進(jìn)行分流負(fù)載。如果條件充裕,可以在各個大區(qū)內(nèi)部署冗余的CDN節(jié)點,這樣既能緩解某個區(qū)域內(nèi)單一節(jié)點的負(fù)載,同時能為這個節(jié)點作互備,當(dāng)這個區(qū)內(nèi)的CDN節(jié)點因故障失效之后,調(diào)度機制能在最快時間內(nèi)將故障節(jié)點的流量牽引至當(dāng)前可用節(jié)點,實現(xiàn)動態(tài)的剔除該節(jié)點,從而不影響訪客的正常請求。 實現(xiàn)DNS輪詢只需要在Bind中為同一域名添加多個A記錄即可。Bind View視圖功能和節(jié)點存活檢查的相關(guān)技術(shù)已經(jīng)相當(dāng)成熟,相應(yīng)的技術(shù)文檔也比較多了,可以參考《使用Bind構(gòu)建高可用智能DNS服務(wù)器》,這里我們就不再累述。 C. Bind View IP分揀腳本我們目前編寫的腳本可以幫忙快速分揀出電信、聯(lián)通的線路還包括華東、華南、華北和西部四個地區(qū)的IP范圍,有興趣的同學(xué)可以試用一下。 # 這個腳本是從Apnic下載屬于中國的IP列表,然后把屬于聯(lián)通,電信及其它的IP進(jìn)行歸類
get_apnic(){
FILE=$PWD/ip_apnic
CNC_FILE=$PWD/CNC
CTC_FILE=$PWD/CTC
TMP=/dev/shm/ip.tmp
rm -f $FILE
wget http://ftp./apnic/stats/apnic/delegated-apnic-latest -O $FILE
grep 'apnic|CN|ipv4|' $FILE | cut -f 4,5 -d'|'|sed -e 's/|/ /g' | while read ip cnt
do
echo $ip:$cnt
mask=$(cat << EOF | bc | tail -1
pow=32;
define log2(x) {
if (x<=1) return (pow);
pow--;
return(log2(x/2));
}
log2($cnt)
EOF
)
whois $ip@whois. > $TMP.tmp
sed -n '/^inetnum/,/source/p' $TMP.tmp | awk '(/mnt-/ || /netname/)' > $TMP
NETNAME=`grep ^netname $TMP | sed -e 's/.*: \(.*\)/\1/g' | sed -e 's/-.*//g'|sed 's: ::g'`
egrep -qi "(CNC|UNICOM|WASU|NBIP|CERNET|CHINAGBN|CHINACOMM|FibrLINK|BGCTVNET|DXTNET|CRTC)" $TMP
if [ $? = 0 ];then
echo $ip/$mask >> $CNC_FILE
else
egrep -qi "(CHINATELECOM|CHINANET)" $TMP
if [ $? = 0 ];then
echo $ip/$mask >> $CTC_FILE
else
sed -n '/^route/,/source/p' $TMP.tmp | awk '(/mnt-/ || /netname/)' > $TMP
egrep -qi "(CNC|UNICOM|WASU|NBIP|CERNET|CHINAGBN|CHINACOMM|FibrLINK|BGCTVNET|DXTNET|CRTC)" $TMP
if [ $? = 0 ];then
echo $ip/$mask >> $CNC_FILE
else
egrep -qi "(CHINATELECOM|CHINANET)" $TMP
if [ $? = 0 ];then
echo $ip/$mask >> $CTC_FILE
else
echo "$ip/$mask $NETNAME" >> $PWD/OTHER
fi
fi
fi
fi
done
rm -rf $TMP $TMP.tmp
}
# 從whois信息中提取address登記人地址信息,從而判斷在哪個省份
gen_zone(){
FILE=$2
[ ! -s $FILE ] && echo "$FILE file not found." && exit 0
rm -rf $FILE.zone
while read LINE;do
LINE=`echo "$LINE"|awk '{print $1}'`
echo "$LINE @ "
echo -n "$LINE @ " >> $FILE.zone
whois $LINE|egrep "address"|xargs echo >> $FILE.zone
sleep $TIME
done < $FILE
}
# 分別挑選出華東,華南,華北,西部四大區(qū)的IP地址列表
gen_area(){
FILE=$2
[ ! -s $FILE.zone ] && echo "$FILE.zone file not found." && exit 0
STRING="none"
echo $FILE|egrep -i -q "cnc"
[ $? = 0 ] && STRING="cnc"
echo $FILE|egrep -i -q "ctc"
[ $? = 0 ] && STRING="ctc"
echo $FILE|egrep -i -q "other"
[ $? = 0 ] && STRING="other"
[ $STRING = "none" ] && echo "Not cnc or ctc file" && exit 0
cp -a $FILE.zone $FILE.tmp
egrep -i "$HD_STR" $FILE.tmp > $HD_FILE.$STRING
egrep -i -v "$HD_STR" $FILE.tmp > aaa
mv aaa $FILE.tmp
egrep -i "$HN_STR" $FILE.tmp > $HN_FILE.$STRING
egrep -i -v "$HN_STR" $FILE.tmp > aaa
mv aaa $FILE.tmp
egrep -i "$XI_STR" $FILE.tmp > $XI_FILE.$STRING
egrep -i -v "$XI_STR" $FILE.tmp > aaa
mv aaa $FILE.tmp
egrep -i "$HB_STR" $FILE.tmp > $HB_FILE.$STRING
egrep -i -v "$HB_STR" $FILE.tmp > aaa
mv aaa $FILE.tmp
grep ^[0-9] $FILE.tmp |awk '{print $1}' >> $HD_FILE.$STRING
sed -r -i 's#@.*##g' *.$STRING
rm -rf $FILE.tmp
}
具體腳本可以通過https://github.com/shaohaiyang/easyMyDNS下載獲取。 2、集中式日志分析+攻擊防御CDN作為網(wǎng)站的前置節(jié)點,實時記錄著所有訪客的訪問行為。可以說,日志當(dāng)中蘊藏了豐富的奧秘。據(jù)了解,大部分網(wǎng)站并沒有對其訪問日志進(jìn)行很好的利用,僅僅是對其做了歸檔備份。如能利用好這些訪問日志,并對其進(jìn)行深度的分析和挖掘,對于了解網(wǎng)站的運行狀況、感知業(yè)務(wù)層面的一些異常活動,能夠帶來極大的幫助。尤其是當(dāng)面臨DDoS攻擊時,能夠提供出足夠的依據(jù)來區(qū)分惡意的IP。 區(qū)分惡意攻擊的主要依據(jù)類型有:
目前我們對HAProxy的日志分析僅作用于單節(jié)點,我們在實際應(yīng)用場景中,是基于單位時間段的日志截斷,把日志寫入到/dev/shm內(nèi)存中,使用了通用的shell,awk,sed語言來做行為分析,這樣做的好處是避免了磁盤IO開銷的短板。缺點是,日志分析行為比較粗糙,分析效率有待于提高。 A. 多節(jié)點CDN集中式日志分析+攻擊阻斷架構(gòu)由于作用于單節(jié)點的日志分析架構(gòu)存在較大的局限性,主要體現(xiàn)為:
因此在多節(jié)點CDN架構(gòu)下,如要及時感知到DDoS攻擊并對其進(jìn)行阻斷,而且還要考慮盡可能少的開銷用節(jié)點系統(tǒng)資源,需要站在全局層面來集中分析攻擊行為,并且針對分析后的結(jié)果展開多節(jié)點協(xié)同處理防御/阻斷規(guī)則,來應(yīng)對DDoS攻擊。 對難點進(jìn)行梳理后,我們發(fā)現(xiàn)要實現(xiàn)這樣的需求主要解決三個問題:
具體架構(gòu):
a. HAProxy/Nginx作為防御攻擊系統(tǒng)的載體我們在上一篇文章中已經(jīng)提到過,在CDN節(jié)點端,我們建議用HAProxy或Nginx作為防御性的反向代理,能夠靈活的制定防御攻擊的ACL過濾規(guī)則,并能夠以熱加載的方式實時生效。 b. 日志存儲解決思路這個環(huán)節(jié)主要包含兩個部分,一是由節(jié)點到LogServer的日志傳輸,另一個是LogServer這一端的日志集中存儲。由CDN節(jié)點產(chǎn)生的日志可以通過本地寫入PIPE + Rsyslog UDP傳輸?shù)姆绞綄⑷罩緟R總到專用的LogServer,LogServer收到日志之后,按照域名分類的方式將日志存儲在一起。 對于海量日志的存儲可以用Hadoop作為載體,利用Map/Reduce算法分解日志,提升篩選效率。對此有興趣深入了解的同學(xué)可以參考開源日志系統(tǒng)比較。 c. 協(xié)同運作的攻擊阻斷機制這里則是最為關(guān)鍵的一個環(huán)節(jié):我們整個架構(gòu)的重點在于“抗攻擊”,而我們經(jīng)過前面的分析,針對多節(jié)點CDN的攻擊防御,最為高效的做法是:由專用的LogServer進(jìn)行集中式分析運算,并將運算結(jié)果生成安全防護(hù)策略,實時對接到各個CDN節(jié)點,協(xié)同處理防御/阻斷規(guī)則,以此來應(yīng)對DDoS攻擊。那么這里將會產(chǎn)生以下幾個主要問題:
對此我們的設(shè)計思路如下: 當(dāng)日志完整的存儲在LogServer之后,使用分析腳本對其進(jìn)行特征匹配,提取出惡意攻擊的來源IP地址,將這些IP地址生成相應(yīng)的HAProxy/Iptables的阻斷規(guī)則,并下發(fā)到全局的CDN節(jié)點。這里可以通過兩種方式來進(jìn)行:
B. 該架構(gòu)的優(yōu)勢
3、多節(jié)點CDN的快速部署與圖形化管理管理和運維一套CDN系統(tǒng)對于任何組織來講都是個很大的挑戰(zhàn),尤其是部署了多區(qū)域多線路的CDN。需要隨時掌控CDN加速的節(jié)點列表、需要定義哪些網(wǎng)頁元素可以作為緩存、需要做什么樣的ACL策略等等,這些都需要專業(yè)的系統(tǒng)運維人員來配置實現(xiàn)。 通常較為成熟的做法是通過主控機,預(yù)先配置好CDN規(guī)則 ,通過Rsync把配置文件推送到各個CDN節(jié)點中去。很顯然,這種方案雖然效率高,但是對CDN部署者具有一定的門檻,加上服務(wù)器的權(quán)限控制要求非常嚴(yán)格,也不利于面向其它工程師做推廣。 偶然的機會,我們有幸在黑客馬拉松大賽初識了OpenCDN這個獲獎作品,通過互補整合,更是彌補了我們這套CDN上的前端管理的不足。因此,可以跟OpenCDN這個項目做很好的深度整合,降低運維和管理門檻,造福于更多的IT運維的用戶。 ![]() A. OpenCDN主要解決什么問題?OpenCDN是一套快速部署CDN加速的工具,針對專門提供CDN加速服務(wù)的企業(yè)或?qū)Χ喙?jié)點CDN加速有需求的企業(yè)提供一套便捷的管理平臺,可對每一個節(jié)點的狀態(tài)、系統(tǒng)負(fù)載進(jìn)行實時監(jiān)測與統(tǒng)一管理。OpenCDN預(yù)制了多套常用緩存規(guī)則,支持多種復(fù)雜的CDN緩存場景。正如其名,OpenCDN是免費開源的。 B. OpenCDN當(dāng)前是怎么做的?OpenCDN的主體架構(gòu)可分為CDN管理中心和CDN加速節(jié)點。CDN加速節(jié)點可以有很多個,在數(shù)量上沒有任何限制。用戶可以通過OpenCDN快速的部署多個CDN加速節(jié)點,并通過一個管理中心進(jìn)行集中式的管理。 因此OpenCDN在這里主要做了兩部分工作,一是將CDN節(jié)點的部署過程一鍵化,二是通過WebConsole工具將這些CDN加速節(jié)點統(tǒng)一的管理起來。 ![]() C. OpenCDN未來要做出什么樣?達(dá)到怎么樣的效果?OpenCDN將致力于為多節(jié)點CDN加速有需求的網(wǎng)站,提供一套便捷的CDN加速管理平臺,能夠按需自建CDN節(jié)點,靈活控制成本,提高網(wǎng)站響應(yīng)速度,輕松應(yīng)對突發(fā)流量。 后續(xù)我們將在此基礎(chǔ)上整合加入上述CDN防御大流量DDoS攻擊的組合方案。我們對這套平臺做了開源,希望有更多有需要的人能夠以最低的成本獲取它,同時也希望通過更多的開發(fā)者加入進(jìn)來一起完善它。所謂人人為我,我為人人。 D. OpenCDN進(jìn)行自建CDN的優(yōu)勢
OpenCDN適用于哪些用戶?OpenCDN目前來看,比較適用于行業(yè)競爭比較大的網(wǎng)站: 游戲站、垂直電商、社區(qū)論壇、在線視頻、聊天。 這些網(wǎng)站的共性特點:流量中型規(guī)模,競爭激烈,經(jīng)常被攻擊,行業(yè)利潤高,愿意花錢。 總結(jié)至此,《自建CDN防御DDoS》系列便告一段落。如果有任何疑問,歡迎跟我們交流、探討。 作者簡介邵海楊(個人頁面),來自杭州Linux用戶組。網(wǎng)名“海洋之心”,系統(tǒng)架構(gòu)師,業(yè)余撰稿人,致力于開源軟件及前沿科技的研究和探索。 張磊(微博,博客),來自杭州谷歌開發(fā)者社區(qū)。專注于信息安全技術(shù)領(lǐng)域,曾主導(dǎo)多項銀行/證券行業(yè)網(wǎng)站安全測試和入侵取證分析項目,為四大銀行提供安全防護(hù)技術(shù)支持。目前創(chuàng)業(yè)做互聯(lián)網(wǎng)安全防護(hù)。 相關(guān)閱讀自建CDN防御DDoS(1):知己知彼,建設(shè)持久防線 |
|
|