EZTABLE IDEAS 是 EZTABLE 成員揮灑熱情和大家分享專業及創意的網誌。 EZTABLE 讓消費者 24 小時都可以在網路訂位全台灣最優質的餐廳,同時提供餐廳經營者 e 化的訂位管理系統 (雲端、iPad、智慧型手機)

才剛說嘴,就打了嘴 – DDoS防護實戰體驗分享

六月 02 2011 Published by under Engineering, EZ心情

不久前才跟大家分享了怎麼利用iptables的recent module和apache的mod_evasive來阻擋DDoS的攻擊。
想不到前幾天就來了個實戰體驗營。
就跟大家分享一下處理的過程,希望有遇到相同困擾的朋友可以作個參考。

某天,小弟突然接到如雪片般飛來的訊息與e-mail,反應某台server的web似乎連不上。
我試了一下,嗯,連線愈時,情況時好時壞,ssh進去,當然先用top看一下主機資源的情況。
咦,loading沒有很高,而且ssh的作業過程也沒有延遲的感覺。
(若是因主機資源耗儘,那麼ssh的作業過程也常會受到影響,反應緩慢)
好吧,看來不是這個問題,那就用netstat -ntp看一下網路連線狀況。
一看不得了,我的port 80有1300多個connections。
這不正常,因為這台主機並非主要對外提供服務用的,而且用whois查了一下IP的來源,幾乎都不是台灣的IP。

看了一下/var/log/messages,果然出現了很多如下的dos攻擊記錄:
May 25 13:32:00 XXXX kernel: [Possible DOS Attack]IN=eth0 OUT= MAC=XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX SRC=189.177.90.118 DST=XXX.XXX.XXX.XXX LEN=48 TOS=0x00 PREC=0x00 TTL=112 ID=15601 DF PROTO=TCP SPT=24873 DPT=80 WINDOW=16384 RES=0x00 SYN URGP=0

接著,拿這些IP去查apache log,果然看到了很多奇怪的記錄:
189.177.90.118 – – [25/May/2011:12:57:19 +0800] “GET http://googleads.g.doubleclick.net/pagead/
viewthroughconversion/993276430/?
random=1306213019945&cv=6&fst=1306213019945&num=1&fmt=3&value=0
&label=7bccCMLglwIQjuTQ2QM&bg=666666&hl=en&guid=O
N&u_h=600&u_w=1024&u_ah=600&u_aw=1024&u_cd=32&u_his=50&u_tz=-300&u_java=true&u_nplug=19&u_nmime=316&ref=http
%3A//s4.bitefight.com.mx/profile/player/192107&url=http%3A//s4.bitefight.com.mx/city/
index&ctc_id=CAIVAgAAAB0CAAAA&ct_cookie_present=false HTTP/1.0″ 200 42 “http://s4.bitefight.com.mx/city/index"
“Opera/9.80 (Windows NT 5.1; U; es-ES) Presto/2.8.131 Version/11.11″

好吧,幾乎可以確認是因為我們的apache被大量連線而造成DDoS的狀況了。
而且對方GET的內容都不是我們的domain name,當下研判是一種攻擊行為(送大量垃圾訊息過來,讓主機處理不及而掛點)。
既然這樣,就稍微計算一下攻擊的流量,然後調整了一下iptables rule和apache mod_evasive的設定。
在重啟apache清除多餘的連線以後,主機恢復正常了。
嘿,看來還真不錯啊~

可是正當我還沈醉在成功的喜悅之中,坐在對面的同事卻跟我說:「大哥,又連不上了耶…」
再連進去看,還是一樣的問題,只是攻擊的流量變了,
IP數變的更多,但同一IP的connections變少了,所以iptables視其為正常流量,並未全部阻擋。
我就再調整一下rules,把攻擊擋掉,但總撐不了多久,就又再度被打掛。
到最後,甚至因為rule設定得太嚴格,連正常的使用者都被iptables視為攻擊擋掉了。
就在我快要舉白旗投降的時候,突然看到了apache log有一個奇怪的地方:
189.177.90.118 – – [25/May/2011:12:57:19 +0800] “GET http://googleads.g.doubleclick.net/pagead/
viewthroughconversion/993276430/?
random=1306213019945&cv=6&fst=1306213019945&num=1&fmt=3&value=0
&label=7bccCMLglwIQjuTQ2QM&bg=666666&hl=en&guid=O
N&u_h=600&u_w=1024&u_ah=600&u_aw=1024&u_cd=32&u_his=50&u_tz=-300&u_java=true&u_nplug=19&u_nmime=316&ref=http
%3A//s4.bitefight.com.mx/profile/player/192107&url=http%3A//s4.bitefight.com.mx/city/
index&ctc_id=CAIVAgAAAB0CAAAA&ct_cookie_present=false HTTP/1.0″ 200 42 “http://s4.bitefight.com.mx/city/index"
“Opera/9.80 (Windows NT 5.1; U; es-ES) Presto/2.8.131 Version/11.11″

既然對方送過來的GET內容不屬於我們的主機,那麼response code應該是404 not found 或是其他的錯誤訊息。
但怎麼會回他 200 OK 呢?
仔細清查了一下,終於找到兇手了:
原來之前為了某個特殊需求而打開了apache的mod_proxy,
但因設定不夠完善,被當成open relay proxy來用了,
所以我們的主機才會回對方200 OK,而apache也禁不起大量這類的連線。
在關閉mod_proxy後,apache順間恢復正常運作。
我也沒有再聽到有人跟我講說:「大哥,又連不上了耶…」

經歷了這次事件後,我有兩個體悟:
1. DDoS真的很難防,尤其是當對方的IP數量夠多,而單一IP的流量又不大時,幾乎是無法阻擋。 (當然,你可以升級硬體+加大頻寬,讓自己變得更耐打 :P)
2. log要看清楚,一個小地方沒注意到,處理方向不對,就沒辦法對症下藥。

希望大家不要遇到跟我一樣的情況。 XD

By Tinghan Chao, EZTABLE Web Developer

Related Posts Plugin for WordPress, Blogger...

No responses yet

發表迴響