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


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

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


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

linux自动屏蔽IP工具

另存为 firewall.sh 给执行的权限 jeH~<t{  
X1-'COQS%&  
#!/bin/sh k=JrLfD4  
# this program is used to check tcp/ip connections ={d>iB yq  
# and block those ip with excessive connections 8sM|%<$=j  
l@+7:n4K0  
# my version :hFIl0$,"3  
myver="1.0RC1" 1A G<$d5U|  
%'7lbpy,f  
# wake up every 120s if last check found abuse client ,J^b0@S  
wakeup_time_min=120 y t =3sq  
92x(u%~E  
# wake up every 300s if last check found no abuse client k_5L4c:"  
wakeup_time_max=300 v}O30wE  
^l=!JP=M=  
# rule timeout 3600s au+kNF|Q  
rule_timeout=3600 jW3!6*93  
eWtZ]kB  
# check port list '\ey<}?5V  
portlist="80" 9m<jcxla$  
&c HV7  
# max established connection per ip bg&zo;Ck8T  
max_active_conn=8 X>(TrdK_9"  
n}_JB >i~  
# iptables chain name B~JwHwIhA  
iptables_chain_name="RH-Lokkit-0-50-INPUT" _w/EP  
mdmvT~`  
# log facility BJB^m|b)  
log_facility="local0" QnXA*6DJ  
bRJMYs  
# Block policy t2"O  
ipchains_block_policy="DENY" EQ`(yj  
iptables_block_policy="REJECT" X4AyX.p  
Co9QW/'i  
# myself GCX G/k?w:  
myself=`basename $0` d`nVc50  
<2|O:G  
mylogger_info() 8XzR wYV  
{ 8V)^R(\;  
logger -p $log_facility.info -t $myself $@ 2>/dev/null *x])Y~oQ  
} &nkW1Ner9  
O<"}|nbmQ[  
mylogger_debug() ]2'na?q9  
{ gb> }v7  
logger -p $log_facility.debug -t $myself $@ 2>/dev/null 4%}*&nsI-Z  
} {Jx4xpvPo  
YZ7|K<   
mylogger_notice() W4e5Rb4~f"  
{ Y$Y_fjd_  
logger -p $log_facility.notice -t $myself $@ 2>/dev/null 2Sp=rI  
} %8Dz o  
Eam  
dotimeout() gO,25::")  
{ 2 fS[J'-o  
mylogger_info "reset firewall when timeout arrives" N:tY":Hi  
case "$firewall" in ;D s46M-s  
ipchains) ,0~9dS   
  /etc/init.d/ipchains restart 1>/dev/null 2>/dev/null ^#1.l=s  
  if [ $? = 0 ] ; then vR=6pl$|~~  
    mylogger_info "ipchains restarted" 9,_mS{+B  
  else ~L_hZso4  
    mylogger_notice "ipchains restart failed" CQr<N w  
  fi @qjfZH@  
  ;; R8UYP=Kp  
iptables) ~7t$MF.  
  /etc/init.d/iptables restart 1>/dev/null 2>/dev/null 0}FOV`n  
  if [ $? = 0 ] ; then n?ctLbg  
    mylogger_info "iptables restarted" #8bsxx!s  
  else {W~q z^>u4  
    mylogger_notice "iptables restart failed" V8wKAj Ux  
  fi 7kK #\dI  
  ;; + :-57  
*) npyAJ p  
  mylogger_notice "neither ipchains nor iptables" >Clh] ;K  
  ;; `#QG6/ 0  
esac }^*F59>H  
$DC*i-}qFg  
} ,\d6VBP&  
X!},8}~J~  
blockclient() p,<&zHb>K  
{ jWO/ xX  
if [ -z "$1" ] || [ -z "$2" ]; then -;XKcS7Ue  
mylogger_notice "blockclient() missing client or port to block" CGP3qHrXt  
return _l], "[d  
fi gx:;&4AD  
local ip port W85@v2b  
z6~ H:k1G%  
ip=$1 %77p5ctW  
port=$2 nGf);U#K  
omf  Rs  
case "$firewall" in yag}fQ(XH  
ipchains) 7"*|2Xq  
  mylogger_notice "blocking $1 to $2 via ipchains" y3;q_4.  
found=`ipchains -nL | egrep "^$ipchains_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+\->[[:space:]]+$port"` %T=A{<[`  
if [ -z "$found" ] ; then -g/hAxb5  
cmd="ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null" 'QH1=$Su  
mylogger_debug "cmd: $cmd" @C-dG7U.P  
`ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null` wFIh6[3  
if [ $? != 0 ] ; then / <3<. ~  
mylogger_notice "$cmd call failed" l  n }}5Q  
return Y ?r po  
fi >7U>Yh  
new_block=1 iG ,t_??  
ever_block=1 $O:w(U  
else M}"r#Plq  
mylogger_info "$ip already blocked to $port" w*w?S  
fi N(3R|Ii  
  ;; ftavbNR`W  
iptables) 6vf\R*D|A  
  mylogger_notice "blocking $1 to $2 via iptables" {sv{847V  
found=`iptables -nL | egrep "^$iptables_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+dpt:$port[[:space:]]+"` <B&R6<]T  
if [ -z "$found" ] ; then qtu rd7  
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" 7/X"z=Q^|  
mylogger_debug "cmd: $cmd" 8C.!V =@\  
`iptables -I $iptables_chain_name 1 -p tcp -m tcp -s $ip --dport $port -j $iptables_block_policy 1>/dev/null 2>/dev/null` jUjr6b"  
if [ $? != 0 ] ; then FF Gqa&  
mylogger_notice "$cmd call failed" EkKnUD  
return I(n* _ bFq  
fi Oz:ZQ M  
new_block=1 a~^Srj!}x  
ever_block=1 Gwd{#7FM`  
else ]Bb7(JX  
mylogger_info "$ip already blocked to $port" 5>ST"l_ca  
fi *"G8  
  ;; ^4`&EF  
*) t&814Uf&\  
  mylogger_notice "neither ipchains nor iptables" n*qN 29sx  
  ;; cvAtwQ'  
esac <qiICb)~  
} hD 46@  
liNON  
restartservice() u5gZxO1J5  
{ ~2N-k1'-'  
local service ^[M~K5Y  
if [ -z "$1" ] ; then  "jU  
mylogger_notice "no port given to see which service to be restart" U \Dca&=  
return iAz UaF  
fi JY4_v>Aob  
6dT|;koWbm  
case "$1" in :2q ?>\  
80) AZ8UXq  
  service="httpd" %^^h) Wy}  
  ;; f0F#Yi{fw  
25) @bQ!zCI  
  service="postfix" E2yz=7sv5  
  ;; l Z~+u  
110) @c"yAy^t  
  service="courier-pop3d" *Yp qq  
  ;; .xv ^G?GG  
21) 0P:F97"1,  
  service="muddleftpd" <<BQYU)Ig  
  ;; v=+k"gm6  
53) J:W'cH$cR  
  service="named" .5k^f5a  
  ;; xucIjPi]  
3306) wR1K8b".DC  
  service="mysqld" "w1(g=n  
  ;; 3z$\&& BR  
esac 0XQ-   
if [ ! -z "$service" ] ; then 3V!x?H$  
/etc/init.d/$service restart 1>/dev/null 2>/dev/null { ;' :h  
if [ $? = 0 ] ; then 1'OD3~[R  
  mylogger_notice "$service restarted" Oylp:_<aT  
else <wqRk<  
  mylogger_notice "$service restart failed" $@4e(Zrmo  
fi ;W4:#/~14  
fi {N@Y<=+:  
} K+t];(  
n%8#?GC`  
docheckport() m4\g o  
{ )da:&F -  
mylogger_info "do check port $1" =z']s4  
local port last_client count client total_count z'v9j_\  
jS}'cm-  
if [ -z "$1" ] ; then \c' %4Ao  
mylogger_notice "docheckport() port not given" 7j{Te)"  
return ,$SkaTBe  
fi } pSt@3o,  
se"u m5N-  
port=$1 *%]+sU  
jm~mhAE#  
clientlist=`netstat -an --tcp| grep ESTABLISHED | awk "{ if ( index(\\$4,\":$port\") ) print \\$5}" | awk -F ':' '{print $1}'|sort` 'II vub#q  
if [ $? != 0 ] ; then "&s9cO.H  
mylogger_notice "netstat call failed" [_h.1oZp~  
return R0z?)uU#  
fi 'G3+2hah  
#echo $clientlist j `w;z: G  
# reset new_block gA|!$ EAM  
new_block=0 `mQP{od?"?  
count=0 /,-h%gj  
total_count=0 Bl:{p>-q  
last_client="" c4S>_qH  
for client in $clientlist -(|7` U  
do 8-W"4)@b  
#echo "client is $client" B=r]_&u-u  
if [ -z "$last_client" ] ; then wGZ>iLe:  
  count=$((count+1)) -O>^eMWywo  
  total_count=$((total_count+1)) ^/ULh,w!fP  
  last_client=$client RcKQER  
