網頁

2008年7月2日 星期三

防砍站 Part 1



最近天氣比較熱,
電腦一直呈現快要當機的情況...

之前其實已經有三個硬碟被操壞了,
兩個IDE, 一個還是SATA的硬碟,
說真的蠻誇張的,

探究原因感覺是系統過熱的關係,
我還看到一個以前完全沒看過的訊息:

CPU0: Temperature above threshold
CPU1: Temperature above threshold
CPU1: Running in modulated clock mode
CPU0: Running in modulated clock mode

後來去追蹤原來是有許多類似spider在抓我的相簿網站,
一抓就是一堆, 造成資料庫負載過高,

這種問題以前我就有遇過,
之前有找到netman鳥哥有提供一些script,
但效果不彰, (我有執行過一陣子, 但效果不好, 還是我不會用?)
兩個的主要問題在於: 演算法過於複雜, 需要對檔案系統作IO
真正在被攻擊的時候, 有時候連script都跑不起來,
在Google找了一下防砍站
找到一個還不錯的: http://bbs.mychat.to/read.php?tid=589326

我使用的是Andyz所提供的script,
主要是利用netstat去判斷目前TIME_WAIT的tcp連線數目,
超過一個最大值則將其擋掉,

這個作法好處當然就是只要跑一個很簡單的script作一個簡單的判斷,
馬上防堵不要讓覆載持續擴大,
我個人測試了一兩天效果十分滿意,
均可以很迅速地將該攻擊ip擋掉,
當然對於更大型的網站,
我不知道還有沒有更好的解法,
但目前這個script倒是幫了很大的忙,
配合人工的分析, 把一些很詭異的站給永久擋掉.

假如有誤判的 (比如有些人是中病毒),
也不會造成他們太多瀏覽上得困擾,
不解決隔天兩分鐘馬上又會擋下.

今天我跑了一天就擋下來22個詭異的連線,
非常滿意.



後記1:

要提醒大家的一點, 假如要使用這個程式,
首先要確認你iptables裡面的chains先後順序,
假如裡面已經有chains, 要確認blockhttp的chain會優先啟用,
否則會無作用. (iptables的chains是有先後順序的)

後記2:

回頭去看netman大的文章,
他主要有提到就是, 他的script不想那麼強硬,
就是讓使用者有轉圜空間,
所以才會作那麼多判斷,
我目前使用這個是比較強硬的作法,
以後作為調整的參考.

後記3:

另外在網路上找到一個資料: http://ssorc.tw/rewrite.php/read-451.html

原來我用的那個script是施威銘研究室提供的,
有關tcp的state解釋:

Quote: http://linux.vbird.org/linux_server/0140networkcommand.php
  • Proto:該連線的封包協定,主要為 TCP/UDP 等封包;
  • Recv-Q:非由使用者程式連接所複製而來的總 bytes 數;
  • Send-Q:由遠端主機所傳送而來,但不具有 ACK 標誌的總 bytes 數, 意指主動連線 SYN 或其他標誌的封包所佔的 bytes 數;
  • Local Address: 本地端的位址,可以是 IP (-n 參數存在時), 也可以是完整的主機名稱。如上表我們看到的 IP 格式有兩種,一種是 IPv4 的標準, 亦即是四組十進位的數字後面加上冒號『:』後,接著 port number 。一種是 IPv6 , 前面的 IP 加上很多冒號『:』的格式。我們可以由這個顯示的資料看出這個服務是開放在哪一個介面, 例如上表當中, port 22 是開放在 0.0.0.0 ,亦即是所有介面都可以連到 port 22 , 至於 port 53 則僅開放在本機的 127.0.0.1 這個介面而已,所以是不對外部介面開放的意思。
  • Foreign Address:遠端的主機 IP 與 port number
  • stat:狀態列,主要的狀態含有:
    • ESTABLISED:已建立連線的狀態;
    • SYN_SENT:發出主動連線 (SYN 標誌) 的連線封包;
    • SYN_RECV:接收到一個要求連線的主動連線封包;
    • FIN_WAIT1:該插槽服務(socket)已中斷,該連線正在斷線當中;
    • FIN_WAIT2:該連線已掛斷,但正在等待對方主機回應斷線確認的封包;
    • TIME_WAIT:該連線已掛斷,但 socket 還在網路上等待結束;
    • LISTEN:通常用在服務的監聽 port !可使用『 -l 』參數查閱。

沒有留言:

張貼留言