日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

自建CDN防御DDoS(3):架構(gòu)的后續(xù)改進(jìn)

 icecity1306 2014-09-11

本系列的第一篇文章中,我們介紹了我們客服系統(tǒng)遇到DDoS攻擊的情況,以及我們?yōu)槭裁礇Q定采用自建CDN的方式來(lái)解決這個(gè)問題的原因。

之后,我們介紹了自建CDN的具體建設(shè)規(guī)劃,主要從以下幾個(gè)方面進(jìn)行考量:硬件成本、帶寬成本、架構(gòu)設(shè)計(jì)、實(shí)際部署。

本文是《自建CDN防御DDoS》系列的第三篇,介紹CDN架構(gòu)的后續(xù)改進(jìn)。后續(xù)改進(jìn)主要包括三個(gè)方面:DNS智能解析+輪詢+存活監(jiān)測(cè),集中式日志分析+攻擊防御,以及多節(jié)點(diǎn)CDN的快速部署+圖形化管理。

1、DNS智能解析+輪詢+存活監(jiān)測(cè)

A. 部署智能DNS就近匹配CDN節(jié)點(diǎn)

我們自建CDN的另外一個(gè)目的是做訪問路徑優(yōu)化,因?yàn)檫@些加速節(jié)點(diǎn)是我們精心挑選之后部署的,無(wú)論是帶寬質(zhì)量、機(jī)房環(huán)境、安全風(fēng)險(xiǎn)等指標(biāo)均能滿足可靠可控的需求。

因此當(dāng)部署完多個(gè)CDN節(jié)點(diǎn)后,為使這些節(jié)點(diǎn)協(xié)同運(yùn)作,同時(shí)優(yōu)化用戶的訪問路徑,我們可以通過配置Bind的View視圖把訪客IP指定到相應(yīng)的CDN節(jié)點(diǎn),使得訪客能夠根據(jù)自己所在的區(qū)域和線路類型,就近從CDN節(jié)點(diǎn)上獲取頁(yè)面內(nèi)容,從而優(yōu)化訪客的路由。

B. DNS自動(dòng)輪詢+故障監(jiān)測(cè)

我們可以利用DNS輪詢來(lái)為網(wǎng)站進(jìn)行分流負(fù)載。如果條件充裕,可以在各個(gè)大區(qū)內(nèi)部署冗余的CDN節(jié)點(diǎn),這樣既能緩解某個(gè)區(qū)域內(nèi)單一節(jié)點(diǎn)的負(fù)載,同時(shí)能為這個(gè)節(jié)點(diǎn)作互備,當(dāng)這個(gè)區(qū)內(nèi)的CDN節(jié)點(diǎn)因故障失效之后,調(diào)度機(jī)制能在最快時(shí)間內(nèi)將故障節(jié)點(diǎn)的流量牽引至當(dāng)前可用節(jié)點(diǎn),實(shí)現(xiàn)動(dòng)態(tài)的剔除該節(jié)點(diǎn),從而不影響訪客的正常請(qǐng)求。

實(shí)現(xiàn)DNS輪詢只需要在Bind中為同一域名添加多個(gè)A記錄即可。Bind View視圖功能和節(jié)點(diǎn)存活檢查的相關(guān)技術(shù)已經(jīng)相當(dāng)成熟,相應(yīng)的技術(shù)文檔也比較多了,可以參考《使用Bind構(gòu)建高可用智能DNS服務(wù)器》,這里我們就不再累述。

C. Bind View IP分揀腳本

我們目前編寫的腳本可以幫忙快速分揀出電信、聯(lián)通的線路還包括華東、華南、華北和西部四個(gè)地區(qū)的IP范圍,有興趣的同學(xué)可以試用一下。

#  這個(gè)腳本是從Apnic下載屬于中國(guó)的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登記人地址信息,從而判斷在哪個(gè)省份  
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é)點(diǎn),實(shí)時(shí)記錄著所有訪客的訪問行為。可以說(shuō),日志當(dāng)中蘊(yùn)藏了豐富的奧秘。據(jù)了解,大部分網(wǎng)站并沒有對(duì)其訪問日志進(jìn)行很好的利用,僅僅是對(duì)其做了歸檔備份。如能利用好這些訪問日志,并對(duì)其進(jìn)行深度的分析和挖掘,對(duì)于了解網(wǎng)站的運(yùn)行狀況、感知業(yè)務(wù)層面的一些異?;顒?dòng),能夠帶來(lái)極大的幫助。尤其是當(dāng)面臨DDoS攻擊時(shí),能夠提供出足夠的依據(jù)來(lái)區(qū)分惡意的IP。

