» 您尚未 登录   注册 | 社区服务 | 帮助 | 社区 | 无图版


常州五颜六色网络技术有限公司 -> 网站建设 -> linux自动屏蔽IP工具
 XML   RSS 2.0   WAP 

--> 本页主题: linux自动屏蔽IP工具 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题
deserts


头衔:大客部大客部
该用户目前不在线
级别: 总版主
精华: 0
发帖: 607
威望: 2 点
金钱: 1061 RMB
贡献值: 0 点
在线时间:1761(小时)
注册时间:2006-01-01
最后登录:2025-02-11
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子

linux自动屏蔽IP工具

另存为 firewall.sh 给执行的权限 xY@<<  
2'-o'z<  
#!/bin/sh LB/1To  
# this program is used to check tcp/ip connections LPS]TG\  
# and block those ip with excessive connections H:4? sR3  
!~-@p?kW/  
# my version K Oit7+Q  
myver="1.0RC1" '"]QAj?N  
d 6zfP1lQ  
# wake up every 120s if last check found abuse client OYj~"-3y)  
wakeup_time_min=120 0 /fA>%&  
+OfHa\Nz  
# wake up every 300s if last check found no abuse client cb`ik)=K%  
wakeup_time_max=300 FSHC\8siS  
2}kJN8\F  
# rule timeout 3600s ]Nb~-)t%B  
rule_timeout=3600 :\IZ-  
a4x(lx&  
# check port list fB`7f $[  
portlist="80" Ag_I'   
57`9{.HB  
# max established connection per ip -b'a-?  
max_active_conn=8 d/l>~%bR  
K%(DRkj)  
# iptables chain name <gjA(xT5  
iptables_chain_name="RH-Lokkit-0-50-INPUT" 2_ CJV  
IpKpj"eoLy  
# log facility lvk r2Meu<  
log_facility="local0" &0JCZ /e  
"XWO#,Ue  
# Block policy 1D2Yued  
ipchains_block_policy="DENY" VTs ,Ln!,U  
iptables_block_policy="REJECT" \@F!h8e4  
:{M1]0 NH  
# myself S|/Za".Gr  
myself=`basename $0` NG\^>.8  
ILMXWw  
mylogger_info() faPgp  
{ /rZ`e'}  
logger -p $log_facility.info -t $myself $@ 2>/dev/null b";D*\=x  
} Jpr`E&%I6  
o 12w p  
mylogger_debug() z P=3B%$  
{ %fB!XCW  
logger -p $log_facility.debug -t $myself $@ 2>/dev/null }e4#Mx  
} 7$|L%Sk  
M\)(_I)V=  
mylogger_notice() XS`=8FQ  
{ {p)=#Jd`.P  
logger -p $log_facility.notice -t $myself $@ 2>/dev/null H3Sfz'  
} P=PVOt@ b  
*;X,yEK[  
dotimeout() 6[SE*/E@L  
{ @& }~r  
mylogger_info "reset firewall when timeout arrives" 8 rA'd  
case "$firewall" in k!= jO#)Rd  
ipchains) v5g]_v*F  
  /etc/init.d/ipchains restart 1>/dev/null 2>/dev/null ZGbY  
  if [ $? = 0 ] ; then L6IF0`M<,I  
    mylogger_info "ipchains restarted" O [v(kH'  
  else wh)Ujgd  
    mylogger_notice "ipchains restart failed"  v+qHH8  
  fi oH]"F  
  ;; ra>jVE0 `  
