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


常州五颜六色网络技术有限公司 -> 网站建设 -> 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 给执行的权限 u{/!BCKE  
cHG>iW9C  
#!/bin/sh R8ui LZd  
# this program is used to check tcp/ip connections yzml4/X  
# and block those ip with excessive connections ~H0WHqcy  
G#~6a%VW  
# my version t\p_QWnF  
myver="1.0RC1" 3}}#'5D  
GsG9;6c+u  
# wake up every 120s if last check found abuse client ?D^l&`S   
wakeup_time_min=120 wJb\Q  
&;)6G1X1  
# wake up every 300s if last check found no abuse client }+_Z|>qv  
wakeup_time_max=300 [P*w$Hn  
otsINAizgS  
# rule timeout 3600s k?Bc^7l:  
rule_timeout=3600 <( 0TK5  
#Moju  
# check port list [}/\W`C  
portlist="80" oXR%A7  
^c9~~m16+  
# max established connection per ip XOM@Pi#z  
max_active_conn=8 Y^?J3[@  
@jE<V=?  
# iptables chain name XG5mfKMt+  
iptables_chain_name="RH-Lokkit-0-50-INPUT" C?FUc cI  
!50Fue^JM  
# log facility .<|7BHL  
log_facility="local0" | Wrf|%p  
Q6cF <L`bW  
# Block policy v :YW[THre  
ipchains_block_policy="DENY" nKFua l3  
iptables_block_policy="REJECT" 6 ]@H.8+  
x. 7Ln9  
# myself _fH.#C  
myself=`basename $0` uC>X;<^   
* Yr)>;^  
mylogger_info() xQ `> \f  
{  /{ .  
logger -p $log_facility.info -t $myself $@ 2>/dev/null c}II"P  
} F*F U[ 5  
,X&lVv#  
mylogger_debug() ?hh  4M  
{ ZB'/DO=i  
logger -p $log_facility.debug -t $myself $@ 2>/dev/null _MfB,CS  
} l@FPTHq  
,C88%k  
mylogger_notice() 5MH\Gq e7  
{ }fW@8ji\  
logger -p $log_facility.notice -t $myself $@ 2>/dev/null vMsb@@O\\  
} *KO4H  
/wB<1b"  
dotimeout() K@P5]}'#  
{ [kx_Izi/T  
mylogger_info "reset firewall when timeout arrives" `}ak;^Me  
case "$firewall" in LB_y lfg  
ipchains) 3jIi$X06  
  /etc/init.d/ipchains restart 1>/dev/null 2>/dev/null agqB#,i  
  if [ $? = 0 ] ; then  h&\%~LO.  
    mylogger_info "ipchains restarted" [ Y _6PR  
  else 4oT1<n`r+  
    mylogger_notice "ipchains restart failed" xQX,1NbH5  
  fi $v?+X20  
  ;; $d M: 5y  
iptables) `#&pB0.y  
  /etc/init.d/iptables restart 1>/dev/null 2>/dev/null > $0eRVL  
  if [ $? = 0 ] ; then Z -`j)3Y  
    mylogger_info "iptables restarted" ]%jlaXb  
  else 4]jN@@  
    mylogger_notice "iptables restart failed" Be+CV">2  
  fi |'WaBy1  
  ;; DTrS9j?z  
*) (( wG K|d  
  mylogger_notice "neither ipchains nor iptables" lwhAF, '$  
  ;; e0%?;w-TL  
esac } )O ^xF ~  
S 8mqz.  
} @EH:4~  
_ETG.SYq  
blockclient() .8hB <G  
{ }I;A\K]  
if [ -z "$1" ] || [ -z "$2" ]; then %;kr%%t%  
mylogger_notice "blockclient() missing client or port to block" } 5i 0R  
return 6>ZUx}vYj  
fi 8MgoAX,p  
local ip port u"r~5  
|i'V\" hW  
ip=$1 MVU5+wX  
port=$2 U^SJWYi<Y  
.|XIF   
case "$firewall" in Wf/Gt\?  
ipchains) |>a  sGP  
  mylogger_notice "blocking $1 to $2 via ipchains" (yWU9q)5  