區(qū)分惡意攻擊的主要依據(jù)類型有:

  • 某個(gè)IP發(fā)起大量的并發(fā)請(qǐng)求
  • 大量連續(xù)的IP段發(fā)起請(qǐng)求
  • 大量無(wú)規(guī)則的IP發(fā)起請(qǐng)求

目前我們對(duì)HAProxy的日志分析僅作用于單節(jié)點(diǎn),我們?cè)趯?shí)際應(yīng)用場(chǎng)景中,是基于單位時(shí)間段的日志截?cái)?,把日志寫入?dev/shm內(nèi)存中,使用了通用的shell,awk,sed語(yǔ)言來(lái)做行為分析,這樣做的好處是避免了磁盤IO開銷的短板。缺點(diǎn)是,日志分析行為比較粗糙,分析效率有待于提高。

A. 多節(jié)點(diǎn)CDN集中式日志分析+攻擊阻斷架構(gòu)

由于作用于單節(jié)點(diǎn)的日志分析架構(gòu)存在較大的局限性,主要體現(xiàn)為:

  • 日志散落在各個(gè)節(jié)點(diǎn),分析時(shí)忽略了其他節(jié)點(diǎn)的數(shù)據(jù),無(wú)法獲悉全局的情況
  • 當(dāng)防御規(guī)則啟用后,僅作用于單節(jié)點(diǎn),其他節(jié)點(diǎn)依舊面臨該特性的攻擊
  • 單節(jié)點(diǎn)的實(shí)時(shí)分析當(dāng)面臨攻擊時(shí),會(huì)占用較大系統(tǒng)資源

因此在多節(jié)點(diǎn)CDN架構(gòu)下,如要及時(shí)感知到DDoS攻擊并對(duì)其進(jìn)行阻斷,而且還要考慮盡可能少的開銷用節(jié)點(diǎn)系統(tǒng)資源,需要站在全局層面來(lái)集中分析攻擊行為,并且針對(duì)分析后的結(jié)果展開多節(jié)點(diǎn)協(xié)同處理防御/阻斷規(guī)則,來(lái)應(yīng)對(duì)DDoS攻擊。

對(duì)難點(diǎn)進(jìn)行梳理后,我們發(fā)現(xiàn)要實(shí)現(xiàn)這樣的需求主要解決三個(gè)問題:

  1. 匯集多個(gè)CDN節(jié)點(diǎn)的海量日志存儲(chǔ)
  2. 針對(duì)海量日志的集中式風(fēng)險(xiǎn)分析
  3. 協(xié)同運(yùn)作的攻擊阻斷機(jī)制

具體架構(gòu):

  • Nginx/HAProxy作為防御攻擊系統(tǒng)的終端
  • 節(jié)點(diǎn)產(chǎn)生的訪問日志通過syslog傳送到專用的LogServer進(jìn)行匯集
  • 專用的LogServer作為日志的存儲(chǔ)和風(fēng)險(xiǎn)分析、阻斷規(guī)則推送

a. HAProxy/Nginx作為防御攻擊系統(tǒng)的載體

我們?cè)?a href="http://www./cn/articles/anti-ddos-cdn-2" style="text-decoration: none; color: rgb(40, 106, 178); outline: none !important; margin: 0px; border: 0px; padding: 0px;">上一篇文章中已經(jīng)提到過,在CDN節(jié)點(diǎn)端,我們建議用HAProxy或Nginx作為防御性的反向代理,能夠靈活的制定防御攻擊的ACL過濾規(guī)則,并能夠以熱加載的方式實(shí)時(shí)生效。

b. 日志存儲(chǔ)解決思路

這個(gè)環(huán)節(jié)主要包含兩個(gè)部分,一是由節(jié)點(diǎn)到LogServer的日志傳輸,另一個(gè)是LogServer這一端的日志集中存儲(chǔ)。由CDN節(jié)點(diǎn)產(chǎn)生的日志可以通過本地寫入PIPE + Rsyslog UDP傳輸?shù)姆绞綄⑷罩緟R總到專用的LogServer,LogServer收到日志之后,按照域名分類的方式將日志存儲(chǔ)在一起。

對(duì)于海量日志的存儲(chǔ)可以用Hadoop作為載體,利用Map/Reduce算法分解日志,提升篩選效率。對(duì)此有興趣深入了解的同學(xué)可以參考開源日志系統(tǒng)比較

c. 協(xié)同運(yùn)作的攻擊阻斷機(jī)制

