作者 主題: 與網路共結17年....架主機...寫程式...想退休了...  (閱讀 9504 次)

0 會員 與 1 訪客 正在閱讀本文。

dctigom

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
架主機...到寫超大型網站..林林總總...真想退休了...
或許吧....只保留一台主機玩玩....

-------------------------------------------------------

關於防砍站............能提供一些小小的改進作法..........
或許可以提供大家一些 (小撇步 )........


重點....還是關念問題....觀念對了.....運用一些 (小撇步 ) 照樣讓砍站者通通現形.....
先說一些重點觀念........其他的大家就能各自發揮...


1、如何區分出 (砍站者 ) 與 ( 正常瀏灠者 )..........
例如......有一個人開啟 4 個視窗(瀏灠)不同的討論主題,如何辨識它不是來砍站的.....

2、大陸的 IP 一定要全鎖嗎??.......
如何防止大陸那些......(亂七八糟的蜘蛛)....( 假冒 IE 的蜘蛛)...( 假冒 yahoo 與 google 的蜘蛛) 來砍站...
又能讓真正的  yahoo 與 google 來抓網站資料......

3、如何區分 Proxy.......是正常(瀏灠)....還是有人利用它來砍站的.....
( 學校、公家機關、醫院、辦公大樓 ) 大多使用 Proxy 統一對外.....如何區分 Proxy 不是來砍站的......
如遇到 (多機型)Proxy  它會有多組 IP 輪流跳換....... 如何區分不是來砍站的

還有一堆問題.......懶的寫............
能解決上列問題......其他問題應該都可一并解決了...........



---------------------( 防砍站範例 )----------------------------------
( to netman 網大~~使用您的當說明.....有失禮之處請海函 )


就以 netman 網大提供的程式為例.........
http://phorum.study-area.org/index.php/topic,13643.0.html


這是最重要的一段..........
# block http
netstat -na | grep ':80' | awk '{print $5}' | cut -d: -f1 \
        | sort | sed '/0.0.0.0/d' > $HTTP_LIST_TMP   ←←把讀取的 IP 寫入記錄檔內
for i in $(cat $HTTP_LIST_TMP | uniq); do   ←←叫出 IP 記錄檔
        if [ $(cat $HTTP_LIST_TMP | grep $i | wc -l) -gt $CONN_NU ]; then  ←←判斷是否超出連線規定
                echo $i >> $HTTP_LIST  ←←再寫入 要 DROP 的 IP
        fi
done
for i in $(cat $HTTP_LIST); do   ←←再次讀取要 DROP 的 IP
        /sbin/iptables -I INPUT -p TCP --dport 80 -s $i -j DROP   ←←把IP 給  DROP 掉

done


--------------  分解網大的程式  --------------------------

netstat -na       讀取連線IP .....
grep ':80'        過濾出 80 的連線.......
awk '{print $5}'   只要第  5  列 IP 的部分.......
cut -d: -f1       這裡要視你們的主機而定...我的主機必須設為 -f4 範例( ::ffff:123.123.123.123 ) 只要 IP 部分
sort     把讀取的 IP 排序  ps...這點非常重要...切記.....
sed '/0.0.0.0/d'  去掉本機local ...... 有些主機必須改為  sed '/^80$/d'  視你們的主機而定
 > 寫入記錄.............


----------------  改版網大的程式 -----------------------------


個人認為~~~我們要的是連線 IP, 所以開頭應改為 netstat -nt 只要連線的IP即可...(錯誤請指正,感恩)
( 讀取 IP 後寫入記錄....再讀取.....判斷.....再 DROP )
把讀取的 IP 寫入文字檔,連線多時....容易出錯,文字檔讀取判斷(記錄多)速度慢,會拖系統,不適用於人多的網站.....


把程式改小....速度變快....即時反映.....能利用於人多的中、大型網站......
在讀取 IP 時應直接辨識,不須寫入記錄檔,若超過砍站限制,直接 DROP 掉......
我們可利用網大的程式.....改寫.......


netstat -nt       讀取連線IP .....  ( -na 改用 -nt )
grep ':80'        過濾出 80 的連線.......
awk '{print $5}'    只要第  5  列 IP 的部分.......
cut -d ':' -f 4     只要第4區塊 IP 部分
sort               把讀取的 IP 排序

再加入下列程式---------------------------------------------------------------