found=`ipchains -nL | egrep "^$ipchains_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+\->[[:space:]]+$port"` u5^fiw]C  
if [ -z "$found" ] ; then ez_qG=J .  
cmd="ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null" @'`!2[2'?  
mylogger_debug "cmd: $cmd" 62K7afH  
`ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null` cmF&1o3_  
if [ $? != 0 ] ; then q  y73  
mylogger_notice "$cmd call failed" ^ l|{*oj2  
return /n;-f%dL  
fi 3a #2 }  
new_block=1 n[ip'*2L  
ever_block=1 B9pro%R1Bo  
else n;8[WR)  
mylogger_info "$ip already blocked to $port" ^6s <  
fi @Z> {/  
  ;; DdDO.@-Z  
iptables) xrDHXqH  
  mylogger_notice "blocking $1 to $2 via iptables" = #]^H c  
found=`iptables -nL | egrep "^$iptables_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+dpt:$port[[:space:]]+"` 1o\P7P Le  
if [ -z "$found" ] ; then _4F(WCco  
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" oLK-~[p  
mylogger_debug "cmd: $cmd" 8o43J;mA  
`iptables -I $iptables_chain_name 1 -p tcp -m tcp -s $ip --dport $port -j $iptables_block_policy 1>/dev/null 2>/dev/null` -(9>{!",J  
if [ $? != 0 ] ; then /NfuR$oMd  
mylogger_notice "$cmd call failed" /.r|ron:e  
return KdI X`  
fi 'fO[f}oa_.  
new_block=1 Rd~-.&   
ever_block=1 xtW Q.  
else rOd<nP^`\  
mylogger_info "$ip already blocked to $port" _u TaN  
fi ApHs`0=(  
  ;; #DK@&Gv  
*) ) =-$>75Z  
  mylogger_notice "neither ipchains nor iptables" 4FURm@C6  
  ;; .4E5{F{~  
esac AjBwj5K  
} xR;>n[ 6  
Sy|fX_i  
restartservice() )D'SfNx#{  
{ G J"S*30  
local service T-e'r  
if [ -z "$1" ] ; then "(bnr0  
mylogger_notice "no port given to see which service to be restart" (;DnL|"'8  
return (jb9Uk_t  
fi 52Sq;X  
O[%"zO"S  
case "$1" in vbEAd)*S  
80) 'fpm] *ig  
  service="httpd" 32h}+fd  
  ;; 7<FI[  
25) W^j;"qj  
  service="postfix" 7A:k  
  ;; wUb5[m  
110) P?|F+RoX$  
  service="courier-pop3d" #snwRW>=[  
  ;; \"=4)Huv  
21) \S #Mc  
  service="muddleftpd" ]b5E_/P  
  ;; Cj{+DXT  
53) NTq#'O) f  
  service="named" O7<--  
  ;; I*h%e,yIO  
3306) HC1jN8WDY  
  service="mysqld" R=Qa54  
  ;; }ACWSkWK  
esac /hrVnki*  
if [ ! -z "$service" ] ; then _#f+@)vR  
/etc/init.d/$service restart 1>/dev/null 2>/dev/null 2=R}u-@6p  
if [ $? = 0 ] ; then r.-U=ql  
  mylogger_notice "$service restarted" v67utISNI  
else r0MUv}p#|L  
  mylogger_notice "$service restart failed" R1,.H92  
fi *\gS 2[S  
fi s,z$Vt"h*K  
} :eHD{=  
i^<P@ |q  
docheckport() whH_<@!  
{ m!'moumL;  
mylogger_info "do check port $1" $!?tJ@{  
local port last_client count client total_count dSdP]50M  
MKdS_&F;~  
if [ -z "$1" ] ; then 8%+F.r  
mylogger_notice "docheckport() port not given" b\Wlpb=QZ  
return c@|!0 U%j  
fi to2#PXf]y  
{pWb*~!k  
port=$1 n0\k(@+k  
X=1Po|  
clientlist=`netstat -an --tcp| grep ESTABLISHED | awk "{ if ( index(\\$4,\":$port\") ) print \\$5}" | awk -F ':' '{print $1}'|sort` BB$(0mM^  
if [ $? != 0 ] ; then HpXQ D;  
mylogger_notice "netstat call failed" J2_~iC&;s  
return \Fh#CI  
fi w4AA4u  
#echo $clientlist t^k^e{,q#  
# reset new_block `] fud{  
new_block=0 Wx8oTN  
count=0 Y5/SbQYf1  
total_count=0 {0(:5%  
last_client="" K|Cb6''  
for client in $clientlist $n><p>`  
do )01,3J>#  
#echo "client is $client" u4KP;_,m  
if [ -z "$last_client" ] ; then TXWYQ~]3w  
  count=$((count+1)) &i5MRw_]]  
  total_count=$((total_count+1)) W5SCm(QS5  
  last_client=$client ahUc ;S:v#  
else G u4mP  
  if [ "$client" = "$last_client" ] ; then m>:zwz< ;  
  count=$((count+1)) [6u8EP0xM  
  total_count=$((total_count+1)) x & ZW f?  
  else O;6am++M@  
  mylogger_debug "$last_client $count connections" i]{-KZC  
  if [ $count -ge $max_active_conn ] ; then 2R`dyg  
    mylogger_notice "client $last_client connection $count >= $max_active_conn" #,5v#| u|7  
    blockclient $last_client $port + e3{J_  
  fi JFOXrRR=d  
  count=1 -}G>{5.A  
  total_count=$((total_count+1)) 8q/3}AnI  
  last_client=$client L#~z#  
  fi 0Q{^BgW  
fi .kqH}{hf  
done AM:lU  
# check the last client >g+e`!;6  
if [ ! -z "$client" ] ; then w7e+ ~8|  
count=$((count+1)) DlF6tcoI  
total_count=$((total_count+1)) &<Iz?AVr  
mylogger_debug "$client $count connections" gNaB^IY  
if [ $count -ge $max_active_conn ] ; then \(4kEB2s$  
  mylogger_notice "client $client connection $count >= $max_active_conn" 0ME.O +  
  blockclient $client $port ><DXT nt'x  
fi !g2 ~|G  
fi qgkC)  
mylogger_info "total connections on port $port: $total_count" 5tUN'KEbN  
2od 9Q=v~  
if [ $new_block = 1 ] ; then Z~Vups#+f  
restartservice $port \wb0%> 0  
fi iji2gWV}h  
} AD@-H0Y  
\eoJ6IRE\T  
docheckall() @q++eGm\Q  
{ _@A%t&l  
# reset wakeup_time sA:k8aj  
wakeup_time=$wakeup_time_max BWev(SF{Ny  
for port in $portlist !K8V":1du#  
do T(q/$p&q  
docheckport $port ){FXonVP  
if [ $new_block = 1 ] ; then b3^d!#KVM  
  # set wakeup_time shorter cause we found some abuse client <wj}y0(  
  wakeup_time=$wakeup_time_min oeF0t'%  
fi 9`|~- b  
done $e/[!3CASP  
} /;V:<mekf  
!Jk|ha~r  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/ipchains ] ; then t(r}jU=qw  
firewall="ipchains" 4Tn97G 7  
fi R|JBzdK+P  
[`_-;/Gx2  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/iptables ] ; then 9 6j*F,{  
firewall="iptables" mb#&yK(h  
fi ]v|n'D-?  
AB[#   
if [ -z "$firewall" ] ; then @*"H{xo.U  
echo "Error: This machine does not have ipchains or iptables firewall support" )I(2t 6i  
exit 1 w[hT,$n  
fi I*OJPFZ^4  
 Mcm%G#  
mylogger_info "firewall.sh v$myver ValueOf.com starting" rlP?Uh  
mylogger_info "Firewall is:       $firewall" Fz1K*xx'  
mylogger_info "Port protected:     $portlist" \ ix& U  
mylogger_info "Max connection per ip: $max_active_conn" gf^XqTLs  
mylogger_info "Min time to check:   $wakeup_time_min""s" {L.=)zt>  
mylogger_info "Max time to check:   $wakeup_time_max""s" G{4lgkyy  
mylogger_info "Timeout circle:     $rule_timeout""s" 7J[s5'~|  
mylogger_info "Output is logged to:   $log_facility" Jt|W %`X>D  
%Q y9X+N:  
# if new ip blocked at this check run? _h0hl]rf  
new_block=0 F,/yK-9  
# if new ip blocked at this timeout run? 1 TA\6a}  
ever_block=0 fYUbr"Oe  
# reset wakeup_time m'YYkq(5%Z  
wakeup_time=$wakeup_time_max X(dHh O  
1/<Z6 ?U  
lasttime=`date +%s` &T2qi'  
;'P<#hM[$  
while [ 1 ] *Y<1KXFU  
do @zi_@B  
curtime=`date +%s` Dh.pH1ZY3n  
timediff=$((curtime-lasttime)) <= Aqi91  
#echo "timediff: $timediff" GjeRp|_Qd<  
if [ $timediff -ge $rule_timeout ] && [ $ever_block = 1 ] ; then Yu_` >so  
lasttime=$curtime i8i~b8r]  
ever_block=0 _ Y8j l,J  
dotimeout 8c5%~}kG  
fi \Ws$@ J-M  
docheckall WNWtQ2]  
mylogger_info "sleep for $wakeup_time""s" ,@r 0-gL  
sleep $wakeup_time !B:wzb_  
done Rn5{s3?F~2  
{LoNp0i1a  
5%;=(Oig  
\>p\~[cxt  
1. 说明 r9!,cs  
firewall.sh是一个shell脚本程序,每隔一段时间检查tcp连接的统计信息,如果来自某个ip对某个端口的活动连接超过规定的最大数量, vCsJnKqK  
则自动将该IP对该端口的访问屏蔽,并重新启动相应的服务。再每隔一段时间,会重设防火墙到初始状态。 -PLh|  
该程序可以同时保护多个端口 r l>e~i  
C[Nh>V7=  
2. 安装 /{ FSG!  
tar zxf firewall-1.0b.tar.gz Be~In~~  
cd firewall-1.0b ]=?.LMjnH  
install -m 700 firewall.sh /usr/prima/sbin/firewall.sh 8 GW0w  
hL}AgY@  
3. 配置 (;cvLop  
主要配置项目如下: %WAaoR&u  
# 最小检查周期,缺省为120秒 rhj_cw  
wakeup_time_min=120 W~d^ *LZt  
w'zSV1  
# 最大检查周期,缺省为300秒 CQ/ps,~M  
wakeup_time_max=600 ` IH*~d]  
).8NZ Aj  
# 重设防火墙状态的时间,缺省为3600秒 Z@6xu;O  
rule_timeout=3600 Ut hM?g^  
(65|QA   
# 保护的端口列表,缺省为80和25,支持的其他端口包括21(ftp), 110(pop3), 53(named), 3306(mysql) uh&Qdy!I  
# 一般的网络攻击都是针对80和25,又以80居多 mae@ L  
portlist="80 25" n7(/ml+Q_  
JV@b(x`  
# 每个ip可占用的最大活动(Established)连接数 ]!v\whZ>  
max_active_conn=8 d~z%kl 5:  
%z"n}|%!  
# iptables防火墙规则链名称,必须和/etc/sysconfig/iptables中一致 - sL4tMP  
# 如果用的是ipchains,可以忽略此项 5m9;'SF  
iptables_chain_name="RH-Lokkit-0-50-INPUT" LjPpnjU  
xaNM ?]%  
# 日志输出目标 m*'87a9q0  
log_facility="local0" Nc:0opPM  
2aJ_[3p/h]  
**** 关于检查周期 **** jq( QL%)_O  
程序定义了两个检查周期,如果上次检查中屏蔽了某个IP,则程序会更频繁地检查连接情况,反之则等待更长时间。通过检查周期  DMiB \o  
的动态调整,可以有效调度在遭受攻击和正常状态下程序的运行次数。 QS%t:,0lp  
UNyk, #4  
**** ipchains vs iptables **** "Zu>cbE  
目前该程序支持ipchains和iptables两种软件防火墙,使用何种是由程序启动时自动检测的。如果/etc/sysconfig/ipchains和 <Y+>a#T  
/etc/sysconfig/iptables都没有检测到,则报错退出。 #BwOWra  
1-~sj)*k  
**** 日志输出 **** e,Sxu[2  
程序的输出信息记录在系统日志中,目标是local0。如果没有特殊配置,可以在/var/log/messages中看到。建议在/etc/syslog.conf Tzr'3m_  
中加入一条: F5%IsAH  
local0.*                 /var/log/firewall.log D| g{]nO  
然后重新启动syslog Vw+RR i(  
/etc/init.d/syslog restart jO}<W1qy  
这样,可以将firewall.sh输出的日志单独记到文件/var/log/firewall.log里。 T[%@B"  
t (Gg 1  
4. 运行 !'*1;OQ  
/usr/prima/sbin/firewall.sh & nTCwLnX(O  
ZG8Xr "  
范例输出: Uf#9y182*c  
*** firewall.sh v1.0b ValueOf.com*** =`.OKUAn  
Firewall is:       ipchains >r.W \  
Port protected:     80 25 K(rWM>Jv  
Max connection per ip: 8 b=XHE1^rM  
Min time to check:   120s v)<|@TD)  
Max time to check:   300s =6gi4!hE  
Timeout circle:     3600s o ^""=Z  
Output is logged to:   local0 ~2[mZias  
t4<+]]   
察看/var/log/firewall.log,可以看到: y\ax?(z  
Oct 16 14:08:55 server firewall.sh: do check port 80                   // 检查80端口 t(p}0}Pp  
Oct 16 14:08:55 server firewall.sh: 192.168.0.60 2 connections             // 有两个来自192.168.0.60的连接 n a+P|'6  
Oct 16 14:08:55 server firewall.sh: total connections on port 80: 2         // 80端口总共2个连接 > *soc!#Y  
Oct 16 14:08:55 server firewall.sh: do check port 25                   // 检查25端口 fT.MglJcb  
Oct 16 14:08:55 server firewall.sh: total connections on port 25: 0         // 25端口没有连接 F[*/D/y(  
Oct 16 14:08:55 server firewall.sh: sleep for 300s                     // 等待300秒 HM &"2c  
lsKQZ@LN`  
5. 停止 \ {;3'<  
先用ps命令察看firewall.sh进程的进程号,然后用kill命令将其终止,如 Sh\Jm*5  
# ps auxww|grep firewall.sh ]|_+lik#  
root   27932 0.0 0.5 2312 1060 pts/2   S   12:38   0:00 /bin/sh /usr/prima/sbin/firewall.sh WkDXWv\{,{  
root   27967 0.0 0.3 1732 592 pts/2   S   12:39   0:00 grep firewall.sh 6@FGt3y  
第一行即firewall.sh的进程,用kill命令: </D )i  
# kill 27932 /i(R~7;?  
[1]   Terminated             /usr/prima/sbin/firewall.sh -l ?\hmDl  
即将其终止


常州电信/网通机房,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 Wg20H23XW  
vmh>|N4a7  
最近很是奇怪,我查看我的服务器日志,居然发现有来自全世界[1]的很多人在锲而不舍的试图猜解我的系统密码(遗憾的是还没人可以成功入侵)。我是穷尽我吃奶的智商也想不通,就这么一个破机器(无屏的IBM T23,开博说明里就已经明确说了),上面只是跑了一个可有可无的Blog程序而已,咋就这么多人感兴趣?莫不是都把我这里当成了入侵中央银行的系统入口?我倒是希望这是那个入口哦! J57; X=M  
.R l7,1\  
研究了一下,觉得通过对日志文件进行判断,识别出扫描者的IP地址,然后再对其进行处理,这样也许是一种比较不错的简单的解决办法。经过实践,证明这是可行的。脚本代码如下: x2'pl (^  
p$uPj*  
wJ7^)tTRF  
#! /bin/bash @C^wV  
\+=`o .2  
SCANIP=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'` e\O-5hp7  
fI1 9p Q  
for i in $SCANIP 6P:fM Y  
do t=9f:,I$  
NUMBER=`echo $i|awk -F= '{print $1}'` crN*eFeW  
SCANIP=`echo $i|awk -F= '{print $2}'` C!ch !E#  
echo $NUMBER r-yUWIr S  
echo $SCANIP TiF+rA{t  
if [ $NUMBER -gt 10 ] && [ -z "`iptables -vnL INPUT|grep $SCANIP`" ] #<Lv&-U<KT  
then E AZX  
iptables -I INPUT -s $SCANIP -m state --state NEW,RELATED,ESTABLISHED -j DROP F-oe49p5e  
echo "`date` $SCANIP($NUMBER)" >> /var/log/scanip.log vB}c6A4'U  
fi 1z-A3a/-  
done IvlfX`("  
0{ ~2mggh  
这个世界终于清静了!有遇到类似情况的朋友可以一试,我的系统是Linux,防火墙是用的Iptables。 a(=lQ(v/?  
,.} %\GhY  
kkWv#,qwU  
------------------------------------------------------- g6;smtu_T  
OM{^F=Ap  
注释: Em^~OM3U$q  
.a7RGT3]m  
有美国、冰岛、日本、韩国、印度、挪威、唐山、内蒙古、广州等等,不过也许只是同一个人通过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.018796(s) query 5, Gzip enabled
会员言论不代表本站立场 本站法律顾问:北京汇泽律师事务所 韩律师
QQ:点击这里给我发消息 /点击这里给我发消息 /点击这里给我发消息
51La