网站首页 | 控制面板 | 短消息 | 搜索 | 会员 | 帮助 | 社区 | 首页 | 无图版


常州五颜六色网络技术有限公司 -> 网站建设 -> linux自动屏蔽IP工具 转到动态网页

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


头衔:大客部大客部

级别: 总版主
精华: 0
发帖: 315
威望: 2 点
金钱: 579 RMB
贡献值: 0 点
在线时间:282(小时)
注册时间:2006-01-01
查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子


linux自动屏蔽IP工具

另存为 firewall.sh 给执行的权限 U&C\5N]  
eqD%Qdx  
#!/bin/sh uh\I'  
# this program is used to check tcp/ip connections ;dRTr *  
# and block those ip with excessive connections ^TVica  
$V]D7kDph*  
# my version @NlnZfMu  
myver="1.0RC1" yb* SD!  
@,CCwiF'q  
# wake up every 120s if last check found abuse client ?q7V B  
wakeup_time_min=120 +NxEx/{  
 6?+bi\6  
# wake up every 300s if last check found no abuse client ^.mQ~F  
wakeup_time_max=300 R5 X<8(4p  
sw'20I  
# rule timeout 3600s {b<p~3%+Hc  
rule_timeout=3600 N1\u~%AT"  
>9esZA^';  
# check port list tU!"CX  
portlist="80" q_g'4VZv  
Fr,>|  
# max established connection per ip ='pssdB  
max_active_conn=8 TA`*]*O(  
W+H 27qsv  
# iptables chain name ]QtdT8~  
iptables_chain_name="RH-Lokkit-0-50-INPUT" > 9JzYI^  
^ ^}  
# log facility 59$mfW o>  
log_facility="local0" Y%^&aacZ  
W7l/{a @  
# Block policy _:c8YJEG{  
ipchains_block_policy="DENY" M_T$\z;,  
iptables_block_policy="REJECT" 2(5wFc  
VMad ]bEf  
# myself ^KF  
myself=`basename $0` w{F8]N>0<  
iq5h[  
mylogger_info() }-V .upl  
{ BtBy.bR  
logger -p $log_facility.info -t $myself $@ 2>/dev/null ~b3xn T  
} @s/;y VVq  
&I:X[=;g  
mylogger_debug() nl*{@R.q @  
{ KT{ <iz_  
logger -p $log_facility.debug -t $myself $@ 2>/dev/null  Tx/  
} p tv  
v^[tK2&v  
mylogger_notice() $w[@L7'(  
{ [53@ '@26  
logger -p $log_facility.notice -t $myself $@ 2>/dev/null p|(910OEQ  
} NZ{kjAd3c  
lH:TE=|4  
dotimeout() >^|\wy  
{ Eqp?cKrji  
mylogger_info "reset firewall when timeout arrives" Jc`LUJ T  
case "$firewall" in kVkV~  
ipchains) ukS@8/eJ  
  /etc/init.d/ipchains restart 1>/dev/null 2>/dev/null . g(yTA  
  if [ $? = 0 ] ; then T-fW[][&$  
    mylogger_info "ipchains restarted"  ;lW0p8  
  else 8@6:UR.)  
    mylogger_notice "ipchains restart failed" hrU.QF8  
  fi EZ1H0fm  
  ;; hP3I_I[qF}  
iptables) A[htG\A` 0  
  /etc/init.d/iptables restart 1>/dev/null 2>/dev/null egx(N <  
  if [ $? = 0 ] ; then B wtD!de$  
    mylogger_info "iptables restarted" IH}?CZ@{?  
  else N=tyaS(YJ  
    mylogger_notice "iptables restart failed" JaG<.ki  
  fi ofcoNLX5c  
  ;; 1ReO.Dd`R  
*) [K&O]s<Y  
  mylogger_notice "neither ipchains nor iptables" cU%#oEMf<  
  ;; (yc$W9  
esac ,dzbI{@6  
~u,g5  
} >/5D/}4  
*% Vd2jW/  
blockclient() *=@Z\]"?  
{ #mx;t3ja7  
if [ -z "$1" ] || [ -z "$2" ]; then 1MfRF v  
mylogger_notice "blockclient() missing client or port to block" rIW`(IG_  
return Q}\,7l  
fi dL6sb;7R  
local ip port qLA  
t~sW]<qjp  
ip=$1 lS XhHy  
port=$2 ou,W|<%  
aH'^`]'_=  
case "$firewall" in ~NU~jmT2  
ipchains) >[ lj8n  
  mylogger_notice "blocking $1 to $2 via ipchains" I`Rxijz  
found=`ipchains -nL | egrep "^$ipchains_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+\->[[:space:]]+$port"` <pK; D  
if [ -z "$found" ] ; then IK~ur\3  
cmd="ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null" =k3QymA  
mylogger_debug "cmd: $cmd" -?LSw  
`ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null` r8^1JJ~\  
if [ $? != 0 ] ; then {oBVb{<  
mylogger_notice "$cmd call failed" F^A1'J  
return eUF PzioW  
fi A{&Etu(K  
new_block=1 -bo0!@MK  
ever_block=1 &W.tjqmw  
else -pg7>vOq  
mylogger_info "$ip already blocked to $port" MKoN^(7  
fi 'y'>0'et  
  ;; qDcl;{L  
iptables) W%vh7>.  
  mylogger_notice "blocking $1 to $2 via iptables" I&1Mh4yu  
found=`iptables -nL | egrep "^$iptables_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+dpt:$port[[:space:]]+"` v[ F_r  
if [ -z "$found" ] ; then 6@Eip[e  
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" EWH'x$z_q  
mylogger_debug "cmd: $cmd" K;[V`) d'  
`iptables -I $iptables_chain_name 1 -p tcp -m tcp -s $ip --dport $port -j $iptables_block_policy 1>/dev/null 2>/dev/null` #n~/~*:i92  
if [ $? != 0 ] ; then li/O&@g`  
mylogger_notice "$cmd call failed" BMFpkK9|  
return BT`/O D@  
fi iW)FjDTP  
new_block=1 ijyj}gpWha  
ever_block=1 w9.r`_-  
else FA4bv9:hi  
mylogger_info "$ip already blocked to $port" (VBoZP=W  
fi `$MO.K{  
  ;; E\RQm}Z09  