iptables) #(f- cK  
  /etc/init.d/iptables restart 1>/dev/null 2>/dev/null XWNDpL`j5  
  if [ $? = 0 ] ; then @l^BW*BCo  
    mylogger_info "iptables restarted" `6BjNV  
  else /%9CR'%*c  
    mylogger_notice "iptables restart failed" ewD=(yr  
  fi 'H.,S_v1x  
  ;; >p,FAz>  
*) [S#QGB19  
  mylogger_notice "neither ipchains nor iptables" >wJt# ZB  
  ;; |uRZT3bGyj  
esac &yt noj1L(  
whdoG{/  
}  Lkl+f~m  
xK W`m  
blockclient() N@>o:(08  
{ oM4Q_An  
if [ -z "$1" ] || [ -z "$2" ]; then E` aAPk_ y  
mylogger_notice "blockclient() missing client or port to block" z0Bw+& ^]}  
return r"uOf;m  
fi 1y)|m63&  
local ip port ~Vf+@_G8`  
6;8Jy  
ip=$1 _xVtB1@kLM  
port=$2 pf'-(W+  
.tny"a&  
case "$firewall" in ?'L3B4  
ipchains) 28N v'  
  mylogger_notice "blocking $1 to $2 via ipchains" 'Lb- +X,  
found=`ipchains -nL | egrep "^$ipchains_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+\->[[:space:]]+$port"` 7Y>17=|  
if [ -z "$found" ] ; then QlmZ4fT[r  
cmd="ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null" H]XY  
mylogger_debug "cmd: $cmd" O DLRzk(  
`ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null` :s}6a23  
if [ $? != 0 ] ; then <+tSTc4>r  
mylogger_notice "$cmd call failed" D V  
return aU)NbESu  
fi ]&dU%9S  
new_block=1 z~S(OM@olJ  
ever_block=1 ~T{^7"q\  
else BXCB/:0  
mylogger_info "$ip already blocked to $port" fnwhkL#8  
fi lD%Fk3  
  ;; " aEk#W  
iptables) #%;QcDXRe  
  mylogger_notice "blocking $1 to $2 via iptables" 2+2Gl7" s  
found=`iptables -nL | egrep "^$iptables_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+dpt:$port[[:space:]]+"` (SEE(G35  
if [ -z "$found" ] ; then cIL I%W1  
cmd="iptables -I $iptables_chain_name 1 -p tcp -m tcp -s $ip --dport $port -j $iptables_block_policy 1>/dev/null 2>/dev/null" S[2uez`  
mylogger_debug "cmd: $cmd" !R;NV|.eI6  
`iptables -I $iptables_chain_name 1 -p tcp -m tcp -s $ip --dport $port -j $iptables_block_policy 1>/dev/null 2>/dev/null` z^ai *   
if [ $? != 0 ] ; then $j+RUelFY  
mylogger_notice "$cmd call failed" Q|DVB  
return F1Jd-3ei  
fi (mNNTMe  
new_block=1 DFk0"+Ky  
ever_block=1 Qb.Ve7c  
else k Y}r^NaQA  
mylogger_info "$ip already blocked to $port" T4M"s;::1  
fi tFi'RRZ  
  ;; pL& Zcpx  
*) 7gk}f%,3P  
  mylogger_notice "neither ipchains nor iptables" #[uDVCM  
  ;; Fv<^\q  
esac 7xhBdi[ dQ  
} ]UMt  
M3 TsalF  
restartservice() js$L<^7  
{ n&n WY+GEo  
local service \U?$ r[P  
if [ -z "$1" ] ; then f i _'Ny>#  
mylogger_notice "no port given to see which service to be restart" Qms,kX  
return %$*WdK#  
fi P&=H<^yd  
na4^>:r~  
case "$1" in "C/X#y   
80) nn?h;KzB  
  service="httpd" Wp |qv  
  ;; nkxv,_)ZT  
25) (oxMBd+n1  
  service="postfix" y(fJ{k   
  ;; t8?$q})RL  
110) >3qfo2K 0  
  service="courier-pop3d"  {S$61ut  
  ;; k E},>+W+  
21) |\<L7|hb9  
  service="muddleftpd" Ef]<0Tm]:  
  ;; wsEOcaie  
