本站已运行

攻城狮论坛

作者: 合肥清默
查看: 5999|回复: 64

主题标签Tag

more +今日重磅推荐Recommend No.1

所有IT类厂商认证考试题库下载所有IT类厂商认证考试题库下载

more +随机图赏Gallery

【新盟教育】2023最新华为HCIA全套视频合集【网工基础全覆盖】---国sir公开课合集【新盟教育】2023最新华为HCIA全套视频合集【网工基础全覆盖】---国sir公开课合集
【新盟教育】网工小白必看的!2023最新版华为认证HCIA Datacom零基础全套实战课【新盟教育】网工小白必看的!2023最新版华为认证HCIA Datacom零基础全套实战课
原创_超融合自动化运维工具cvTools原创_超融合自动化运维工具cvTools
重量级~~30多套JAVA就业班全套 视频教程(请尽快下载,链接失效后不补)重量级~~30多套JAVA就业班全套 视频教程(请尽快下载,链接失效后不补)
链接已失效【超过几百G】EVE 国内和国外镜像 全有了 百度群分享链接已失效【超过几百G】EVE 国内和国外镜像 全有了 百度群分享
某linux大佬,积累多年的电子书(约300本)某linux大佬,积累多年的电子书(约300本)
乾颐堂现任明教教主Python完整版乾颐堂现任明教教主Python完整版
乾颐堂 教主技术进化论 2018-2019年 最新31-50期合集视频(各种最新技术杂谈视频)乾颐堂 教主技术进化论 2018-2019年 最新31-50期合集视频(各种最新技术杂谈视频)
Python学习视频 0起点视频 入门到项目实战篇 Python3.5.2视频教程 共847集 能学102天Python学习视频 0起点视频 入门到项目实战篇 Python3.5.2视频教程 共847集 能学102天
约21套Python视频合集 核心基础视频教程(共310G,已压缩)约21套Python视频合集 核心基础视频教程(共310G,已压缩)
最新20180811录制 IT爱好者-清风羽毛 - 网络安全IPSec VPN实验指南视频教程最新20180811录制 IT爱好者-清风羽毛 - 网络安全IPSec VPN实验指南视频教程
最新20180807录制EVE开机自启动虚拟路由器并桥接物理网卡充当思科路由器最新20180807录制EVE开机自启动虚拟路由器并桥接物理网卡充当思科路由器

VPS屏蔽扫描网站的IP

  [复制链接]
