1 序言
本次文章(zhāng)系列将會逐步分享作者親身經曆以及解決思路,讓大家一(yī)起身臨其境,作為(wèi)開篇,會先和(hé)大家聊點有趣的(de),做(zuò)這件事的(de)動機,對我的(de)職業道(dào)路有什麽影響等,大家可(kě)以仁者見仁智者見智。
其實對我們正常程序員的(de)工作流程來說,網絡這塊對我們來說基本不會涉及,因為(wèi)公司的(de)職責分配,大家都會隻負責自(zì)己的(de)部分,例如(rú)ui隻負責ui,測試隻負責功能測試性能測試,軟件開發隻負責軟件開發,運維隻負責服務器資源調配整合管理(lǐ),網絡管理(lǐ)等等,但是其實對于大多數程序員來說,公司的(de)規模不大的(de)情況下,一(yī)般都會身兼數職,又是軟件開發,又是測試,還需要去(qù)部署項目。那麽既然大家都有機會橫向拓展自(zì)身的(de)技能,其實真的(de)可(kě)以利用好機會去(qù)學(xué)習,去(qù)實踐,看的(de)再多,了解的(de)再多不如(rú)實際去(qù)試試。
又到了我最喜歡的(de)講故事環節啦~ 曾經我也是一(yī)名普通的(de)Java程序開發,每天寫寫bug,調試一(yī)下代碼,和(hé)産品鬥鬥嘴,日子(zǐ)一(yī)天天這樣愉快的(de)過去(qù)。
突然一(yī)天,接到公司電話:"大事不好了,所有用戶都無法正常使用應用啦,用戶投訴已經快把公司電話打爆了。你趕快解決!" 當時還在休周末假期的(de)我,一(yī)下就從床上挺直了身闆,心想:不會吧(ba),代碼應該沒問題啊,我不可(kě)能錯的(de)啊(ps:程序員的(de)蜜汁自(zì)信) 緊接着馬上打開筆(bǐ)記本電腦,開始排查問題,首先從用戶反饋的(de)截圖來看,應用其實連接超時,沒有任何響應。那此時可(kě)以排除掉app應用本身的(de)問題,然後立馬使用接口測試工具postman測試一(yī)個線上的(de)接口,發現确實無任何響應了,糟糕,難道(dào)我的(de)Java服務挂了?然後懷着忐忑的(de)心情登錄遠程服務器,發現服務器居然也無法登錄了,這是什麽情況?
由于我使用的(de)是阿裏雲的(de)雲産品,所以立馬登錄阿裏雲賬号,發起一(yī)個工單咨詢阿裏雲的(de)技術支持,在明确告知了雲服務器實例id以及無法訪問的(de)異常情況後,等待對方的(de)反饋。在這裏給阿裏雲技術支持點個贊,技術反饋很快,并且态度十分友好。最後阿裏雲技術支持反饋工單說我們的(de)服務器請求流量異常,進入他們的(de)黑洞機制了。wtf?說的(de)白話一(yī)點就是有人在對我們服務器進行ddos攻擊,我們服務器的(de)資源被耗盡并且觸發了阿裏雲的(de)黑洞機制,我們服務器被丢進"小黑屋"了,什麽都做(zuò)不了,第一(yī)次進入黑洞就是兩個小時,後面在進入黑洞就會逐漸時長(cháng)增加。
這可(kě)不得了,首先在聯系客戶,安撫客戶的(de)同時,也馬上開始針對這次攻擊做(zuò)出反應。期間黑客甚至還匿名聯系過我們,态度十分嚣張,說什麽不給"保護費"就會一(yī)直對我們服務器進行攻擊,不讓我們正常營業,還趾高(gāo)氣昂的(de)說什麽今天不交5k的(de)保護費,明天再交那就是一(yī)個達不溜,這話聽着怎麽這麽耳熟呢(ne)?今日割五城,明日割十城,然後得一(yī)夕安寝。取自(zì)<<六國論>>中的(de)經典短(duǎn)句,今日你割讓5個城池,明天再讓你割讓10個城池,以此換來睡一(yī)個安穩的(de)覺,然而第二天一(yī)看,秦國的(de)軍隊又來了。
壞人的(de)欲望是無法滿足的(de)。于是我緊急查找做(zuò)網絡防火牆的(de)解決方案提供商,阿裏雲的(de)高(gāo)防,一(yī)年(nián)40多萬的(de)費用,讓我們望而卻步,畢竟公司的(de)業務暫時沒有這麽大的(de)量級,這個方案屬于不适合當前的(de),最後接入了一(yī)家小衆公司的(de)網絡防火牆方案,最後以一(yī)個月599的(de)價格購買了一(yī)個标準套餐的(de)防火牆,測試通過後就将流量全部轉移到他們的(de)防火牆進行流量清洗和(hé)監控,最後回源到我們服務中,而攻擊我們的(de)黑客最後也是費勁心思的(de)攻擊幾次後,眼看攻擊無果,最後灰溜溜的(de)消失在了我們視(shì)線中。
在經曆了服務不可(kě)用之後再恢複正常使用的(de)這段黑暗時刻後,其實心裏還是很緊張的(de),首先就是自(zì)身處于舒适圈,沒有保持一(yī)個良好的(de)學(xué)習熱忱,導緻技術棧相對狹隘,認為(wèi)一(yī)個軟件應用從開發好後,把服務部署到服務器上,解析一(yī)個域名綁定服務器ip,然後讓app調用這個域名跟服務接口就完成了任務,認為(wèi)自(zì)己這樣做(zuò)開發效率還很快,沾沾自(zì)喜,其實正是落入自(zì)己給自(zì)己設下的(de)糖衣陷阱,限制了自(zì)己的(de)思想,阻礙了自(zì)己思考的(de)能力,于是我利用接入了第三方的(de)防火牆這段時間,自(zì)己也在惡補網絡相關的(de)知識,彌補自(zì)己對互聯網中的(de)知識匮乏。
首先這次攻擊,再通過第三方防火牆的(de)管理(lǐ)後台中,我們可(kě)以清楚的(de)看到所有的(de)請求ip以及各個ip的(de)請求次數,可(kě)以看到正常ip的(de)請求頻率在一(yī)分鍾以內(nèi)一(yī)般也就幾十個連接請求,但是有一(yī)批ip的(de)請求都是幾萬次,明顯不正常,通過百度搜索這些ip,無一(yī)例外都是海外的(de)ip,也就是什麽馬來西亞啊,柬埔寨啊等等是非之地(dì)的(de)ip,這一(yī)看就是被控制了肉雞對我們同時進行的(de)ddos攻擊,導緻我們服務的(de)癱瘓。
引用百度百科中,DDOS一(yī)般指分布式拒絕服務攻擊,分布式拒絕服務攻擊(英文意思是Distributed Denial of Service,簡稱DDoS)是指處于不同位置的(de)多個攻擊者同時向一(yī)個或數個目标發動攻擊,或者一(yī)個攻擊者控制了位于不同位置的(de)多台機器并利用這些機器對受害者同時實施攻擊。由于攻擊的(de)發出點是分布在不同地(dì)方的(de),這類攻擊稱為(wèi)分布式拒絕服務攻擊,其中的(de)攻擊者可(kě)以有多個。也就是上面我們所遇到的(de)對方使用非法技術手段控制多台計算機,同時對我們的(de)這台服務進行攻擊。而單一(yī)的(de)DoS攻擊一(yī)般是采用一(yī)對一(yī)方式的(de),它利用網絡協議和(hé)操作系統的(de)一(yī)些缺陷,采用欺騙和(hé)僞裝的(de)策略來進行網絡攻擊,使網站服務器充斥大量要求回複的(de)信息,消耗網絡帶寬或系統資源,導緻網絡或系統不勝負荷以至于癱瘓而停止提供正常的(de)網絡服務。也就是dos就是1v1單挑,拼的(de)是誰的(de)主機資源性能更好,而ddos就是不講武德,多人運動,以多欺少。
既然知道(dào)了攻擊手段,那如(rú)何防範呢(ne)?那就要說說防火牆的(de)分類了,一(yī)般防火牆是有物理(lǐ)硬件防火牆和(hé)軟件防火牆兩種,硬件防火牆代表有著名的(de)F5,Symantec等,這類軟硬一(yī)體防火牆,國內(nèi)也有很多做(zuò)硬件防火牆的(de)廠家,例如(rú)天融信,啓明星辰,聯想網禦,華為(wèi),深信服等等。軟件防火牆有firewall,iptables等等
其中軟件防火牆也稱為(wèi)個人防火牆,它是最常用的(de)防火牆,通常作為(wèi)計算機系統上的(de)程序運行,它是可(kě)定制的(de),允許用戶控制其功能。軟件防火牆單獨使用軟件系統來完成防火牆功能,将軟件部署在系統主機上,其安全性較硬件防火牆差,同時占用系統資源,在一(yī)定程度上影響系統性能。硬件防火牆是指把防火牆程序做(zuò)到芯片裏面,由硬件執行這些功能,能減少CPU的(de)負擔,使路由更穩定。一(yī)般的(de)軟件安全廠商所提供的(de)硬件防火牆便是在硬件服務器廠商定制硬件,然後再把linux系統與自(zì)己的(de)軟件系統嵌入。(Symantec的(de)SGS便是DELL+Symantec的(de)軟件防火牆)這樣做(zuò)的(de)好處是linux相對Windows的(de)server相對安全。
至于價格高(gāo),原因在于,軟件防火牆隻有包過濾的(de)功能,硬件防火牆中可(kě)能還有除軟件防火牆以外的(de)其他功能,例如(rú)CF(內(nèi)容過濾)IDS(入侵偵測)IPS(入侵防護)以及VPN等等的(de)功能。軟件防火牆一(yī)般可(kě)以是包過濾機制。包過濾過濾規則簡單,隻能檢查到第三層網絡層,隻對源或目的(de)IP做(zuò)檢查,防火牆的(de)能力遠不及狀态檢測防火牆,連最基本的(de)黑客攻擊手法IP僞裝都無法解決,并且要對所經過的(de)所有數據包做(zuò)檢查,所以速度比較慢。硬件防火牆主要采用第四代狀态檢測機制。狀态檢測是在通信發起連接時就檢查規則是否允許建立連接,然後在緩存的(de)狀态檢測表中添加一(yī)條記錄,以後就不必去(qù)檢查規則了隻要查看狀态監測表就OK了,速度上有了很大的(de)提升。
軟件防火牆隻能保護安裝它的(de)系統。硬件防火牆保障整個內(nèi)部網絡安全。它的(de)安全和(hé)穩定,直接關系到整個內(nèi)部網絡的(de)安全。如(rú)果所在的(de)網絡環境中,攻擊頻度不是很高(gāo),用軟件防火牆就能滿足要求了。軟件防火牆的(de)優點是定制靈活,升級快捷。倘若攻擊頻度很高(gāo),建議用硬件來實現。
硬件防火牆的(de)抗攻擊能力比軟件防火牆的(de)高(gāo)很多,通過硬件實現的(de)功能,效率高(gāo),專門為(wèi)了防火牆這一(yī)個任務設計的(de),內(nèi)核針對性很強。軟件防火牆在遇到密集的(de)DDOS攻擊的(de)時候,它所能承受的(de)攻擊強度遠遠低(dī)于硬件防火牆。因為(wèi)硬件防火牆将防火牆功能集成到芯片中,有硬件執行,對于計算機的(de)cpu使用可(kě)以算是0占用,穩定性要高(gāo)得多,而軟件防火牆是安裝和(hé)運行在計算機中,在運行時是會占用當前計算機的(de)cpu以及內(nèi)存,所以相對硬件要差一(yī)些。
不用說,那肯定是硬件防火牆的(de)成本是最高(gāo)的(de),畢竟設備廠商是靠買這些硬件掙錢的(de),一(yī)般的(de)硬件防火牆在1到幾萬不等,好點的(de)都是十萬開外了,而軟件防火牆相對就要友好的(de)多了,隻需要能安裝軟件防火牆能力的(de)主機即可(kě),成本直線下降。對于小型企業或者個人用戶來說,使用軟件防火牆是最适合的(de)。
那麽此次的(de)防火牆集群搭建的(de)第一(yī)小步,就是先在單機上部署好一(yī)個軟件防火牆并且設定規則。我先是在阿裏雲上購買了一(yī)台1核1g的(de)雲服務器,系統鏡像選擇centos 7.5 64位的(de)。磁盤由于可(kě)能隻需要存一(yī)點點日志,對于磁盤要求不大,所以選擇40G的(de)一(yī)個磁盤挂載,網絡帶寬我們選擇按量付費,最高(gāo)帶寬值拉滿100M,這樣的(de)配置,一(yī)台服務器的(de)費用僅僅需要53塊一(yī)個月!流量費用在超過每月贈送的(de)固定值後按照每GB8毛錢來結算。
centos7.5版本以後系統內(nèi)核編譯的(de)防火牆默認是firewall,而本次我們使用的(de)是iptables,所以我們需要先關閉原本的(de)firewall,然後下載安裝iptables,再使用iptables命令來進行添加規則,最後安裝一(yī)個nginx做(zuò)前置網關,負載均衡到自(zì)己軟件服務主機上,以此來完成軟件防火牆的(de)閉環搭建。
systemctl stop firewalld
systemctl mask firewalld
yum install -y iptables
yum update iptables
yum install iptables-services
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
service iptables save
systemctl enable iptables.service
systemctl start iptables.service
yum install -y nginx
systemctl start nginx.service
systemctl enable nginx.service
客戶端的(de)請求直接通過域名解析訪問到實際業務主機上,形同裸體,不設防備,所有請求直接打在業務服務器上,在沒有架設後置網關的(de)情況,沒有負載均衡能力,服務容易被攻擊,不安全。并且服務器的(de)真實ip暴露,容易被不法分子(zǐ)進行ssh爆破攻擊,對服務器運行帶來許多不穩定因素。
客戶端的(de)請求通過域名解析來到了防火牆所在的(de)主機上,在驗證了請求ip是否符合規範等情況後,由nginx轉發請求到業務服務器上,返回地(dì)址也使用防火牆的(de)ip地(dì)址信息,從而隐藏了真實的(de)服務ip,避免暴露。本篇文章(zhāng)作為(wèi)第一(yī)章(zhāng)節,隻介紹單機版本的(de)搭建,以及實現邏輯,下一(yī)章(zhāng)節便給大家帶來集群如(rú)何實現,以及為(wèi)什麽要用集群的(de)防火牆,單機的(de)為(wèi)什麽不行。
既然我們已經搭建好并且啓動了上述iptables,我們知道(dào)iptables也能拒絕連接,甚至可(kě)以拒接指定ip的(de)連接,那我們隻需要寫一(yī)個腳本,每次啓動都檢測一(yī)下當前的(de)ip連接數,對于單個ip連接數異常高(gāo)的(de)進行一(yī)個封禁,那這個ip所有的(de)請求在達到防火牆這一(yī)層就會被自(zì)動丢棄,不占用系統的(de)資源了,也不影響正常的(de)用戶ip的(de)請求。
#iptables 禁用單個ip連接
iptables -I INPUT -s 1.2.3.4 -j DROP
#或
iptables -A INPUT -s 1.2.3.4 -j DROP
-A 指定規則應該添加到的(de) chain 的(de)名稱。例如(rú),使用 INPUT 将會把規則添加到默認的(de) INPUT(入站)鏈的(de)末尾,而使用 OUTPUT 則會将規則添加到出站鏈的(de)末尾。
-I 将規則添加為(wèi) chain 中的(de)第 rulenum 條規則,原先的(de)第 rulenum 條及以後各條的(de)需要順次 +1。如(rú)上面一(yī)樣,1 表示該 chain 中第一(yī)條。默認為(wèi) 1,即,如(rú)果沒有指定 rulenum 則将該 chain 中第一(yī)條規則替換掉。
wget 'http://blog.houlangmark.com/ddos.sh' -O /etc/ddos/ddos.sh
vim 這個ddos腳本,主要的(de)命令為(wèi)下面這行
cd /etc/ddos
vim ddos.sh
netstat -an |grep ^tcp.*:80|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn
此時便可(kě)以通過定時啓動腳本一(yī)直檢測網絡連接的(de)ip,找到非法的(de)ip進行操作。
由于文章(zhāng)的(de)篇幅有限,這個防火牆系列的(de)第一(yī)篇文章(zhāng)便隻先介紹如(rú)何單機搭建好一(yī)個防火牆的(de)簡單軟件,我這邊給大家提供我自(zì)己編寫的(de)一(yī)個初始化腳本,大家可(kě)以在一(yī)台新的(de)服務器上自(zì)己試試效果,腳本中每個步驟都有注釋,大家可(kě)以先自(zì)行理(lǐ)解一(yī)下。
wget http://blog.houlangmark.com/install.sh
下載後的(de)初始化腳本,隻需要執行 sh install.sh即可(kě)完成所有步驟,無需你操心。大家可(kě)以先看看裏面的(de)步驟,這裏粘一(yī)個部分截圖。
給大家在這裏梳理(lǐ)總結一(yī)下,我的(de)實現過程,在一(yī)台新的(de)主機上下載初始化腳本,執行腳本會把nginx下載下來,并把一(yī)個模闆nginx.conf下載下來放置nginx的(de)目錄下,啓動好nginx後會安裝iptables,安裝好後會先把所有規則先清理(lǐ)掉,然後開放基本的(de)一(yī)些端口服務,然後關閉當前主機原本默認的(de)firewall,啓動iptables,接下來會安裝ipset拓展組件,用于記錄ip黑名單和(hé)白名單,然後通過iptables命令将ipset的(de)集合綁定起來,保存并重啓iptables,最後下載我這邊寫的(de)ddos防禦腳本,并且啓動這個腳本一(yī)直監聽網絡請求ip,将異常請求ip記錄到黑名單中,實現自(zì)動拉黑ip,阻止請求。最後就是利用nginx将正常Ip的(de)請求轉發到業務服務器上去(qù),到此第一(yī)部分,思路與大概實現就給大家分享完畢了。
最後在這裏給大家說一(yī)下,由于第一(yī)次分享這類自(zì)己一(yī)個人摸索實現的(de)功能,語言整理(lǐ)這塊還有很大的(de)進步空間,我也希望通過更多的(de)分享來鍛煉自(zì)己的(de)語言組織能力,給大家帶來更好的(de)觀感體驗,能很直觀并且不枯燥的(de)看完,更想能讓讀者自(zì)己動手時可(kě)以利用我提供的(de)部分下載實例能直接運行測試,後面我會越來越努力學(xué)習給大家分享的(de),歡迎大家給作者一(yī)些建議,我會虛心接受。敬請期待下一(yī)期《iptables,ipset詳解》