*) O-  r"G  
  mylogger_notice "neither ipchains nor iptables" }>)"!p;t_  
  ;; nM}X1^PiK"  
esac UN,@K9  
} !>t |vgW  
"d.qmM  
restartservice() 9LCV"xgX  
{ 7b'XQ/rs  
local service (A(d]l  
if [ -z "$1" ] ; then Pf@8C{I  
mylogger_notice "no port given to see which service to be restart" 'SOp!h$  
return jQsucs5$h  
fi w l5!f|  
z @<`]  
case "$1" in X}Fc0Oo  
80) v*]|1q%/  
  service="httpd" qZA?M=NT?  
  ;; hQl3F6-ud  
25) 6,s@>8n  
  service="postfix" H={fY:%  
  ;; ~?[@KK  
110) QLIm+)T  
  service="courier-pop3d" wIi(p5*  
  ;; QD / | zi  
21) {b]WLBy  
  service="muddleftpd" OL=IUg"  
  ;; G^ n|9)CVW  
53) #M{}Grg  
  service="named" Ct #hl8b:  
  ;; %{o5 }TqD  
3306) PjRKYa_U  
  service="mysqld" -41L^Di\  
  ;; mN ~;MR;  
esac SM0=  
if [ ! -z "$service" ] ; then i-tX5Md|  
/etc/init.d/$service restart 1>/dev/null 2>/dev/null :Wb+&|dU  
if [ $? = 0 ] ; then c3K(mM:  
  mylogger_notice "$service restarted" ?WUu@Z  
else ]+fL6"OD/2  
  mylogger_notice "$service restart failed" ~EX/IIa{  
fi MPM_/dn-  
fi OP``g/x)  
} (QqKttL:  
?4gYUEM#  
docheckport() >f}rM20Vm  
{ FDpNM\SR1l  
mylogger_info "do check port $1" h9SS o0]F  
local port last_client count client total_count KA%tVBl  
>/evL /  
if [ -z "$1" ] ; then +F4xCz7f  
mylogger_notice "docheckport() port not given" e$Md ?Pq  
return 2Ni2Gkf@  
fi j3A+:KDn3n  
a Se.]_  
port=$1 8fZ\})t  
JWH}0+1*  
clientlist=`netstat -an --tcp| grep ESTABLISHED | awk "{ if ( index(\\$4,\":$port\") ) print \\$5}" | awk -F ':' '{print $1}'|sort` Z#^2F8,]  
if [ $? != 0 ] ; then <>2QDI6_  
mylogger_notice "netstat call failed" [o> /2  
return o$Hc5W([Z  
fi 9;JU c0%  
#echo $clientlist M!mTNIj8~  
# reset new_block X9zTz2 Fy  
new_block=0 ?Cmb3pX^\  
count=0 7.akp  
total_count=0 /`2VJw  
last_client="" vT3LhN+1  
for client in $clientlist b @5&<V;r2  
do p7 2 +:I  
#echo "client is $client" bCA3w%,k M  
if [ -z "$last_client" ] ; then lL%7lO   
  count=$((count+1)) m0/J3  
  total_count=$((total_count+1)) h'T\gF E%  
  last_client=$client _VR4 |)1g  
else eYR/kZ %<  
  if [ "$client" = "$last_client" ] ; then _%<7!|"  
  count=$((count+1)) yf_<o   
  total_count=$((total_count+1)) Ia>qVM0  
  else I~4 `NV0  
  mylogger_debug "$last_client $count connections" {jlm]<:&Z  
  if [ $count -ge $max_active_conn ] ; then /?2yo{F g  
    mylogger_notice "client $last_client connection $count >= $max_active_conn" X2sK<Qluql  
    blockclient $last_client $port zse! t  
  fi Z(U&0GH`  
  count=1 TpMfk7-  
  total_count=$((total_count+1))  Uc7X)  
  last_client=$client jY ^ndr0;  
  fi |Zkcs]8M!  