這里則是最為關(guān)鍵的一個(gè)環(huán)節(jié):我們整個(gè)架構(gòu)的重點(diǎn)在于“抗攻擊”,而我們經(jīng)過前面的分析,針對(duì)多節(jié)點(diǎn)CDN的攻擊防御,最為高效的做法是:由專用的LogServer進(jìn)行集中式分析運(yùn)算,并將運(yùn)算結(jié)果生成安全防護(hù)策略,實(shí)時(shí)對(duì)接到各個(gè)CDN節(jié)點(diǎn),協(xié)同處理防御/阻斷規(guī)則,以此來(lái)應(yīng)對(duì)DDoS攻擊。那么這里將會(huì)產(chǎn)生以下幾個(gè)主要問題:

  1. 采用什么樣的腳本和規(guī)則來(lái)分析日志
  2. 分析后的結(jié)果如何形成HAProxy/Iptables的ACL策略
  3. 生成的ACL策略如何作用到全局的CDN節(jié)點(diǎn),并形成聯(lián)動(dòng)

對(duì)此我們的設(shè)計(jì)思路如下:

當(dāng)日志完整的存儲(chǔ)在LogServer之后,使用分析腳本對(duì)其進(jìn)行特征匹配,提取出惡意攻擊的來(lái)源IP地址,將這些IP地址生成相應(yīng)的HAProxy/Iptables的阻斷規(guī)則,并下發(fā)到全局的CDN節(jié)點(diǎn)。這里可以通過兩種方式來(lái)進(jìn)行:

  1. 通過開發(fā)專用的接口與Iptables、Nginx/HAProxy進(jìn)行聯(lián)動(dòng)
  2. 通過統(tǒng)一配置管理工具Puppet推送來(lái)實(shí)現(xiàn),LogServer作為消息的推送端與命令下發(fā)主控端,各個(gè)CDN節(jié)點(diǎn)作為策略的接收端與生效命令執(zhí)行端,在接收完防護(hù)策略后,自動(dòng)加入ACL列表,執(zhí)行熱加載的命令

B. 該架構(gòu)的優(yōu)勢(shì)

  • 這套架構(gòu)得以實(shí)現(xiàn)之后,系統(tǒng)的橫向擴(kuò)展將變得非常容易,能根據(jù)節(jié)點(diǎn)的流量/資源負(fù)載情況,動(dòng)態(tài)的添置或下線CDN節(jié)點(diǎn),無(wú)需對(duì)源站點(diǎn)進(jìn)行任何改動(dòng)。
  • 能夠從容的應(yīng)對(duì)DDoS攻擊,在分散攻擊流量的同時(shí),能夠自動(dòng)阻斷攻擊來(lái)源。
  • 并且對(duì)于新的攻擊,只要在某一站點(diǎn)發(fā)現(xiàn)異常,即可快速編制新防護(hù)規(guī)則,將屏蔽措施應(yīng)用到所有加入CDN的站點(diǎn),實(shí)現(xiàn)全局的安全防護(hù)。
  • 將各個(gè)CDN節(jié)點(diǎn)上的日志進(jìn)行匯總收集/分析,能夠獲取到所有用戶詳細(xì)的訪問行為,同時(shí)對(duì)所有的非法訪問行為進(jìn)行均記錄在案,通過編制業(yè)務(wù)安全規(guī)則,可提供事前預(yù)警、事后追蹤。

3、多節(jié)點(diǎn)CDN的快速部署與圖形化管理

管理和運(yùn)維一套CDN系統(tǒng)對(duì)于任何組織來(lái)講都是個(gè)很大的挑戰(zhàn),尤其是部署了多區(qū)域多線路的CDN。需要隨時(shí)掌控CDN加速的節(jié)點(diǎn)列表、需要定義哪些網(wǎng)頁(yè)元素可以作為緩存、需要做什么樣的ACL策略等等,這些都需要專業(yè)的系統(tǒng)運(yùn)維人員來(lái)配置實(shí)現(xiàn)。

通常較為成熟的做法是通過主控機(jī),預(yù)先配置好CDN規(guī)則 ,通過Rsync把配置文件推送到各個(gè)CDN節(jié)點(diǎn)中去。很顯然,這種方案雖然效率高,但是對(duì)CDN部署者具有一定的門檻,加上服務(wù)器的權(quán)限控制要求非常嚴(yán)格,也不利于面向其它工程師做推廣。

偶然的機(jī)會(huì),我們有幸在黑客馬拉松大賽初識(shí)了OpenCDN這個(gè)獲獎(jiǎng)作品,通過互補(bǔ)整合,更是彌補(bǔ)了我們這套CDN上的前端管理的不足。因此,可以跟OpenCDN這個(gè)項(xiàng)目做很好的深度整合,降低運(yùn)維和管理門檻,造福于更多的IT運(yùn)維的用戶。

 
 

A. OpenCDN主要解決什么問題?

