ban_ip_with_memcached_flood這篇文章根據(jù) 互聯(lián)網(wǎng)網(wǎng)站的反爬蟲(chóng)策略淺析 使用php實(shí)現(xiàn)
假設(shè)現(xiàn)有一phpwind搭建論壇,,在global.php文件內(nèi)require_once(‘ban_ip_with_memcached_flood.php’)
ban_ip_with_memcached_flood.php文件
05 |
$memcache_obj = new Memcache; |
06 |
$memcache_host = "127.0.0.1" ; |
07 |
$memcache_obj ->connect( $memcache_host , 11211) or die ( "Could not connect memcached at localserver" ); |
13 |
if ( $HTTP_SERVER_VARS [ "HTTP_X_FORWARDED_FOR" ]) |
15 |
$ip = $HTTP_SERVER_VARS [ "HTTP_X_FORWARDED_FOR" ]; |
17 |
elseif ( $HTTP_SERVER_VARS [ "HTTP_CLIENT_IP" ]) |
19 |
$ip = $HTTP_SERVER_VARS [ "HTTP_CLIENT_IP" ]; |
21 |
elseif ( $HTTP_SERVER_VARS [ "REMOTE_ADDR" ]) |
23 |
$ip = $HTTP_SERVER_VARS [ "REMOTE_ADDR" ]; |
25 |
elseif ( getenv ( "HTTP_X_FORWARDED_FOR" )) |
27 |
$ip = getenv ( "HTTP_X_FORWARDED_FOR" ); |
29 |
elseif ( getenv ( "HTTP_CLIENT_IP" )) |
31 |
$ip = getenv ( "HTTP_CLIENT_IP" ); |
33 |
elseif ( getenv ( "REMOTE_ADDR" )) |
35 |
$ip = getenv ( "REMOTE_ADDR" ); |
47 |
$iptable_statement = "iptables -A INPUT -i eth0 -j DROP -p tcp --dport 80 -s $client_ip" ; |
48 |
# echo ( $iptable_statement ); |
49 |
$ip_counter = $memcache_obj ->increment( $client_ip ); |
50 |
#var_dump( $ip_counter ); |
52 |
$memcache_obj ->set( $client_ip ,1, 0, 60); |
53 |
} elseif ( $ip_counter >300) { |
54 |
$crawler_counter = $memcache_obj ->increment( "crawler/$client_ip" ); |
55 |
if (! $crawler_counter ) { |
56 |
$memcache_obj ->set( "crawler/$client_ip" ,1, 0, 60); |
58 |
elseif ( $crawler_counter >50){ |
59 |
#BlackList.add(ip_sec) |
61 |
# echo exec ( $iptable_statement ); |
62 |
echo exec ( "echo 'deny $client_ip;\n'>>/d/nginx/conf/ip_ban.conf" ); |
64 |
# echo exec ( "nginx -s reload" ); |
65 |
header( 'HTTP/1.1 403 Forbidden' ); |
66 |
die ( "Unauthorized access forbidden! 爬蟲(chóng)再見(jiàn)" ); |
68 |
#var_dump( $crawler_counter ); |
70 |
header( 'HTTP/1.0 401 Unauthorized' ); |
71 |
die ( "Unauthorized access forbidden! 未認(rèn)證授權(quán)" ); |
72 |
#render :template => 'test' , :status => 401 and return false |
這里的 ip_ban.conf 是nginx的 httpaccess module 加載配置文件,,利用它和crontab來(lái)實(shí)現(xiàn)每2秒重新reload
nginx配置文件禁止ip訪問(wèn),,從0.8版本開(kāi)始nginx的reload方法 /d/env/nginx/sbin/nginx -s reload
01 |
mkdir -p /d/env/crontab |
02 |
#創(chuàng)建cron執(zhí)行的shell文件 |
03 |
nano /d/env/crontab/nginx_ban_ip.sh |
07 |
/d/nginx/sbin/nginx -t |
08 |
/d/nginx/sbin/nginx -s reload |
11 |
chmod +x /d/env/crontab/nginx_ban_ip.sh |
13 |
#給ip_ban加上www執(zhí)行權(quán)限,由于我的nginx和php都是www用戶執(zhí)行 |
14 |
chmod 777 /d/nginx/conf/ip_ban.conf |
15 |
chown www:www /d/nginx/conf/ip_ban.conf |
16 |
ll /d/nginx/conf/ip_ban.conf |
18 |
#crontab -e 添加2分鐘執(zhí)行shell的語(yǔ)句 |
19 |
*/2 * * * * /d/env/crontab/nginx_ban_ip.sh |
找到一款不錯(cuò)的網(wǎng)站壓力測(cè)試工具webbench[原創(chuàng)]
使用該壓力測(cè)試對(duì)nginx服務(wù)器進(jìn)行虐待,,測(cè)試以上反爬蟲(chóng)效果,,注意linux系統(tǒng)專用
webbench -c 200 -t 30 http://www./
30秒內(nèi)開(kāi)啟瀏覽器訪問(wèn)網(wǎng)址吧 ,應(yīng)該會(huì)顯示“爬蟲(chóng)再見(jiàn)”,2分鐘之后nginx就會(huì)重讀配置文件,,之后返回403,,ip地址被禁止訪問(wèn)了。
(403頁(yè)面可以自定義)