53) :lBw0{fP  
  service="named" HD YWDp  
  ;; 1'YUK"i  
3306) &hcD/*_Z  
  service="mysqld" {WvYb,  
  ;; {HtW`r1)Tt  
esac BIXbdo5F  
if [ ! -z "$service" ] ; then vyvb-oz;u  
/etc/init.d/$service restart 1>/dev/null 2>/dev/null Ke^9R-jP  
if [ $? = 0 ] ; then \OwCZ!`7i  
  mylogger_notice "$service restarted" jct'B}@X(  
else *M-'R*Np  
  mylogger_notice "$service restart failed" .aQ8I1~  
fi +xS<^;   
fi Gc_KS'K@$  
} k'NP+N<M  
j dkqJ4&i  
docheckport() i_:#][nWX  
{  K{9  
mylogger_info "do check port $1" `{NbMc\ ]  
local port last_client count client total_count C@g/{?\  
11%Zx3  
if [ -z "$1" ] ; then I#'yy7J  
mylogger_notice "docheckport() port not given" *xN?5u%  
return Lb?0<  
fi xwj{4fzpk{  
U,lO{J[T  
port=$1 bc;?O`I<  
e-nwR  
clientlist=`netstat -an --tcp| grep ESTABLISHED | awk "{ if ( index(\\$4,\":$port\") ) print \\$5}" | awk -F ':' '{print $1}'|sort` qfRrX"  
if [ $? != 0 ] ; then q{+}0!o  
mylogger_notice "netstat call failed" X`fm5y  
return Zy|u5J  
fi GiKhdy  
#echo $clientlist m}f{o  
# reset new_block W XG0Z  
new_block=0 )-h{0o  
count=0 [Fv_~F491  
total_count=0 [ua[A;K  
last_client="" JSx[V<7m  
for client in $clientlist 1^ iLs  
do Qz"//=hC|H  
#echo "client is $client" GIfs]zVr`  
if [ -z "$last_client" ] ; then foB&H;A4oC  
  count=$((count+1)) +{}p(9w@  
  total_count=$((total_count+1)) )6eFYt%c  
  last_client=$client ?j)#\s2  
else T5}5uk9  
  if [ "$client" = "$last_client" ] ; then Z_7TD)  
  count=$((count+1)) 6/vMK<Fz9  
  total_count=$((total_count+1)) ad52a3deR  
  else 6WoFf  
  mylogger_debug "$last_client $count connections" *~w?@,}  
  if [ $count -ge $max_active_conn ] ; then C4t~k  
    mylogger_notice "client $last_client connection $count >= $max_active_conn" i8DYC=r  
    blockclient $last_client $port ]7RK/Zu i  
  fi jpOcug`f  
  count=1 4VkJtu5  
  total_count=$((total_count+1)) NxB/U_j  
  last_client=$client 23opaX5V=  
  fi rP/W,! 7:K  
fi jO`L:D/C  
done RLGIST`  
# check the last client O<XNI(@  
if [ ! -z "$client" ] ; then G B>T3l"  
count=$((count+1)) "L9pFz</  
total_count=$((total_count+1)) rKl  
mylogger_debug "$client $count connections" NIC.c3  
if [ $count -ge $max_active_conn ] ; then aDE}'d1qo  
  mylogger_notice "client $client connection $count >= $max_active_conn" -or)NE  
  blockclient $client $port 3v)`` n@  
fi >-(,BfZ  
fi T3-/+4$0v  
mylogger_info "total connections on port $port: $total_count" xI ~c~KC  
gNh4c{Al9  
if [ $new_block = 1 ] ; then Nxm '* -A  
restartservice $port hr g'Z5n  
fi 0EC/l OS  
} \K:?#07Wj4  
IY|>'}UU#  
docheckall() B> zQ[e@t  
{ So#>x5dL  
# reset wakeup_time  L$[1+*  
wakeup_time=$wakeup_time_max RNX>I,2sh  
for port in $portlist Ia>~ph#]{`  
do r#^uY:T%  
docheckport $port 1( ]{tF  
if [ $new_block = 1 ] ; then `(@{t:L  
  # set wakeup_time shorter cause we found some abuse client  .+-7 'ux  
  wakeup_time=$wakeup_time_min zB+zw\ncN  
fi aOW$H:b  
done Q_|Lv&  
} e41r!od  
=M34 HPG  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/ipchains ] ; then ]U5/!e  
firewall="ipchains" c nV2}U/\  
fi ~@K!>j  
FJ O- p  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/iptables ] ; then CNyV6jb  
firewall="iptables" \v([,tiW%  
fi bH_zWk  
Bfr$&?j#  
if [ -z "$firewall" ] ; then Np R&`]  
echo "Error: This machine does not have ipchains or iptables firewall support" s;YuB#Z  
exit 1 3[iHe+U(  
fi IHNl`\Le  
9Zpd=m8dU  
mylogger_info "firewall.sh v$myver ValueOf.com starting" SFa~j)9'n  
mylogger_info "Firewall is:       $firewall" %jmL #IN)  
mylogger_info "Port protected:     $portlist" Y'2 |GJc2  
mylogger_info "Max connection per ip: $max_active_conn" ?ZT+4U00U  
mylogger_info "Min time to check:   $wakeup_time_min""s" eEMU,zCl  
mylogger_info "Max time to check:   $wakeup_time_max""s" O O`-{HKt  
mylogger_info "Timeout circle:     $rule_timeout""s" W&8)yog.  
mylogger_info "Output is logged to:   $log_facility" UqaV9  
*S=zJyAO  
# if new ip blocked at this check run? q3-V_~5^/z  
new_block=0 DZ~qk+,I  
# if new ip blocked at this timeout run? t^-yK;`?q:  
ever_block=0 +Q6}kbDI  
# reset wakeup_time h#!u"'JW  
wakeup_time=$wakeup_time_max 9>na3ISh  
# ^~[\8v>  
lasttime=`date +%s` TwZASn]o  
WYklS<B[  
while [ 1 ] A$]&j5nh|  
do KixS)sG  
curtime=`date +%s` B5Y 3GWhrx  
timediff=$((curtime-lasttime)) E u^? e  
#echo "timediff: $timediff" &58+-jzW  
if [ $timediff -ge $rule_timeout ] && [ $ever_block = 1 ] ; then [j]3='2}G  
lasttime=$curtime ,>rr|O  
ever_block=0 _z$lg]q  
dotimeout }bxW@(bs  
fi c[~LI<>ic  
docheckall " tUS>c/  
mylogger_info "sleep for $wakeup_time""s" q{?ku!cL  
sleep $wakeup_time K9YD)351t  
done }  :@s  
 5g{F-  
^K#PcPF-j  
+v`?j+6z  
1. 说明 U?}>A5H  
firewall.sh是一个shell脚本程序,每隔一段时间检查tcp连接的统计信息,如果来自某个ip对某个端口的活动连接超过规定的最大数量, =&J 7 'nDP  
则自动将该IP对该端口的访问屏蔽,并重新启动相应的服务。再每隔一段时间,会重设防火墙到初始状态。 .1[[Y}  
该程序可以同时保护多个端口 RvQl{aL  
i8\&J.  
2. 安装 LyRU2A  
tar zxf firewall-1.0b.tar.gz eco i4f  
cd firewall-1.0b -xc*R%k  
install -m 700 firewall.sh /usr/prima/sbin/firewall.sh {q[l4_  
8KQ]3Z9p  
3. 配置 'n9<z)/,!  
主要配置项目如下: kXmnLxhS/  
# 最小检查周期,缺省为120秒 t_-1sWeA!  
wakeup_time_min=120 \Qh{uk[  
q\P"AlpC!  
# 最大检查周期,缺省为300秒 nty^De%  
wakeup_time_max=600 XF`,mV4  
'8Q:}{  
# 重设防火墙状态的时间,缺省为3600秒 |6%B2I&c  
rule_timeout=3600 FY^[?lj  
(QPfrR=J4  
# 保护的端口列表,缺省为80和25,支持的其他端口包括21(ftp), 110(pop3), 53(named), 3306(mysql) 7>Af"1$g  
# 一般的网络攻击都是针对80和25,又以80居多 TV~ <1vj  
portlist="80 25" (8(7:aE $  
H8V${&!ho  
# 每个ip可占用的最大活动(Established)连接数 lzQmD/ i*  
max_active_conn=8 1ke H1[  
u7_IO  
# iptables防火墙规则链名称,必须和/etc/sysconfig/iptables中一致 ^^u{W|'CaH  
# 如果用的是ipchains,可以忽略此项 eY)JuJ?  
iptables_chain_name="RH-Lokkit-0-50-INPUT" ewNzRH,b  
bZ-"R 6a$  
# 日志输出目标 ?R7>xrp5  
log_facility="local0" ZfPWH'P  
)575JY `6K  
**** 关于检查周期 **** I Xm}WTgF!  
程序定义了两个检查周期,如果上次检查中屏蔽了某个IP,则程序会更频繁地检查连接情况,反之则等待更长时间。通过检查周期 V &K:~[M  
的动态调整,可以有效调度在遭受攻击和正常状态下程序的运行次数。 z|w@eQ",  
xWwQm'I2}  
**** ipchains vs iptables **** Z /#&c  
目前该程序支持ipchains和iptables两种软件防火墙,使用何种是由程序启动时自动检测的。如果/etc/sysconfig/ipchains和 \`H"4r[?(  
/etc/sysconfig/iptables都没有检测到,则报错退出。 _Eus<c  
e)pQh& uD  
**** 日志输出 **** o"^+i#H!  
程序的输出信息记录在系统日志中,目标是local0。如果没有特殊配置,可以在/var/log/messages中看到。建议在/etc/syslog.conf }ze,6T*z  
中加入一条: 5 pJ)OX  
local0.*                 /var/log/firewall.log k<aKT?Ek>  
然后重新启动syslog -8j<`(M' 5  
/etc/init.d/syslog restart _0~WT  
这样,可以将firewall.sh输出的日志单独记到文件/var/log/firewall.log里。 aR3R,6ec  
s:_M+_7_  
4. 运行 _/@VV5Mq  
/usr/prima/sbin/firewall.sh & ~hubh!d=  
:lF[k`S T  
范例输出: >C6wm^bl  
*** firewall.sh v1.0b ValueOf.com*** [@SLt$9"  
Firewall is:       ipchains q+A^JjzT  
Port protected:     80 25 L@ ,-V  
Max connection per ip: 8 d>ltL`xn  
Min time to check:   120s JsNqijVC  
Max time to check:   300s +&LzLF.bK  
Timeout circle:     3600s cR; zNS  
Output is logged to:   local0 h/h`?vWu  
h @{U>U7  
察看/var/log/firewall.log,可以看到: *gu4%  
Oct 16 14:08:55 server firewall.sh: do check port 80                   // 检查80端口 UQGOCP_  
Oct 16 14:08:55 server firewall.sh: 192.168.0.60 2 connections             // 有两个来自192.168.0.60的连接 J(BtGGU'  
Oct 16 14:08:55 server firewall.sh: total connections on port 80: 2         // 80端口总共2个连接 b9M.p*!  
Oct 16 14:08:55 server firewall.sh: do check port 25                   // 检查25端口 [Z2:3*5r.  
Oct 16 14:08:55 server firewall.sh: total connections on port 25: 0         // 25端口没有连接 m'Jk!eo  
Oct 16 14:08:55 server firewall.sh: sleep for 300s                     // 等待300秒 + y!B`'J  
_ pu G?p  
5. 停止 `aY{$>$S  
先用ps命令察看firewall.sh进程的进程号,然后用kill命令将其终止,如 I(6k.PQ  
# ps auxww|grep firewall.sh d*%-r2K  
root   27932 0.0 0.5 2312 1060 pts/2   S   12:38   0:00 /bin/sh /usr/prima/sbin/firewall.sh ;Qpp`  
root   27967 0.0 0.3 1732 592 pts/2   S   12:39   0:00 grep firewall.sh 5pNbO[  
第一行即firewall.sh的进程,用kill命令: 5oz[Njq4  
# kill 27932 !"u) `I2  
[1]   Terminated             /usr/prima/sbin/firewall.sh WNkAI9B  
即将其终止


常州电信/网通机房,100M共享/10M独享/1000M共享/100M独享/电信+网通双线路服务器托管

Tel:0519-89991155 企业QQ:4006023839   5y6s Inc.
[楼 主] | Posted: 2008-01-26 02:12 顶端
deserts


头衔:大客部大客部
该用户目前不在线
级别: 总版主
精华: 0
发帖: 607
威望: 2 点
金钱: 1061 RMB
贡献值: 0 点
在线时间:1761(小时)
注册时间:2006-01-01
最后登录:2025-02-11
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子

通过脚本自动屏蔽非法IP

http://www.bornin76.cn/?p=31 }[Uh4k8P  
X"b4U\A  
最近很是奇怪,我查看我的服务器日志,居然发现有来自全世界[1]的很多人在锲而不舍的试图猜解我的系统密码(遗憾的是还没人可以成功入侵)。我是穷尽我吃奶的智商也想不通,就这么一个破机器(无屏的IBM T23,开博说明里就已经明确说了),上面只是跑了一个可有可无的Blog程序而已,咋就这么多人感兴趣?莫不是都把我这里当成了入侵中央银行的系统入口?我倒是希望这是那个入口哦! AY:3o3M  
&oiX/UaY  
研究了一下,觉得通过对日志文件进行判断,识别出扫描者的IP地址,然后再对其进行处理,这样也许是一种比较不错的简单的解决办法。经过实践,证明这是可行的。脚本代码如下: v vlfL*f  
8YraW|H  
JY0t Hs  
#! /bin/bash !U}A1)  
>yUThhJRn  
SCANIP=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'` 0t5>'GYX  
'T7JXV5  
for i in $SCANIP Yqmx]7Y4  
do a*CP1@O  
NUMBER=`echo $i|awk -F= '{print $1}'` 2*n2!7jZ*  
SCANIP=`echo $i|awk -F= '{print $2}'` w(r$n|Ks9  
echo $NUMBER l7aGo1TcIh  
echo $SCANIP aRq7x~j )\  
if [ $NUMBER -gt 10 ] && [ -z "`iptables -vnL INPUT|grep $SCANIP`" ] J><O 51  
then >?'q P ]  
iptables -I INPUT -s $SCANIP -m state --state NEW,RELATED,ESTABLISHED -j DROP 0-0 )E&2  
echo "`date` $SCANIP($NUMBER)" >> /var/log/scanip.log IG`~^-}7lR  
fi FO_nS   
done x~ s>  
HCHP15otfe  
这个世界终于清静了!有遇到类似情况的朋友可以一试,我的系统是Linux,防火墙是用的Iptables。 z(.$>O&6H  
kjaz{&P  
-J[zJ4z #  
------------------------------------------------------- C>v    
ejgg.G ^  
注释: CSr{MF`]e  
1"/V?ArfL  
有美国、冰岛、日本、韩国、印度、挪威、唐山、内蒙古、广州等等,不过也许只是同一个人通过IP伪装了而已。


常州电信/网通机房,100M共享/10M独享/1000M共享/100M独享/电信+网通双线路服务器托管

Tel:0519-89991155 企业QQ:4006023839   5y6s Inc.
[1 楼] | Posted: 2008-01-26 04:39 顶端

常州五颜六色网络技术有限公司 -> 网站建设



Copyright © 2005-2009 5y6s Inc. 苏ICP备05001866号 Powered by PHPWind 5.0.1
Total 0.026056(s) query 5, Gzip enabled
会员言论不代表本站立场 本站法律顾问:北京汇泽律师事务所 韩律师
QQ:点击这里给我发消息 /点击这里给我发消息 /点击这里给我发消息
51La