OpenCDN是一套快速部署CDN加速的工具,針對(duì)專門提供CDN加速服務(wù)的企業(yè)或?qū)Χ喙?jié)點(diǎn)CDN加速有需求的企業(yè)提供一套便捷的管理平臺(tái),可對(duì)每一個(gè)節(jié)點(diǎn)的狀態(tài)、系統(tǒng)負(fù)載進(jìn)行實(shí)時(shí)監(jiān)測(cè)與統(tǒng)一管理。OpenCDN預(yù)制了多套常用緩存規(guī)則,支持多種復(fù)雜的CDN緩存場(chǎng)景。正如其名,OpenCDN是免費(fèi)開源的。

B. OpenCDN當(dāng)前是怎么做的?

OpenCDN的主體架構(gòu)可分為CDN管理中心和CDN加速節(jié)點(diǎn)。CDN加速節(jié)點(diǎn)可以有很多個(gè),在數(shù)量上沒有任何限制。用戶可以通過OpenCDN快速的部署多個(gè)CDN加速節(jié)點(diǎn),并通過一個(gè)管理中心進(jìn)行集中式的管理。

因此OpenCDN在這里主要做了兩部分工作,一是將CDN節(jié)點(diǎn)的部署過程一鍵化,二是通過WebConsole工具將這些CDN加速節(jié)點(diǎn)統(tǒng)一的管理起來(lái)。

 
 

C. OpenCDN未來(lái)要做出什么樣?達(dá)到怎么樣的效果?

OpenCDN將致力于為多節(jié)點(diǎn)CDN加速有需求的網(wǎng)站,提供一套便捷的CDN加速管理平臺(tái),能夠按需自建CDN節(jié)點(diǎn),靈活控制成本,提高網(wǎng)站響應(yīng)速度,輕松應(yīng)對(duì)突發(fā)流量。

后續(xù)我們將在此基礎(chǔ)上整合加入上述CDN防御大流量DDoS攻擊的組合方案。我們對(duì)這套平臺(tái)做了開源,希望有更多有需要的人能夠以最低的成本獲取它,同時(shí)也希望通過更多的開發(fā)者加入進(jìn)來(lái)一起完善它。所謂人人為我,我為人人。

D. OpenCDN進(jìn)行自建CDN的優(yōu)勢(shì)

  1. 首先是降低了獲取CDN的成本,同時(shí)最為關(guān)鍵的是提升了CDN節(jié)點(diǎn)的性能。對(duì)比租用商業(yè)CDN,我們無(wú)需再為購(gòu)買流量而計(jì)算成本,形成固定開銷的租用模式。
  2. 不局限于節(jié)點(diǎn)的介質(zhì),物理服務(wù)器或者VPS均可以適用,可利用不同服務(wù)商的VPS構(gòu)建起一張覆蓋全國(guó)全網(wǎng)的低成本CDN加速集群。
  3. 商業(yè)CDN的節(jié)點(diǎn)要共享給多個(gè)站點(diǎn)同時(shí)使用,而這意味著節(jié)點(diǎn)的有限資源(并發(fā)數(shù))將在同一時(shí)間內(nèi)分享使用,對(duì)于帶寬/流量要求較高的用戶,比較適合自建的架構(gòu)。

OpenCDN適用于哪些用戶?

OpenCDN目前來(lái)看,比較適用于行業(yè)競(jìng)爭(zhēng)比較大的網(wǎng)站:

游戲站、垂直電商、社區(qū)論壇、在線視頻、聊天。

這些網(wǎng)站的共性特點(diǎn):流量中型規(guī)模,競(jìng)爭(zhēng)激烈,經(jīng)常被攻擊,行業(yè)利潤(rùn)高,愿意花錢。

總結(jié)

至此,《自建CDN防御DDoS》系列便告一段落。如果有任何疑問,歡迎跟我們交流、探討。

作者簡(jiǎn)介

邵海楊(個(gè)人頁(yè)面),來(lái)自杭州Linux用戶組。網(wǎng)名“海洋之心”,系統(tǒng)架構(gòu)師,業(yè)余撰稿人,致力于開源軟件及前沿科技的研究和探索。

張磊(微博,博客),來(lái)自杭州谷歌開發(fā)者社區(qū)。專注于信息安全技術(shù)領(lǐng)域,曾主導(dǎo)多項(xiàng)銀行/證券行業(yè)網(wǎng)站安全測(cè)試和入侵取證分析項(xiàng)目,為四大銀行提供安全防護(hù)技術(shù)支持。目前創(chuàng)業(yè)做互聯(lián)網(wǎng)安全防護(hù)。

相關(guān)閱讀

自建CDN防御DDoS(1):知己知彼,建設(shè)持久防線
自建CDN防御DDoS(2):架構(gòu)設(shè)計(jì)、成本與部署細(xì)節(jié)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多