uniq -c         把讀取的 IP 排序後,計算出 (每個 IP ) 的連線筆數.....
tr -s ' ' ':'      分隔出 ( 每個連線的 IP 的筆數 )
awk 'BEGIN {FS=":"} $2 > 30 {print $2 ":" $3}'    辨別那一個 IP 連線數大於 30 .......
cut -d ':' -f2    只讀取(那個)連線數大於 30 的 IP .........
sed '/^80$/d'      去掉本機local


----------------------至此 ~~~ 以下是範例 -----------------------------
直接讀取 netstat 並同時辨識出、連線超過 30 的違規 IP .....



#!/bin/bash

for(( ;; ));do    ## 一直執行本程式
TPP=/root/ip.txt    ##記錄 (被DROP) 的IP、每 3 分鐘解鎖 ( iptables -D ..... )

for bb in $(netstat -nt | grep ':80' | awk '{print $5}' | cut -d ':' -f 4 | sort | uniq -c | tr -s ' ' ':' | awk 'BEGIN {FS=":"} $2 > 35 {print $2 ":" $3}' | cut -d ':' -f2 | sed '/^80$/d'); do
iptables -I INPUT -s $bb -j DROP     ##超過 30 違規的,直接 DROP 掉.....
echo "iptables -D INPUT -s $bb -j DROP" >> $TPP    ##寫入等待 (準備 3 分鐘後解鎖 )
done
sleep 5      ## 砍站者 (開始砍站) 5秒內 DROP 掉....  每 5 秒掃一次
done
exit 0


----------------------解鎖-----------------------------

用另一個 script 每 3 分鐘解鎖、使用 /etc/crontab 跑即可 ........


#!/bin/bash

解除管制....

清空資料.....
echo "" > /root/ip.txt
exit 0

----------------------至此-----------------------------

簡單說.....要知道主機上有那個 ip 連線數大於 10、只要貼上下列語法即可得知...

netstat -nt | grep ':80' | awk '{print $5}' | cut -d ':' -f 4 | sort | uniq -c | tr -s ' ' ':' | awk 'BEGIN {FS=":"} $2 > 10 {print $2 ":" $3}' | cut -d ':' -f2 | sed '/^80$/d'


每 5 秒掃一次砍站者、每 3 分鐘解鎖一次........
不須管 (砍站者) 是否連續砍站、反正3分鐘解鎖、5秒又被 DROP


以上僅初略 ( 連線數 ) 判斷程式.........
未加入其它辨別 Proxy、LWP、亂七八糟的蜘蛛 的判斷等........
國外 IP 可鎖 (月) 或  (星期).......
你可以自行再再加強這個小小程式也能辨識 LWP 灌水(灌票) 直接 DROP ......




-------------------- (以下) 不一定要跟著作 --------------------------


---------------------------------------------------------------------
( 防砍站 ) 程式至此.....先暫停......我們先設些資料....再回來改善此程式......
---------------------------------------------------------------------

要作到完整的砍站防護、必須用到一些資料辨識.....
如果你的網站已經有 (流量統計、線上人數、計數器) 等程式....
最快的方式就是調用 (網站現有的) 流量統計資料加入上面 script 作其他規範限制.....


假設.....你的網站沒有 (流量統計) 等資料.......
下面我們一步一步建立資料..........

--------------- 建立 ( 防砍站 ) 流量統計 -------------------------

建立 ( 防砍站 ) 專用的流量統計、和計數器、線上人數等資料分開.......

開一個 SQL 資料庫......記錄進站者資訊.....(ps.每一頁都要分開記錄)
( 每個進站者 ) 不可只記錄 1 筆、他所到的每一頁都要記錄下來........

最快的方式就是記錄 ( 進站者 ) 所到的 ( 討論主題編號 + 分頁 ) 無分頁為0
若不是討論區、就記錄頁面名稱........
包括網站上的 ( 加入會員頁面、其他網站上的任何頁面 ) 都要記錄下來......

此 SQL 記錄可...每天清空一次、或 3 天、或每星期清空一次....不需留太久..
因此每頁記錄並不會對主機或 SQL 資料庫造成太大的負擔........


開一個 SQL 資料庫......記錄如下.....
1、auto_increment   自動編號.....
2、$ENV{'REMOTE_ADDR'}   (記錄IP) 雖然可以造假...但我們針對是砍站、而非攻擊、對砍站來說...這就是與主機接觸的 IP....不管是否使用Proxy
3、$ENV{'HTTP_X_FORWARDED_FOR'}  (記錄Proxy) 這行可不用設....參考用而已.....雖然也可以造假...
4、$ENV{'HTTP_USER_AGENT'}   (進站者瀏覽器資訊)  雖然也可以造假...主要作個人辨識用...真假無所謂...記錄下來就對了...
6、$ENV{'HTTP_REFERER'}   (連結來源)  雖然也可以造假...記錄下來就對了...
7、記錄頁面名稱
8、LWP  給每筆 (新記錄) LWP 代號........後面會用到......