查看: 5999|回复: 64
开通VIP 免金币+免回帖+批量下载+无广告
前段时间博客经常性地无法访问,网站宕机。SSH 上去看进程,发现大量php-fpm 占用系统资源,查看服务器的Nginx 日志,就知道发生了什么事情。个别IP “友情”为我的站点扫描漏洞,瞬时并发连接很大。我知道大家也没什么恶意,只是用黑客工具比较兴奋,拿www.lovelucy.info 练练手而已嘛。但是博主很穷,小站搭建在一个配置并不高的免费VPS 上,折腾不起,压力很大,结果一不小心让各位搞成DoS 拒绝服务攻击了,真是惭愧。
! I& E' U  |8 ~$ [, m, {" T
. I7 Q+ H2 E$ U% l5 T$ s/ ~9 R5 `5 h# A
有趣的是,除掉一些穷举后台密码的,扫描者一股脑地发请求,大部分却是在找asp 的漏洞。可是这样好浪费时间啊,尘埃落定的博客实在是用的wordpress 程序,是php 平台啊……
4 n4 F- E$ c' j7 L1 P, q- y- zGET /mirserver.rar 404
7 w4 ^. f1 r& l; D$ N8 tGET /save.asp 404! R) L; _, S: b; f
GET /wwwroot.rar 404
6 U; E! V: J6 g+ U  X! r: y* h% NGET /upfile_flash.asp 404  i* c- W" e& A$ G- A: ]
GET /web.rar 404
8 ~8 ~; j) C5 F8 nGET /mirserver3.rar 404
, [# Z) z( J" @* s; }GET /www.rar 404
+ o: _2 w3 e( X9 D; W/ G6 gGET /eWebEditor/admin_login.asp 404- l& F+ v+ n$ e. k6 n
GET /mirserver.zip 404
* Q3 b; z; y' ^. [4 {# v+ kGET /wwwroot.zip 404
  O3 O# j8 P0 E, v7 |4 vGET /mirserver4.rar 404% V1 h# E8 q" {8 y# k0 j  {
GET /newsadmin/ubb/admin_login.asp 404
" x- |. p: e3 J7 x5 K  x. b+ |. M, p; qGET /CmsEditor/admin_login.asp 404# ^6 {6 }9 {; E* D# D
GET /admin/webeditor/admin_login.asp 404& b" b/ w$ d* i( r6 |* ]

- d/ }/ l6 g' Z  q+ v$ T/ [$ F言归正传,扫描漏洞的人目的大多是想做黑链SEO,给黑掉的站点加上隐藏链接,提高目标网站在搜索引擎中的排名。这背后已经形成产业链了,可惜这种手段收到的效果已经越来越差,Google 早就不给隐藏链接权重了,现在连百度都能检测出恶意外链,这样一来还有什么意义呢?. B" }7 B% x$ g/ L% X0 u
对于站长来讲,要避免扫描给站点带来的影响,最好是对有关IP 进行屏蔽。在发现网站宕掉,手工用iptables 封了几个IP 后,网站立刻就恢复正常了。* y5 ^: i/ ~' M( p
iptables -I INPUT -s 124.115.0.199 -j DROP! Q. f3 Y! o) b  z4 |1 @
但是过了几天又有别的人来扫描,各种IP 层出不穷,一个个地去封收效甚微。怎么办?
  \/ V0 c1 Z2 S0 v一、使用Nginx 的limit_conn 模块, p+ J- j; d! B* m
Ngnix 服务器的limit_conn 模块可以限制单个IP 的并发连接数,刚了解到它的时候感觉这碉堡了,简直是应用层防火墙了。修改配置文件nginx.conf$ i$ z: G0 ]4 S1 u- Q
http {
8 f( c. ~7 q: t0 c! R' H: O...
- Z; P7 z, ?7 ?8 k: U) `( slimit_zone ten $binary_remote_addr 10m;# D/ ]1 h6 W% w) z# g* L
limit_conn ten 10;1 ]: C$ X. N% t: l( a! O) S. G) R
...
  [6 A2 n3 {8 L}- |. Z4 B5 M, E; \$ X7 P
这样限制使用10M 内存来管理session,同时限制每个IP 可以同时发起最多10 个请求。. T+ n: u2 A$ h) c9 e3 d5 @
二、使用iptables 做连接数控制
% l6 I# W* z4 M8 p) @iptables 也可以做到限制同一IP 的瞬间连接数,如果使用iptables 做并发控制,可以在网络层就把恶意数据包丢弃,理论上讲,效率比Nginx (应用层)的方式更高一些。
8 D+ j6 k; S- c+ o2 B: D( t  Yiptables -I INPUT -p tcp --dport 80 -d SERVER_IP -m state --state NEW -m recent --name httpuser --set" C0 `5 K% K4 R

1 q- S( V, P( R9 @- j( G1 Aiptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j LOG --log-prefix 'HTTP attack: '3 b2 ^* q# }5 o* p7 W! Y
% l+ j( g! v9 N) x( ~0 b
iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 9 -j DROP1 n0 ^+ y! z/ J' g7 F
SERVER_IP 为被攻击的服务器IP。
: @% z5 W- M  H, S! m6 o1. 第一行的意思是:-I,将本规则插入到INPUT 链的最上头。即,所有目标端口是80、目标IP 是我们机器的IP,的TCP 连接,在连接建立时,我们就将其列入 httpuser 清单中。
8 c7 L/ T7 H# K6 B2. 第二行的意思是:-A,将本规则附在INPUT 链的最尾端。只要是60 秒内,同一个来源连续产生9 个连接请求,我们就对此进行Log 记录。记录行会以HTTP attack 开头。 –update 表示规则匹配时会更新httpuser 列表清单。
8 h# p6 ~- R7 I/ ^6 `' D3. 第三行的意思是:-A,将本规则附在INPUT 链的最尾端。和第二行同样的比对条件,但是本次的动作则是将此连接直接丢弃。
/ q: a* r$ ~( l( n5 m! u所以,这三行规则表示,我们允许一个客户端IP,每一分钟内可以向服务器发出8 个连接请求。1 J0 G% w0 M" W+ p. @& R
三、使用Nginx 过滤恶意请求
: I9 q3 U# F1 R* E% R上面两个方法最大的缺陷在于对数值的拿捏十分困难:配置太松,起不到屏蔽扫描的作用;配置太严格,又可能把正常访问也拒绝了,特别是某些搜索引擎过来抓页面的时候。网络环境差异,这个值该设多少,是没有一个标准答案的。
7 b# e0 I5 L8 l& a! B' O& F于是,有外国友人写了一套Nginx 规则,仅仅对恶意 请求进行屏蔽。何为恶意呢?
! k0 g* I+ Y/ X+ a4 C6 {* `server {% N5 h: ]) v5 r6 J9 r& _
[...]
, ]( Z' C7 s) C! N9 N1 E  Z7 q- J; u$ i4 }' T
## Block SQL injections) M, n! N7 @5 M( t/ A
set $block_sql_injections 0;$ ]( i9 `3 }$ G3 C! P
if ($query_string ~ "union.*select.*(") {
0 l4 b( p& C; e5 b/ Q1 ~: jset $block_sql_injections 1;
5 v( s+ p0 {4 T: y( w}' R# o  P# H3 \6 H& |' s
if ($query_string ~ "union.*all.*select.*") {3 |  k! z! W9 u7 m
set $block_sql_injections 1;6 G4 S! B) X" v
}  L1 e8 A/ J9 T
if ($query_string ~ "concat.*(") {
2 K% [: ]: ~# P, e* cset $block_sql_injections 1;- U/ c) Z- s2 f8 x9 H
}
9 h; g- c" T; T; D- x  M2 v- m% oif ($block_sql_injections = 1) {4 I' u9 P/ v% q9 H. r
return 403;6 J4 N% r7 M8 V+ B
}
6 U" g) d* c- [- y; G" N7 f9 E. C; y. H8 P2 h5 @6 m
## Block file injections
: h7 H$ w' Y8 f. Q  Tset $block_file_injections 0;  j$ T( i6 _  ]% ]' T9 A: v
if ($query_string ~ "[a-zA-Z0-9_]=http://") {
3 X0 D6 ^1 M- W- f& o9 S2 O6 @set $block_file_injections 1;' s/ N/ L* Y5 ~
}
# u$ b. p* a( c; rif ($query_string ~ "[a-zA-Z0-9_]=(..//?)+") {$ G, o6 S; Y' b8 E
set $block_file_injections 1;
6 J) m6 ?8 }. Q  s) x}, F2 i1 R. k) F+ Y
if ($query_string ~ "[a-zA-Z0-9_]=/([a-z0-9_.]//?)+") {
4 u& q3 j+ w8 V, Pset $block_file_injections 1;& E& p. u1 D8 ]6 |
}
; X8 _: u, j% g. `: y9 bif ($block_file_injections = 1) {
) F, P1 w" c9 Preturn 403;
5 g; A( _! I+ y}
" U& r/ R1 h+ U9 Y, K  G! f" c
9 g7 T( ?6 U" t1 n2 i## Block common exploits
4 l7 n. Z/ q$ s' f9 B2 c/ i/ aset $block_common_exploits 0;
6 v2 k% X7 c6 B, iif ($query_string ~ "(<|<).*script.*(>|>)") {
' J1 }; r$ k! _" C' U1 Q/ p5 eset $block_common_exploits 1;2 ?. }: V2 I9 c) V6 @& y
}/ y% g$ B/ a6 H" `
if ($query_string ~ "GLOBALS(=|[|%[0-9A-Z]{0,2})") {
7 x, U  U% c( U1 m( Y  _2 @% W! gset $block_common_exploits 1;
9 t3 T1 T" J- d}8 {8 E9 h$ y0 X" J
if ($query_string ~ "_REQUEST(=|[|%[0-9A-Z]{0,2})") {
/ w/ `( N3 i  \$ n; @set $block_common_exploits 1;
* d( a# e$ c% ?" H- `& b}
6 s) p% o7 o% z( ?2 e+ w2 Iif ($query_string ~ "proc/self/environ") {7 v8 f, d- c# Y# h. l) g
set $block_common_exploits 1;
3 y9 E4 H% Q+ p. F' R- L1 V, d}
& E6 R1 h4 Z( k( Tif ($query_string ~ "mosConfig_[a-zA-Z_]{1,21}(=|=)") {
0 j3 @8 J0 G) j) h) P& ^! dset $block_common_exploits 1;& e# \+ R. B( ^4 p9 ~
}7 q* B1 c' h) c, s; D) J
if ($query_string ~ "base64_(en|de)code(.*)") {0 a  E6 w) B8 a2 p2 j9 h
set $block_common_exploits 1;; m1 o$ g* \5 j1 K0 ]3 f9 q- W% F1 r
}% B' d! F% `) I! o2 v
if ($block_common_exploits = 1) {
, B$ U: @: o/ W. `) u6 ^" I. s! N" Areturn 403;- v9 ~' r; K( H+ d
}0 `# ?' h" c2 P

+ P$ U/ k; W6 c, r- i8 v  A7 K+ P## Block spam
: s6 G2 O. g3 s7 M1 `set $block_spam 0;
: Y. W  |6 q" A# b) Rif ($query_string ~ "b(ultram|unicauca|valium|viagra|vicodin|xanax|ypxaieo)b") {1 I6 }( {( m% c  p1 T# w0 S' ?
set $block_spam 1;" ^% q0 `' t. O8 O/ q+ f5 C
}
8 W0 p1 n% M  t4 ~* G4 w5 `. Pif ($query_string ~ "b(erections|hoodia|huronriveracres|impotence|levitra|libido)b") {2 @& I- ^' D, Q, s# Y; F
set $block_spam 1;; R8 i: c: |3 p* x5 }) u. b: _5 B
}
% s% {* ?8 D/ {0 {( }3 i7 f$ Iif ($query_string ~ "b(ambien|bluespill|cialis|cocaine|ejaculation|erectile)b") {
! M& n4 c* m: E% Mset $block_spam 1;6 r% J5 ]! |" k+ E# c) {2 [
}
, k% _- ?( z( p6 |if ($query_string ~ "b(lipitor|phentermin|pro[sz]ac|sandyauer|tramadol|troyhamby)b") {! n, c, j2 m% w
set $block_spam 1;9 I, |/ {. w( X  S3 s. J. E) b
}! q4 j8 M( F2 f" ~0 P
if ($block_spam = 1) {
/ t! E: F# t6 J. `6 Ureturn 403;
0 Y$ M& V+ O/ F7 @3 N}
0 x  @2 h: Y0 y/ i# x5 k" B; K9 B( ?/ w) x) D' |! j/ b* ]3 }
## Block user agents
" _: O! o7 U8 T8 f& E( h3 E7 Jset $block_user_agents 0;2 C4 L/ |; w$ |4 ]# N% X$ F

# W( b& k! f  e6 p! D1 N3 t  M# Don't disable wget if you need it to run cron jobs!1 H5 J( _/ Q# [5 ~& r1 o+ q, W. `
#if ($http_user_agent ~ "Wget") {
* ]4 B9 O6 A. @: e8 t2 t& }$ ?# set $block_user_agents 1;3 `# D$ @$ k: O7 \5 m  b. M5 M9 M
#}5 N6 E' l: ~) w& z6 y$ b4 l1 M
$ C* F% @: F" G, m$ z
# Disable Akeeba Remote Control 2.5 and earlier3 m% i, h1 ]9 G/ m5 D
if ($http_user_agent ~ "Indy Library") {
$ |* P; O9 A) T9 G/ C5 W, @set $block_user_agents 1;% o- E1 q6 q) }$ d8 F5 S* Y
}
; [% D" c2 W2 i: J. h
9 [: |# o  {9 [3 p# Common bandwidth hoggers and hacking tools.
( W( L; y3 m  [( l5 _' _if ($http_user_agent ~ "libwww-perl") {6 W0 \0 I7 f6 D
set $block_user_agents 1;
( j  T  ?! b. x- ^: K( \# y  N/ t}
& R: |1 v! M* `if ($http_user_agent ~ "GetRight") {
/ }7 m! }8 f0 R% |. t' oset $block_user_agents 1;
: a" b! e8 G5 L) K) Y# T6 z}
% D& t1 u3 A: F  Oif ($http_user_agent ~ "GetWeb!") {
( L0 Y; x# w7 I- N9 mset $block_user_agents 1;; ]2 U+ t/ J2 J1 l% A$ z$ |3 a) d
}
7 B+ d" y  `! q* D4 P8 [if ($http_user_agent ~ "Go!Zilla") {
, N7 q4 i+ d" z. h3 yset $block_user_agents 1;
- l: d: H+ d1 G& d4 x! K}2 m, ^  M4 V2 p) f' d; C, E1 `
if ($http_user_agent ~ "Download Demon") {
% D4 U4 e$ c" P' s* b+ V+ ^set $block_user_agents 1;2 T& R( @) V6 E1 n) m+ {: y3 G
}/ _5 l# {/ k" H5 i9 `6 i9 _
if ($http_user_agent ~ "Go-Ahead-Got-It") {. |3 A" }* h! r
set $block_user_agents 1;3 J( x* d/ r5 m3 s+ P1 j
}' s! Q* B* `" i: a) ~
if ($http_user_agent ~ "TurnitinBot") {( Z4 O6 |0 ^' ]: z4 r+ r
set $block_user_agents 1;1 b( J0 l/ Q/ H; A& X, m
}
; P; q8 K; m6 J0 ~/ h% {  f, @+ wif ($http_user_agent ~ "GrabNet") {  M# G' M9 {3 k0 B( Q: N' z
set $block_user_agents 1;3 b/ Q4 C8 Z, K' k1 o
}* q: i1 P! w/ `& D

, z) }1 c6 v& O9 q$ A# R. vif ($block_user_agents = 1) {
$ S. q, K: M- R6 m# O$ ?' b2 nreturn 403;1 ^3 d# N5 _3 _( ]2 G
}
$ S: |+ F5 b/ y; l+ l+ B[...]% J8 [5 `5 r# _3 d& e
}' N; y& T/ f% e' p- L6 {0 p0 h/ P0 i
我们来看上面这个配置文件,它将所有包含类似union.*select.*(URL 参数的请求都拒绝,这样来阻止SQL 注入攻击。又拒绝所有URL 参数后面有=http://的请求,来防止文件包含漏洞。类似地,屏蔽掉所有有|>的请求,阻止跨站脚本。还有就是屏蔽一些预定义的User Agent,拒绝恶意抓站。+ g5 R8 A) }- h* W8 e( d
回过头来看,这个配置其实不太符合我国国情,比如屏蔽的那些浏览器UA,并不是扫描中文网站常见的UA。另外,要在配置文件中定义和枚举所有的恶意行为,是很困难的一件事情。! g' R, T0 l$ ?, r; p# n  N
四、使用脚本定时检测日志- C9 b2 |) U1 f  E6 A. V
所有对服务器的访问请求都会在Nginx 日志中记录,这其中也包括那些造成出错的请求。我们能否通过分析日志来确认恶意的访问请求呢?受第二种方法的启发,我们可以监控服务器日志,将请求出错的访问者IP 放入一个List 特别观察,在一段时间内如果没有太多的出错,我们就将其从列表中移除,否则,错误太多达到警戒值就调用iptable 将其禁封。
8 O4 D9 X2 D3 Y# }& B1 [通过一个脚本就可以完成这项工作。这个脚本与方法二的区别在于,方法二仅仅记录并发连接,只要并发过高,就可以触发禁封,这不够科学。这里我们通过对日志的监控,禁封的只会是给我们造成出错和麻烦的IP(例如频繁的404 错误,明显是扫描),搜索引擎过来就不会有问题了。
; f$ b9 \& n- B" F% g+ ^; r; ?脚本代码
, u: R+ n* q. ]1 }( `#!/usr/bin/perl# C. n* c# D( W( G* K

* i, j2 @7 p# G3 U+ ^use strict;  ]0 ?4 l( W+ l8 k- n
use warnings;2 C0 O" z0 R% ]! m# o' w

3 D" E  A, }! t7 v5 T## 本脚本将会监控Web 服务器的log 记录,(例如Apache 或者Nginx)# f; t* x# M0 E' B: @& R4 R
## 并统计同一个IP 所引发的HTTP 错误数目。该数值达到用户配置的数量,' [/ [$ n3 e9 Q7 Q
## 则使用防火墙对该IP 进行屏蔽,拒绝其访问。
" ]( ]6 [8 K- x
/ F+ E9 w" P- d! m! i## log 文件路径
. s. y; _+ B: }" e% q! ymy $log = "/var/log/nginx/access.log";
. L# ^! M0 C0 ~+ y
1 A3 l, I, ^9 V6 r## 一个IP 触发了多少次错误,我们就将其屏蔽?0 R$ N; z' I5 V
my $errors_block = 10;
% J; b' T6 A5 X8 a) ^1 _# v
' z- f+ {* O* L. a) ]% i## 过期时间,超过多少秒没有再见到该IP 则将其从观察列表中移除?: e8 q' R7 U$ u( ?
my $expire_time = 7200;
3 ?/ k# C; Q) E& V
5 |3 }4 a7 z1 M* L## 将IP 从观察列表中移除时,清理多少个错误日志行数?
) ]% T  j& H# D3 e% S7 Hmy $cleanup_time = 10;3 k+ J1 G) g% _1 M
+ G1 h) f; A1 s! l2 c9 i  S
## 调试模式on=1 off=05 N2 s) o5 `" P  L2 J
my $debug_mode = 1;
% a; i( }7 h) m% L! D) y$ k0 v! N2 W8 ?3 g& b4 w
## 声明一些内部变量1 o  c3 v. p' v2 L( ]. |. P+ C
my ( $ip, $errors, $time, $newtime, $newerrors );$ N9 s* w5 c& x# Z' v
my $trigger_count=1;5 \3 Q; Q2 }& K9 K- L; {  B
my &#65533;usive_ips = ();
- ]& P( h5 E+ y  t! H" Q6 F! O0 C
## 打开日志文件。使用系统的tail 命令,有效轮询1 _, @) u5 I( t( a# d6 f8 g8 G/ `
open(LOG,"tail --follow=$log |") || die "Failed!n"; ## For Linux (Ubuntu) systems
$ Q0 g7 h  _  V# open(LOG,"tail -f $log |") || die "Failed!n"; ## For OpenBSD, FreeBSD or Linux systems
, E1 ~9 c' C% C4 W" J  R7 y" |, }2 ]8 X2 C+ D1 E8 H7 n+ q/ ~
while() {1 L9 z& h- c# p- u7 V, l2 i; ^
## 定义错误代码。这里使用了正则表达式匹配,你可以自行添加一些,
. K9 p# H( Z) I3 C## 例如无端访问.vbs 后缀文件请求,列入屏蔽条件
* d6 }7 [  r, @1 vif ($_ =~ m/( 401 | 402 | 403 | 404 | 405 | 406 | 407 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 444 | 500 | 501 | 502 | 503 | 504 | 505 )/)5 k0 X5 L$ O5 u. C3 `
{2 B9 \7 f9 k- E+ m, a

# }+ A" [% i' x: @" h" U## 自定义: 白名单IP。 不论这些IP 做了什么,均不屏蔽。
. B8 |3 F) z' p## Google 爬虫IP 段66.249/16 就是一个好例子。4 I( y4 g$ a% o/ [
## 为了方便程序员开发测试,内部子网192.168/16 也不屏蔽。
: r1 C" v- z& \" G7 `* \if ($_ !~ m/(^66.249.d{1-3}.d{1-3}|^192.168.d{1-3}.d{1-3})/), h' \* Q3 W: o3 R0 C
{
' ^0 W" ?; N* p6 ^% P1 `3 r' R
  n- B5 f" \( r" g## 从日志行中解析出IP
1 ?  o6 c+ O- l' A6 u2 `: b9 S3 i$time = time();
+ ^0 N. n; _& k+ w4 I2 u* g; ]; T. ^$ip = (split ' ')[0];
, r' s& n3 N7 m1 v( M, R' u6 S. r- j( K* [3 o5 U
## 若IP 之前从未出现过,我们需要初始化,以避免出现警告消息  ~' y, Z' k2 d
$abusive_ips{ $ip }{ 'errors' } = 0 if not defined $abusive_ips{ $ip }{ 'errors' };
! f9 @: C: t2 |; f5 V# @
/ @0 }' N3 K: t; a/ n0 u## 给这个IP 增加出错计数,更新时间戳
& Y9 k9 F8 ^3 ~+ @. M$ Q# ]! i$abusive_ips{ $ip }{ 'errors' } = $abusive_ips{ $ip }->{ 'errors' } + 1;
4 i1 B# s- l! `1 l2 h$abusive_ips{ $ip }{ 'time' } = $time;
5 B' I0 ~& @8 X1 L# y+ P- h8 T* x  h! f# }/ Q  }6 i
## DEBUG: 输出详细信息
; m- G6 G9 T4 |8 mif ( $debug_mode == 1 ) {, h! D1 ~3 J. i9 X
$newerrors = $abusive_ips{ $ip }->{ 'errors' };7 y* F) T! t$ v: V. _0 R7 v! ~
$newtime = $abusive_ips{ $ip }->{ 'time' };
- ]; W; T5 j  s0 u8 M) @+ K/ aprint "unix_time: $newtime, errors: $newerrors, ip: $ip, cleanup_time: $trigger_countn";; h: V. S# c! E9 [# y
}
4 m. P* X# S8 m: v8 V* B. m% U0 o5 i
## 如果该IP 已经触发$errors_block 出错数量,调用system() 函数屏蔽之# m" m/ W+ N& }+ Y6 J8 t
if ($abusive_ips{ $ip }->{ 'errors' } >= $errors_block ) {: k$ ]- e( V: M) p) L
7 D3 p; ~0 h. N; l3 {% X
## DEBUG: 输出详细信息
- O2 }7 z) \4 I" r. H, r2 J: @3 Wif ( $debug_mode == 1 ) {1 a# L/ u$ O/ C$ z" m5 H7 f
print "ABUSIVE IP! unix_time: $newtime, errors: $newerrors, ip: $ip, cleanup_time: $trigger_countn";" j8 B% q, x6 K
}' e% G$ g* l- S  r* z

0 {. F7 R6 `: f- ^1 y+ ?: J% t; ~## 自定义: 这里是屏蔽IP 的system() 系统调用
* f2 C) \) a& R## 你可以对这个IP 添加更多的执行操作。例如,我们使用logger 打印记录到/var/log/messages! d% e. K; B# v) s9 A
## 注释掉的是OpenBSD 系统Pf 防火墙
5 R- f8 d+ U1 E' E" |+ e2 ksystem("logger '$ip blocked by calomel abuse detection'; iptables -I INPUT -s $ip -j DROP");
% d0 p8 e9 ^9 l# system("logger '$ip blocked by calomel abuse detection'; pfctl -t BLOCKTEMP -T add $ip");) R7 v1 K- [( I+ V) t
# i! s- ]7 Y* A4 ^! e. @
## 当IP 已经被屏蔽,它就没必要继续留在观察列表中了0 Y$ g2 e) p8 l: [+ v
delete($abusive_ips{ $ip });! r+ y" k% M4 L7 Z+ s
}, |' v/ `1 z8 N5 R1 C

% S5 r, k! Y- R' d## 为后面的清理函数增加触发计数
6 a8 b! k, T% @; u- g$trigger_count++;( d+ K- G0 ^2 t( T$ ?

& M2 K! J/ b/ u## 清理函数:当触发计数达到$cleanup_time 我们将所有已经过期的条目从$abusive_ips 列表中删除9 [3 l+ y; H' g: O0 M8 t3 R: X
if ($trigger_count >= $cleanup_time) {1 y) ^+ r4 Y' X/ H3 @5 Q
my $time_current = time();  C8 k" V* G$ @1 {6 c# C0 f
* t; O6 X8 e  M) @1 G' I
## DEBUG: 输出详细信息( H+ _; ]9 Z9 E
if ( $debug_mode == 1 ) {) e, G9 o' g' F3 `1 G8 V
print " Clean up... pre-size of hash: " . keys( &#65533;usive_ips ) . ".n";
, [% S$ ^5 e  ~1 @- R2 W}/ X5 P+ F8 U, F+ c

5 J# J' @8 _7 N: f% P## 清理我们已经很久没再见到的IP
0 m- W1 \) O5 ?$ ~. L9 pwhile (($ip, $time) = each(&#65533;usive_ips)){
: |2 G0 b2 c0 B; v* t) g* ~3 B3 E! A
## DEBUG: 输出详细信息) }; |; t3 @  ^* H8 F
if ( $debug_mode == 1 ) {
; x7 w0 u3 ~% p) O# @6 @" C4 cmy $total_time = $time_current - $abusive_ips{ $ip }->{ 'time' };
# n; X5 J: D. z5 F6 Vprint " ip: $ip, seconds_last_seen: $total_time, errors: $newerrorsn";
- Z2 x. l0 X1 m4 E6 b! p}$ K* C) b; h2 t
, l- |& ?! o. H: ^( U7 y) a
## 如果IP 未出现的时间已经超过我们设定的过期时间,则将其从列表中移除
, _: G0 D8 Q4 _8 bif ( ($time_current - $abusive_ips{ $ip }->{ 'time' } ) >= $expire_time) {
3 D& e6 _! u2 x7 hdelete($abusive_ips{ $ip });
3 M: j* P. K" t" K* X( w9 }* e$ X/ V}! c& {* h7 x% ^5 ~' s
}
$ ~& U% x7 t* @* @' ]7 i, P+ D7 z5 Y) m- k% r& y
## DEBUG: 输出详细信息9 s% j/ J5 d$ Y; I7 o) v  z
if ( $debug_mode == 1 ) {
/ h+ ]% f1 C3 W7 Kprint " Clean up.... post-size of hash: " . keys( &#65533;usive_ips ) . ".n";- v2 J' v" n8 A, F
}+ M1 J: i3 b5 g6 p! R2 `

  g% s* o0 D$ g0 ?/ E## 重置清理触发计数
8 O* K: ^( A1 L4 `& \  j$trigger_count = 1;
! s8 o9 D8 _/ q3 _2 O5 M}& o: K- R! r" {* c* [
}, x. l4 Z' L. Y3 Y1 M5 V
}; l7 I% W+ c# l3 Q
}
" g) R# p1 A) w) y- S$ h! J#### EOF ####
' j- y# X+ k9 p9 H! C: H! W保存以上内容到web_server_abuse_detection.pl,增加可执行权限
+ n8 H, d' U4 y& ]  e: tchmod +x web_server_abuse_detection.pl3 `/ Q8 x% u3 H4 a( C) \
变量解释:
+ i6 f) w& p; {) s' |( wmy $log 是要监控的日志路径。日志文件格式是标准的Apache “common” 或 “combined”。这个脚本可以处理Apache, Nginx, Lighttpd 甚至thttpd 的日志,它将会在日志中寻找第一个字符串,即远程连接过来的IP 地址。例如,这个是Google 爬虫访问我网站的一条日志 “66.249.72.6 www.lovelucy.info – …”
; U+ O- _" K3 r/ }, z; _( h3 y, Qmy $errors_block 是一个客户端所能触发的最大错误数量,超过此值IP 将被屏蔽。Web 服务器的错误代码400-417(如果你用Nginx 则还包括444),以及500-505 都是触发条件。我们默认设置errors_block 为10,即如果一个IP 在7200 秒($expire_time) 以内触发了10 个错误($errors_block),它将被屏蔽。7 w8 _2 b, g" Q' b. C, k, H
my $expire_time 是一个IP 从观察列表中移除的过期时间。默认我们设7200 秒(2 小时)。请注意,一个IP 必须在7200 秒以内没有触发任何错误,我们才会将它从列表中移除。这意味着一个恶意用户用很慢的速率扫描,我们仍可能会将其屏蔽。例如,一个IP 每一小时访问一次来检测漏洞,第一个小时它就被列入观察列表,在第二个小时出错计数被增加,同时“最后一次见到这个IP” 的时间戳也被更新。普通的入侵检测系统(IDS) 可能会漏报这样的行为,但这个脚本会在一个较长的时间(2小时)持续跟踪监测一个IP。在这个IP 达到触发10 次错误时,也就是10小时后,我们仍会将其屏蔽。8 H1 g% [2 Z: U& _) v! |% {  e
my $cleanup_time 是触发清理观察列表的出错行数量。清理工作是一个循环,很耗费CPU 所以没必要每一个错误日志行都去执行。请保证你的清理计数值足够低,从而让旧IP 能以合适的速率从列表中移除。但是太低又会耗费CPU,一个恰当的值应该是你的服务器5分钟内所产生的错误日志行数。
( L2 `% E& R2 B5 @8 I5 Kmy $debug_mode 调试模式,会打印出一些有用的信息。
# [1 N! ~; ^# n+ f, b. K自定义白名单:注释中已经说过,Google 机器人IP段66.249/16 就应该放到白名单里,因为任何别人的网站链接到我们的一个错误的URL,都会导致搜索引擎抓取失败。开发人员的IP 也应该放入白名单,因为程序测试也会经常产生失败错误。
: E/ x; `; @" B. p) ?; x! U自定义系统调用:检测到恶意IP 后,我们通过系统调用屏蔽之。默认的调用包括logger 打印消息到/var/log/messages,并执行iptables 屏蔽命令。我们也可以添加更多操作,例如触发一个Nagios 监控警告,给运维人员发Email,等等。
' P1 o# S% @% [3 B2 N运行:' ]. |) y# D- a) L0 \3 m' H
设置my $debug_mode = 0;脚本即会静默运行。要让它在后台运行,不占用终端,则在命令后加一个& 符号2 Z, I0 ]7 ?- m! y) r+ A
./web_server_abuse_detection.pl &
1 r( D9 O7 [9 \- V7 `总结
  a- L5 G! P# l# T月光博客写过一篇《防止CC攻击的方法》,他说现在CC 攻击的技术含量低,利用工具和一些IP 代理,搞个几百个肉鸡,一个初、中级的电脑水平的用户就能够实施攻击。门槛还真低啊。* y- S8 P1 \: R3 x) m
做人还是要低调一点。
! D5 S/ E% T, M+ N$ V: _参考链接:
  q4 \" }+ p: w2 e& T7 kWeb Server Abuse Detection 1 j; Q6 ~5 g5 {# p( K2 |
iptables 限制同一 IP 连接数
6 @" w& o5 `; k, [3 p' w4 y3 A) ^Nginx: How To Block Exploits, SQL Injections, File Injections, Spam, User Agents, Etc
CCNA考试 官方正规报名 仅需1500元
回复 论坛版权

使用道具 举报

haa8434146 [Lv8 技术精悍] 发表于 2013-10-17 15:07:56 | 显示全部楼层
帮帮顶顶!!
回复 支持 反对

使用道具 举报

vexz [Lv8 技术精悍] 发表于 2013-10-20 21:09:18 | 显示全部楼层
学习了,不错,讲的太有道理了
回复 支持 反对

使用道具 举报

jyb75820400 [Lv8 技术精悍] 发表于 2013-10-21 13:40:21 | 显示全部楼层
小手一抖,金币到手!
回复 支持 反对

使用道具 举报

时光后 [Lv8 技术精悍] 发表于 2013-10-21 13:42:59 | 显示全部楼层
过来看看的,感谢攻城狮论坛
回复 支持 反对

使用道具 举报

楚行云 [Lv8 技术精悍] 发表于 2013-10-21 21:52:13 | 显示全部楼层
这是什么东东啊
回复 支持 反对

使用道具 举报

我啊 [VIP@钻石] 发表于 2013-10-22 17:20:44 | 显示全部楼层
过来看看的,感谢攻城狮论坛
回复 支持 反对

使用道具 举报

honey8064 [Lv8 技术精悍] 发表于 2013-10-24 22:54:54 | 显示全部楼层
帮你顶下哈!!
回复 支持 反对

使用道具 举报

sadasz [Lv8 技术精悍] 发表于 2013-10-25 16:35:39 | 显示全部楼层
这是什么东东啊
回复 支持 反对

使用道具 举报

baozun [Lv8 技术精悍] 发表于 2013-10-25 21:25:50 | 显示全部楼层
我抢、我抢、我抢沙发~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|无图浏览|手机版|网站地图|攻城狮论坛

GMT+8, 2026-3-10 08:17 , Processed in 0.124914 second(s), 15 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 © 2001-2013 Comsenz Inc.

Designed by ARTERY.cn