else f/ $-Nl.  
  if [ "$client" = "$last_client" ] ; then 00$ @0  
  count=$((count+1)) qBf wN1  
  total_count=$((total_count+1)) 1oXz[V  
  else ,k`YDy|#e  
  mylogger_debug "$last_client $count connections" Ncs4<"{$  
  if [ $count -ge $max_active_conn ] ; then '2Mjz6mBDA  
    mylogger_notice "client $last_client connection $count >= $max_active_conn" >e5q2U   
    blockclient $last_client $port 7TMDZ*  
  fi FB?q/ _  
  count=1 Y`E {E|J  
  total_count=$((total_count+1)) *Xf[b)FR  
  last_client=$client 24.7S LXO  
  fi bahc{ZC2  
fi $\JQGic`  
done XSL t;zL:  
# check the last client dvrvpDoE.  
if [ ! -z "$client" ] ; then 8k*  
count=$((count+1)) P?yOLG+)l)  
total_count=$((total_count+1)) @ [[C s*-  
mylogger_debug "$client $count connections" h>mBkJ {  
if [ $count -ge $max_active_conn ] ; then R?={{+O  
  mylogger_notice "client $client connection $count >= $max_active_conn" 2s]]!{Z#  
  blockclient $client $port 3f7t%  
fi K2cpf  
fi {YxSH %  
mylogger_info "total connections on port $port: $total_count" 5Qm.ECXV  
w;h\Y+Myyk  
if [ $new_block = 1 ] ; then f;_K}23  
restartservice $port 1Q2k>q8  
fi y[ rB"  
} cr=FMfhB  
jP6oJcZ  
docheckall() 3gfV0C\  
{ X=!n,=xI  
# reset wakeup_time (<:rKp  
wakeup_time=$wakeup_time_max y1jGf83  
for port in $portlist yg]nS<K~4  
do $M8>SLd  
docheckport $port #mz,HK0|aC  
if [ $new_block = 1 ] ; then q[,R%6&'  
  # set wakeup_time shorter cause we found some abuse client *M\i4FO8  
  wakeup_time=$wakeup_time_min j} x O34  
fi {1-CfQ0 8  
done +h\W~muR  
} I!i#=  
%>*0.)wG  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/ipchains ] ; then Hh'14n&W  
firewall="ipchains" Xk9r"RmiOb  
fi w]P7!t  
+/UXy2VRt$  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/iptables ] ; then KA* l6`(  
firewall="iptables" Z?j='/u>@  
fi FOnA;5Aa  
HBf8!\0|/  
if [ -z "$firewall" ] ; then d}B_ll#j-  
echo "Error: This machine does not have ipchains or iptables firewall support" ,I:m*.q  
exit 1 hZ /  
fi Vh[o[ U  
hm} :Me$[)  
mylogger_info "firewall.sh v$myver ValueOf.com starting" k2,oyUT=S  
mylogger_info "Firewall is:       $firewall" :8!3*C-=  
mylogger_info "Port protected:     $portlist" {3p7`h~  
mylogger_info "Max connection per ip: $max_active_conn" )LMux j  
mylogger_info "Min time to check:   $wakeup_time_min""s" `m0Uj9)#  
mylogger_info "Max time to check:   $wakeup_time_max""s" )/i|"`)>_  
mylogger_info "Timeout circle:     $rule_timeout""s" WuQ<AS=   
mylogger_info "Output is logged to:   $log_facility" .AI'L|FQ%c  
N~<}\0  
# if new ip blocked at this check run? oZcwbo8  
new_block=0 &Or=_5Y`  
# if new ip blocked at this timeout run? 5z mHb  
ever_block=0 fy-Z{  
# reset wakeup_time jO N}&/  
wakeup_time=$wakeup_time_max ysn[-l#  
 p:>?  
lasttime=`date +%s` 6@*;Wk~  
 KGwL09)  
while [ 1 ] r!gCh`PiK  
do ^* v{t?u  
curtime=`date +%s` mSw?iL  
timediff=$((curtime-lasttime)) gbv[*R{<%  
#echo "timediff: $timediff" gJ~*rWBK:  
if [ $timediff -ge $rule_timeout ] && [ $ever_block = 1 ] ; then { RX |  
lasttime=$curtime rd~W.b_b  
ever_block=0 (mr` ?LI}  
dotimeout T.N7`  
fi !fjU?_[S  
docheckall -2Cf)>`v  
mylogger_info "sleep for $wakeup_time""s" zk~rKQ,  
sleep $wakeup_time BFu9KS+@)  
done fB }5,22  
ri V/wN9C  
t[ocp;Q  
!h(0b*FUJ  
1. 说明 pg`;)@  
firewall.sh是一个shell脚本程序,每隔一段时间检查tcp连接的统计信息,如果来自某个ip对某个端口的活动连接超过规定的最大数量, y+x>{!pw  
则自动将该IP对该端口的访问屏蔽,并重新启动相应的服务。再每隔一段时间,会重设防火墙到初始状态。 y9 ' 3vZ  
该程序可以同时保护多个端口 u;1NhD<n  
 Q'M Ez  
2. 安装 D4-U[l+K>  
tar zxf firewall-1.0b.tar.gz L,GtIZkE  
cd firewall-1.0b }=4".V`-o  
install -m 700 firewall.sh /usr/prima/sbin/firewall.sh R7b*(33  
0~+:~$VrT  
3. 配置 0R%58,R  
主要配置项目如下: ?OdA`!wE  
# 最小检查周期,缺省为120秒 l'f!za0  
wakeup_time_min=120 7 [ji,.7  
WR1,J0UU6  
# 最大检查周期,缺省为300秒 }'- )  
wakeup_time_max=600 E/ )+hK&  
Z:Am\7 I  
# 重设防火墙状态的时间,缺省为3600秒 !!>G{  
rule_timeout=3600 !d_A?q'hN  
8~>3&jX  
# 保护的端口列表,缺省为80和25,支持的其他端口包括21(ftp), 110(pop3), 53(named), 3306(mysql) x{5*%}lX8  
# 一般的网络攻击都是针对80和25,又以80居多 k]sT'}[n  
portlist="80 25" gC-0je  
Xs_y!l  
# 每个ip可占用的最大活动(Established)连接数 \)WjkhG<w#  
max_active_conn=8 cxdM!L; `  
XPKcF I=  
# iptables防火墙规则链名称,必须和/etc/sysconfig/iptables中一致 `6su_8Hno  
# 如果用的是ipchains,可以忽略此项 X=~QE}x  
iptables_chain_name="RH-Lokkit-0-50-INPUT" M$9h)3(B  
sqRuqUj+  
# 日志输出目标 :8 :>CHa  
log_facility="local0" #u^d3 $Nj  
_L>n!"E/  
**** 关于检查周期 **** p10->BBg  
程序定义了两个检查周期,如果上次检查中屏蔽了某个IP,则程序会更频繁地检查连接情况,反之则等待更长时间。通过检查周期 l:HuG!  
的动态调整,可以有效调度在遭受攻击和正常状态下程序的运行次数。 *fZ'#C~x  
|1R @Jz`  
**** ipchains vs iptables **** 3&f{lsLAC  
目前该程序支持ipchains和iptables两种软件防火墙,使用何种是由程序启动时自动检测的。如果/etc/sysconfig/ipchains和 ;p8xL)mUP  
/etc/sysconfig/iptables都没有检测到,则报错退出。 S0cO00_ob  
IT|CfQ [D  
**** 日志输出 **** Lq.k?!D3uh  
程序的输出信息记录在系统日志中,目标是local0。如果没有特殊配置,可以在/var/log/messages中看到。建议在/etc/syslog.conf ,*US) &x  
中加入一条: 62) F  
local0.*                 /var/log/firewall.log f{0PLFj  
然后重新启动syslog gqd#rjtfz  
/etc/init.d/syslog restart ::6@mFLR  
这样,可以将firewall.sh输出的日志单独记到文件/var/log/firewall.log里。 rcCM x"L=  
"- AiC6u  
4. 运行 2cL<`  
/usr/prima/sbin/firewall.sh & kmwFw>#  
Wp $\>  
范例输出: qW*)]s)z  
*** firewall.sh v1.0b ValueOf.com*** !WN r09`  
Firewall is:       ipchains Gwe9< y  
Port protected:     80 25 cVN|5Y   
Max connection per ip: 8 JXrMtSp\  
Min time to check:   120s GI/o!0"_  
Max time to check:   300s > ewcD{bt  
Timeout circle:     3600s p)`JVq,H/B  
Output is logged to:   local0 K7|BXGL8r8  
%5b2vrg~*  
察看/var/log/firewall.log,可以看到: 74_ji  !  
Oct 16 14:08:55 server firewall.sh: do check port 80                   // 检查80端口 eG.?s ;J0  
Oct 16 14:08:55 server firewall.sh: 192.168.0.60 2 connections             // 有两个来自192.168.0.60的连接 *5^h>Vk/  
Oct 16 14:08:55 server firewall.sh: total connections on port 80: 2         // 80端口总共2个连接 *`[LsG]ZF  
Oct 16 14:08:55 server firewall.sh: do check port 25                   // 检查25端口 #~"jo[  
Oct 16 14:08:55 server firewall.sh: total connections on port 25: 0         // 25端口没有连接 kAMt8  
Oct 16 14:08:55 server firewall.sh: sleep for 300s                     // 等待300秒 z,vjY$t:/  
B|tP3<  
5. 停止 5=eGiF;0\  
先用ps命令察看firewall.sh进程的进程号,然后用kill命令将其终止,如 :EZTJu  
# ps auxww|grep firewall.sh uTQ/_$  
root   27932 0.0 0.5 2312 1060 pts/2   S   12:38   0:00 /bin/sh /usr/prima/sbin/firewall.sh opKtSF|)  
root   27967 0.0 0.3 1732 592 pts/2   S   12:39   0:00 grep firewall.sh <Fi /!  
第一行即firewall.sh的进程,用kill命令: Hc71 .rqS  
# kill 27932 _15r!RZ:1  
[1]   Terminated             /usr/prima/sbin/firewall.sh 1Ypru<.)W  
即将其终止


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

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


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

通过脚本自动屏蔽非法IP

http://www.bornin76.cn/?p=31 ~RgO9p(dY  
O0 [.*xG  
最近很是奇怪,我查看我的服务器日志,居然发现有来自全世界[1]的很多人在锲而不舍的试图猜解我的系统密码(遗憾的是还没人可以成功入侵)。我是穷尽我吃奶的智商也想不通,就这么一个破机器(无屏的IBM T23,开博说明里就已经明确说了),上面只是跑了一个可有可无的Blog程序而已,咋就这么多人感兴趣?莫不是都把我这里当成了入侵中央银行的系统入口?我倒是希望这是那个入口哦! n$&xVaF|  
Y%m^V?k  
研究了一下,觉得通过对日志文件进行判断,识别出扫描者的IP地址,然后再对其进行处理,这样也许是一种比较不错的简单的解决办法。经过实践,证明这是可行的。脚本代码如下: FwKT_XkY  
VPBlU  
pCb3^# &o  
#! /bin/bash WrP 4*6;"  
(r78AZ  
SCANIP=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'` oP vk ^H  
pu3ly&T#a_  
for i in $SCANIP 5'*v -l,[  
do b5NPG N  
NUMBER=`echo $i|awk -F= '{print $1}'` I Wc?E  
SCANIP=`echo $i|awk -F= '{print $2}'` [Tmpj9! q  
echo $NUMBER W{'RR.  
echo $SCANIP oS.fy31p  
if [ $NUMBER -gt 10 ] && [ -z "`iptables -vnL INPUT|grep $SCANIP`" ] c G{>[Lf  
then z86[_l:  
iptables -I INPUT -s $SCANIP -m state --state NEW,RELATED,ESTABLISHED -j DROP 9OI&De5?=V  
echo "`date` $SCANIP($NUMBER)" >> /var/log/scanip.log /1OzX'5f  
fi l.gt+e  
done =GGt:3Kx-  
?2LRMh")$  
这个世界终于清静了!有遇到类似情况的朋友可以一试,我的系统是Linux,防火墙是用的Iptables。 n_ORD@$]  
X=_`$ 0  
(4ueO~jb $  
------------------------------------------------------- >d1gVBhk  
4O g&w]  
注释: JrZ"AId2  
c^Y&4=>T  
有美国、冰岛、日本、韩国、印度、挪威、唐山、内蒙古、广州等等,不过也许只是同一个人通过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.017913(s) query 5, Gzip enabled
会员言论不代表本站立场 本站法律顾问:北京汇泽律师事务所 韩律师
QQ:点击这里给我发消息 /点击这里给我发消息 /点击这里给我发消息