9、5    給每筆 (新記錄) 等級 5、於每 3 分鐘解鎖的那個script 內...把等級改為 4 ....
也就是說....新記錄等級5.....超過 3 分鐘的就改為舊記錄等級 4 .......(這裡一定要弄清楚)

只要看到等級 5 就是 3 分鐘內的新記錄.........
等級 4 就是舊記錄.........
這樣清楚吧.......( 我只大略說.....你可以自行把時間~比對~的更準確 )


這 3 分鐘內的 5 記錄就是要用於判斷是否為 (砍站的重要依據) 非常重要....
若等級 4 就列為觀查是否為(慢砍)、非快速且大量砍站的另一種砍站.....
ps.( 慢砍 ) 以(慢速)但卻持續抓取網站資料、也是 (盜連) 的依據之一 ........


create table xxxx
(xxa int not null auto_increment,   自動編號.....
xxb varchar(20),    記錄IP......  $ENV{'REMOTE_ADDR'}
xxc varchar(50),    記錄 Proxy IP......  $ENV{'HTTP_X_FORWARDED_FOR'}
xxd varchar(500),   進站者瀏覽器資訊......  $ENV{'HTTP_USER_AGENT'}
xxe varchar(100),   連結來源...... $ENV{'HTTP_REFERER'}
xxf varchar(20),    記錄頁面名稱...... inx、topic17325.0  等等.....
xxg varchar(3),     LWP......  新記錄 LWP 代號
xxh varchar(4),     新記錄等級 5
......可自行再加判斷......


在每個 PHP 都加入記錄.....( 進站者 ) 所到的每一頁都要記錄下來....
insert into xxxx (xxb,xxc..... 上列資訊...

有了上面的記錄、已可以辨認 (什麼人...去了那個網頁.. 3分鐘內去了那些網頁...幾次....之前去了那些網頁)
3分鐘有多少人在網頁上....等等......基本分析已經有了.....
甚至還可以再細分...那裡連結過來....使用的電腦系統....IE版本 等等.....(此行與本題無關)


有了分析....還不夠.....接下來就是要想辦法讓它 (自動化)
自動辨識.....什麼人進站就自動 DROP .....什麼人進站給它(無限制)抓取網頁 如 yahoo 或 google...

所以我們要再建立一個 (自動化) 所需的資料庫.....
這個資料庫就簡單多了......(ps.這是永遠 ~~不刪資料~~ 的資料庫)


--------------- 建立 (自動化) 資料庫 -------------------------

create table zzzz
(zza int not null auto_increment,   自動編號.....
zzb varchar(4),     開關 ok & off  
zzc varchar(20),    IP
zzd varchar(500),   瀏覽器資訊
......可自行再加判斷......

就這麼簡單即可......雖然簡單但功能卻很強大.....
凡關於.....國外或...大陸那些...(亂七八糟的蜘蛛)..( 假冒 IE 的蜘蛛)...( 假冒 yahoo 與 google 的蜘蛛) 來砍站...
開放真正的  yahoo 與 google 來抓網站資料...或開放其他國外排名網站等蜘蛛...來抓網站資料
鎖那些....LWP 灌水(灌票)....利用 LWP 灌廣告留言....LWP 砍站....利用 LWP 加入會員......等等
反正那些 LWP 遇到程式 (狐狸尾巴會自動現形) ....我們只要負責把它永遠鎖在這裡即可.....非常簡單.....
以上自動辨識資料庫已完成.....



@_@....現在才知道....長篇大論實在(夭壽累)...........
--------------- 至此初步已完成 -------------------------


我們已設好 2 個 script 及 2 個資料庫、並在每個 PHP 上設定(瀏覽者記錄)程式.....

@_@....接下來又要長篇大論.....

從以上記錄開始辨識......
只要讀取任何網頁、都會記錄一筆 SQL xxxx (瀏覽者記錄) ....


我們下旨令 mysql> select COUNT(*) from xxxx where xxb='要查詢的IP' and xxh='5' group by xxb,xxc,xxd;
就是.....把(xxb同一個IP + xxc同一個Proxy + xxd同一個覽器資訊)只視為同一個人.....這個人在 3 分鐘讀取(抓了)多少網頁....
一目了然對吧!!

更清楚的說.....如果有(一堆學生) 使用校園統一的 Proxy 連至網站....以上程式已經可以分辨出...
在同一個 Proxy IP裡有多少 (不同人) 上網站......這些人裡...有沒有人超過連線限制....

同一個IP + 同一個Proxy IP + 一模一樣的IE電腦資訊......卻是 2 台不同人的電腦上網....這應該不可能發生....
所以我們視 3 項完全相同者為......(一個人)


------- 3 分鐘很重要 (3分鐘內超標的) 才管制 -----


#!/bin/bash

for(( ;; ));do
TPP=/root/ip.txt    ##記錄 (被DROP) 的IP、每 3 分鐘解鎖 ( iptables -D ..... )

####  有超過 35 條連線的 IP 才會列入判斷
for bb in $(netstat -nt | grep ':80' | awk '{print $5}' | cut -d ':' -f 4 | sort | uniq -c | tr -s ' ' ':' | awk 'BEGIN {FS=":"} $2 > 35 {print $2 ":" $3}' | cut -d ':' -f2 | sed '/^80$/d'); do
if grep $bb "$TPP"; then    ## 如果 IP 已在DROP名單內...不理此 IP
echo "ok"
else
#### IP 超過 35 條連線、開始判斷、Proxy 內 (同一個人在 3 內分鐘抓了 ) 超過 12 頁、才視為此 Proxy IP 砍站
HHY=$(/usr/local/mysql/bin/mysql --user=root --password=密碼 -e "use 資料庫; select COUNT(*) from xxxx where xxb='$bb' and xxh='5' group by xxb,xxc,xxd;")
for xx in $(echo "$HHY" | grep '[0-9]' | awk '$1 > 12 {print $1}' ); do
iptables -I INPUT -s $bb -j DROP
echo "iptables -D INPUT -s $bb -j DROP" >> $TPP    ##寫入等待 (準備 3 分鐘後解鎖 )
done
fi
done
sleep 5
done
exit 0

以上是對 Proxy 或同一個人開啟多視窗、或砍站軟體.....以連線數.....統一判斷是否為砍站
可以把 35 和 12 設為較高的數字.......比較不會誤擋.....砍站一定會超過此數字......

(這已可以解決 Proxy 問題、但還不夠準確、還沒加入 LWP 判斷 )

以上僅簡化連線數判斷.....還未判斷是真的進網站....還是砍站軟體...
還是 LWP 灌資料...抓站.....


-----------------防 LWP 或 砍站軟體 ---------------------------
國外很多大型網站......他們沒有使用圖片認證.....也不會被灌水...
也沒有防止會員註冊次數......LWP..才去就被踢出來
怪怪.....它們怎麼做到的........其實很簡單......





待續...........
這陣子須跑 2 次 (禪七) 回來再寫.....


« 上次編輯: 2010-12-14 19:08 由 dctigom »

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17463
    • 檢視個人資料
    • http://www.study-area.org
真好!

羡慕.........

hoyo

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 4047
  • 性別: 男
  • 有需要的時候,學習就不會分階段。
    • 檢視個人資料
    • 樂咖黑電腦學習網
防砍站的分享消失了...
受人與魚,不如授人與漁
上海自來水來自海上;倫敦好奇人奇好敦倫

unitcell

  • 活潑的大學生
  • ***
  • 文章數: 411
    • 檢視個人資料
要漂亮ending.
能否分享您的經驗?

dctigom

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
TO...hoyo 網大......

原本....實在想寫....一些大家用的到的東西.....
但.....才寫開頭......就接到電話.....可能會寫到人家的(飯碗)...
沒錯....人家也是要養家糊口.......


臨時又把它刪了.......請包含........



---------------------------------------------------------------
to  unitcell 
其實只要稍微用心思考.....這裡很多程式寫的都恨好...
參考其他網大寫的程式...自己消化 後.... 就能寫出很好的程式....
重點不在於提供程式......在於關念問題.......
有關念....才知道如何作 (最對~~也最適合自己) .......程式自然就會變的很短.....執行也很快....






« 上次編輯: 2010-12-12 14:09 由 dctigom »

harrier

  • 榮譽博士
  • 俺是博士!
  • *****
  • 文章數: 1856
  • 性別: 男
    • 檢視個人資料
    • 國屬武裝兵
原本....實在想寫....一些大家用的到的東西.....
但.....才寫開頭......就接到電話.....可能會寫到人家的(飯碗)...
沒錯....人家也是要養家糊口.......

只靠這幾行程式碼就會影響到某人無法養家餬口的話...
該檢討的是無法養家餬口的那些仁兄...

因為這些功能都有 opensource 的套件/程式/模組...
...90Net(90:1200/1203),GameNET(99:700/707),ALLNet(92:9200/3111),InfoNet(30:100/103)..MaximusCBCS(浮懷),AirNet,TenderNet,StormNet,FidoNet...
<<- www.nas.vg ->>

dctigom

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
原本....實在想寫....一些大家用的到的東西.....
但.....才寫開頭......就接到電話.....可能會寫到人家的(飯碗)...
沒錯....人家也是要養家糊口.......

只靠這幾行程式碼就會影響到某人無法養家餬口的話...
該檢討的是無法養家餬口的那些仁兄...

因為這些功能都有 opensource 的套件/程式/模組...


網大說的是.......
其實不管是程式或軟體....大家最想要的.....不就是最核心的那幾句是怎麼寫的....其他的機本上都不重要...
畢竟......我能說出來的.......已經不是第一次被念.....把人家那個說出來幹什麼,........這.....唉!!!
新東西出來.....就有人會去破解.....又要想新的.......又破解.......
很多東西想寫.....還真不能寫.....(離職條約)......尚請見諒....

程式再高....還是程式.....怎麼走.....怎麼繞.....如此而已.......
很多東西....反向思維.....就能簡化它.....速度更快.....就能去做更多的事情........

-----------------------------------------
我現在只能聊天打屁.......程式....依條約我暫時不能碰.....
能上來寫寫.....改改網大的程式.....目前.....我僅能作的......

----繁華千秋 , 與我何憂--------










dctigom

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
在辦公室裡......不小心放個屁......都還得打3份報告...
屁是什麼味道.....臭多遠....臭多久.....有多少人聞到.....有沒有外人聞到....
如果只是這樣那也就算了......
就連不小心聞到這個屁的人.....照樣得打份報告.....
--------------------------------------------------------


前陣子.....在公司外的便當店.....跟部門同事吃飯.....
才聊了一下下 cma-OA 作法.....
就這樣.....別說打幾份報告...最後還簽了兩張保密協議才了事...
也不過事吃飯聊幾句而已....唉~~~~~


如能像這裡.....什麼都能寫....什麼都能聊......那就真是天堂了......

apage

  • 活潑的大學生
  • ***
  • 文章數: 337
    • 檢視個人資料
果然是人性.
在 IT界待了六年, 發現不思進取的人比想像中多

仍希望前輩可以分享更多. 用正大光明的方式.
我的筆記
啊,就我的筆記阿...
-----以下兩個是屍體-----
AegisHK
Aegis
eAthena屍體
eathena

dctigom

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
真好!

羡慕.........


netman  兄...

我也不想退休......別羡慕
真是違背良心的工作.....才忿然想退休......


退休....還真是應驗.....那裡涼快那裡去~~~哈哈哈....
-------------------------------------

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17463
    • 檢視個人資料
    • http://www.study-area.org
netman  兄...

我也不想退休......別羡慕
真是違背良心的工作.....才忿然想退休......


退休....還真是應驗.....那裡涼快那裡去~~~哈哈哈....
-------------------------------------


我是很想退休啦,不過沒錢怎麼退呢? ^_|||

Luke Lin

  • 活潑的大學生
  • ***
  • 文章數: 244
  • 性別: 男
  • 家裡的少爺
    • 檢視個人資料
吃人飯碗的人…如何退休?
是個大難題
當好人叫行善  當壞人叫造孽 當爛好人叫自做孽

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
吃人飯碗的人…如何退休?
是個大難題

就連大老闆都很難退休了,更何況被請的...

退休的前提是"錢夠用,不奢求"吧

dctigom

  • 可愛的小學生
  • *
  • 文章數: 7
    • 檢視個人資料
吃人飯碗的人…如何退休?
是個大難題

就連大老闆都很難退休了,更何況被請的...
退休的前提是"錢夠用,不奢求"吧


andyj 兄.....以我所見.....錢永遠不可能夠用.....這是基本人性....
(心) 有沒有放下...如此而已.....
心放下了....不管是不是在工作...不管有多累....與退休沒兩樣.....因為心裡清幽..無雜念...



dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
有不少高薪工作像退休阿 ...

現在多認識些人
說不定將來就有機會擠這種位置