fi i.K}(bo;b  
done /[{?zS{  
# check the last client ,wZ[Y 3  
if [ ! -z "$client" ] ; then }3)$aI_  
count=$((count+1)) {L<t6A  
total_count=$((total_count+1)) #gsAw na3  
mylogger_debug "$client $count connections" |fRajuA;  
if [ $count -ge $max_active_conn ] ; then &TC  
  mylogger_notice "client $client connection $count >= $max_active_conn" Qj3UO]>  
  blockclient $client $port )Oj bmU!7  
fi X Phw0aV  
fi \a|gzC1G  
mylogger_info "total connections on port $port: $total_count" j}h50*6KO  
C"0gAN  
if [ $new_block = 1 ] ; then JziMjR  
restartservice $port ym,S /Uz  
fi Z39^nGO  
} w(mn@Qc  
^!kv gm<{$  
docheckall() " I_T  
{ %iJ6;V 4  
# reset wakeup_time ?$r+#'asd(  
wakeup_time=$wakeup_time_max m=y6E, _  
for port in $portlist 6E_YQbdy  
do %81tVhg  
docheckport $port lXB_ HDY  
if [ $new_block = 1 ] ; then tQ|b?3  
  # set wakeup_time shorter cause we found some abuse client HkrNh>^=  
  wakeup_time=$wakeup_time_min sPd5f2'  
fi A= ,q&  
done tQwbIX-7/  
} qqkZbsN  
co~TQpy^  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/ipchains ] ; then z Gz5|u  
firewall="ipchains" 6qH o$#iT  
fi 2;kab^iv'  
XeZv%` ?  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/iptables ] ; then (tVY /(~#  
firewall="iptables" _L: /2  
fi 6\E |`  
Zj}DlNkVu  
if [ -z "$firewall" ] ; then OZISh?  
echo "Error: This machine does not have ipchains or iptables firewall support" Gt 2rJ<>  
exit 1 <'gCIIa2  
fi ?rv+ydR/q  
mBnC]$<R  
mylogger_info "firewall.sh v$myver ValueOf.com starting" \k g2pF[V  
mylogger_info "Firewall is:       $firewall" mFo6f\DHr`  
mylogger_info "Port protected:     $portlist" Fa>Y]Y0r  
mylogger_info "Max connection per ip: $max_active_conn" +$v$P!),  
mylogger_info "Min time to check:   $wakeup_time_min""s" MKQa&Dvw  
mylogger_info "Max time to check:   $wakeup_time_max""s" 73]%^kx=  
mylogger_info "Timeout circle:     $rule_timeout""s" Z 4t9q`}h  
mylogger_info "Output is logged to:   $log_facility" ]")i~-|R  
9|OQHy  
# if new ip blocked at this check run? Tl25t^Y  
new_block=0  rZDKVx  
# if new ip blocked at this timeout run? }uZh oA  
ever_block=0 Y$'fds4P  
# reset wakeup_time os#j;C]l  
wakeup_time=$wakeup_time_max U2SxRFs >  
; /EH@V|  
lasttime=`date +%s` VF 6@;5p  
OBj .-jL  
while [ 1 ] }TYCF@  
do o 'yR^`  
curtime=`date +%s` 3xj<ATSe  
timediff=$((curtime-lasttime)) fV;&Ag*ZiV  
#echo "timediff: $timediff" JU"!qXQr  
if [ $timediff -ge $rule_timeout ] && [ $ever_block = 1 ] ; then HeF[H\a<  
lasttime=$curtime ;ATk?O4T  
ever_block=0 v[HxO?x^  
dotimeout {_Ke'" k  
fi |w\D6d]o  
docheckall LsBDfp5/  
mylogger_info "sleep for $wakeup_time""s" 2t[inzn=E  
sleep $wakeup_time (VC_vz-  
done '+-R 7#  
,=K!Y TeVl  
}g(aZ  
\`4}h[  
1. 说明 b_][Jye&P  
firewall.sh是一个shell脚本程序,每隔一段时间检查tcp连接的统计信息,如果来自某个ip对某个端口的活动连接超过规定的最大数量, +5^*c^C  
则自动将该IP对该端口的访问屏蔽,并重新启动相应的服务。再每隔一段时间,会重设防火墙到初始状态。 Sgr<z d'b  
该程序可以同时保护多个端口 7b Gzun&  
]=h Ts%]w  
2. 安装 KF7 f<  
tar zxf firewall-1.0b.tar.gz -?@ $`{-K  
cd firewall-1.0b l<v /T  
install -m 700 firewall.sh /usr/prima/sbin/firewall.sh y )/d-  
Gt-  -7S  
3. 配置 >) 5rOU  
主要配置项目如下: S%Ja:0=}?  
# 最小检查周期,缺省为120秒 a^sR?.+3  
wakeup_time_min=120 BRH:5h  
L@G)K  
# 最大检查周期,缺省为300秒 ,PIdPaV--  
wakeup_time_max=600 L.|GC7$0  
P.[>x  
# 重设防火墙状态的时间,缺省为3600秒 /$q;-/DnTZ  
rule_timeout=3600 ~2"|4  
]enqkiS  
# 保护的端口列表,缺省为80和25,支持的其他端口包括21(ftp), 110(pop3), 53(named), 3306(mysql) rj{'X  /  
# 一般的网络攻击都是针对80和25,又以80居多 iJ sw:Nc  
portlist="80 25" i%\nJs*  
Xi0/Wb h\  
# 每个ip可占用的最大活动(Established)连接数 ,lN!XP{M6w  
max_active_conn=8 iPkG=*Ip(%  
TyK; q{  
# iptables防火墙规则链名称,必须和/etc/sysconfig/iptables中一致 06=eA0JI  
# 如果用的是ipchains,可以忽略此项 0+S:2i/G  
iptables_chain_name="RH-Lokkit-0-50-INPUT" zu;Yw=cM)  
M)b`~|Wt  
# 日志输出目标 V<d'psb 6  
log_facility="local0" tG#F7%+E  
Mz"kaO  
**** 关于检查周期 **** 7IIM8/BI  
程序定义了两个检查周期,如果上次检查中屏蔽了某个IP,则程序会更频繁地检查连接情况,反之则等待更长时间。通过检查周期 n_c0=YH  
的动态调整,可以有效调度在遭受攻击和正常状态下程序的运行次数。 q#WqU8~Y  
MD1,KH+O  
**** ipchains vs iptables **** HX <;=m  
目前该程序支持ipchains和iptables两种软件防火墙,使用何种是由程序启动时自动检测的。如果/etc/sysconfig/ipchains和 *}2o \h6Q  
/etc/sysconfig/iptables都没有检测到,则报错退出。 vhUuf+P*  
Sa<R8X' J  
**** 日志输出 **** LpF6e9V\Wp  
程序的输出信息记录在系统日志中,目标是local0。如果没有特殊配置,可以在/var/log/messages中看到。建议在/etc/syslog.conf ''WX  
中加入一条: kW(8i}bg  
local0.*                 /var/log/firewall.log X0C\87xfG  
然后重新启动syslog %EVg.k$  
/etc/init.d/syslog restart 82w< q(  
这样,可以将firewall.sh输出的日志单独记到文件/var/log/firewall.log里。 ^.<IT"  
$[1 M2>[  
4. 运行 @{$SjR8Q $  
/usr/prima/sbin/firewall.sh & %ZZ}TUI W  
h7Ma`w\-  
范例输出: Lv5AtZl}  
*** firewall.sh v1.0b ValueOf.com*** , n EeI&  
Firewall is:       ipchains >&$ V"*]  
Port protected:     80 25 Z2LG/R  
Max connection per ip: 8 vR`KRI`{  
Min time to check:   120s T*H4kM  
Max time to check:   300s iI _Fbw8  
Timeout circle:     3600s t qER;L  
Output is logged to:   local0 zU}0AVlIL:  
VWNmqeP  
察看/var/log/firewall.log,可以看到: >M +!i+  
Oct 16 14:08:55 server firewall.sh: do check port 80                   // 检查80端口 JY_' d,O  
Oct 16 14:08:55 server firewall.sh: 192.168.0.60 2 connections             // 有两个来自192.168.0.60的连接 )@sz\yI%U  
Oct 16 14:08:55 server firewall.sh: total connections on port 80: 2         // 80端口总共2个连接 M2m@N-+R   
Oct 16 14:08:55 server firewall.sh: do check port 25                   // 检查25端口 b. t]p  
Oct 16 14:08:55 server firewall.sh: total connections on port 25: 0         // 25端口没有连接 zz$*upxK  
Oct 16 14:08:55 server firewall.sh: sleep for 300s                     // 等待300秒 7zNyH(.  
{X< tUco  
5. 停止 d:j$!@o  
先用ps命令察看firewall.sh进程的进程号,然后用kill命令将其终止,如 q_I''L  
# ps auxww|grep firewall.sh p2cKtk+  
root   27932 0.0 0.5 2312 1060 pts/2   S   12:38   0:00 /bin/sh /usr/prima/sbin/firewall.sh %f^TZ,q$  
root   27967 0.0 0.3 1732 592 pts/2   S   12:39   0:00 grep firewall.sh K~Xt`  
第一行即firewall.sh的进程,用kill命令: >uI| S  
# kill 27932 <7)@Jds\  
[1]   Terminated             /usr/prima/sbin/firewall.sh |D<~a(0  
即将其终止


常州五颜六色网络技术有限公司(5y6s Inc.)
旗下网站:5y6s Inc. | 五颜六色网 | 常州人社区

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

Tel:0519-86605212 QQ:8732391   5y6s Inc.
[楼 主] Posted:2008-01-26 02:12| 顶端
deserts


头衔:大客部大客部

级别: 总版主
精华: 0
发帖: 315
威望: 2 点
金钱: 579 RMB
贡献值: 0 点
在线时间:282(小时)
注册时间:2006-01-01
查看作者资料 发送短消息 发送邮件 推荐此帖 引用回复这个帖子
通过脚本自动屏蔽非法IP

http://www.bornin76.cn/?p=31 8~* |muN.e  
!p #m?|Km  
最近很是奇怪,我查看我的服务器日志,居然发现有来自全世界[1]的很多人在锲而不舍的试图猜解我的系统密码(遗憾的是还没人可以成功入侵)。我是穷尽我吃奶的智商也想不通,就这么一个破机器(无屏的IBM T23,开博说明里就已经明确说了),上面只是跑了一个可有可无的Blog程序而已,咋就这么多人感兴趣?莫不是都把我这里当成了入侵中央银行的系统入口?我倒是希望这是那个入口哦! nM#/uuRl|  
 %JoHc?  
研究了一下,觉得通过对日志文件进行判断,识别出扫描者的IP地址,然后再对其进行处理,这样也许是一种比较不错的简单的解决办法。经过实践,证明这是可行的。脚本代码如下: X/Sp!W-H  
` ES-LLhVf  
`-Y8T\  
#! /bin/bash 94.|l  
o{]2W `0r  
SCANIP=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'` 1#tFO  
12]rfd   
for i in $SCANIP :Eb=jWA  
do {HO,d{{  
NUMBER=`echo $i|awk -F= '{print $1}'` pG&#xRk  
SCANIP=`echo $i|awk -F= '{print $2}'` 3le$0f:O  
echo $NUMBER zQ~N(Jj?h  
echo $SCANIP TGDrTyI?y  
if [ $NUMBER -gt 10 ] && [ -z "`iptables -vnL INPUT|grep $SCANIP`" ] tNvjwgV\  
then P(xgIMc H  
iptables -I INPUT -s $SCANIP -m state --state NEW,RELATED,ESTABLISHED -j DROP 7TW&=(  
echo "`date` $SCANIP($NUMBER)" >> /var/log/scanip.log ]WYddiF  
fi O>y*u8  
done kxCN0e#_  
Ak kth*p  
这个世界终于清静了!有遇到类似情况的朋友可以一试,我的系统是Linux,防火墙是用的Iptables。  )vD:  
Z'~/=a)7  
ntxa FVD  
------------------------------------------------------- fl8eNi E|  
zDf96eK  
注释: MX"M2>"pT  
o&$Of  
有美国、冰岛、日本、韩国、印度、挪威、唐山、内蒙古、广州等等,不过也许只是同一个人通过IP伪装了而已。


常州五颜六色网络技术有限公司(5y6s Inc.)
旗下网站:5y6s Inc. | 五颜六色网 | 常州人社区

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

Tel:0519-86605212 QQ:8732391   5y6s Inc.
[1 楼] Posted:2008-01-26 04:39| 顶端


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


快速发帖 顶端
内容
HTML 代码不可用

使用签名
Wind Code自动转换

[查看帖子长度]
标题:
表情:


     按 Ctrl+Enter 直接提交   


[ 常州五颜六色网络技术有限公司 ]
Copyright © 2005-2007 5y6s Inc. 苏ICP备05001866号 Powered by PHPWind 5.0.1

☏:0519-6605212 QQ: 点击这里给我发消息 /点击这里给我发消息 /点击这里给我发消息