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


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

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


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

linux自动屏蔽IP工具

另存为 firewall.sh 给执行的权限 r{Mn{1: O  
OF-g7s6VH  
#!/bin/sh E!L_"G W  
# this program is used to check tcp/ip connections <P]%{msGH  
# and block those ip with excessive connections ::cI4D  
>>8{N)c5E  
# my version nm %7e!{m  
myver="1.0RC1" M+lr [,c  
] U }B~Y  
# wake up every 120s if last check found abuse client b+$wx~PLi  
wakeup_time_min=120 <B @z>V  
_|;{{8*?  
# wake up every 300s if last check found no abuse client nFn}   
wakeup_time_max=300 )/2TU]//  
e ]{=#  
# rule timeout 3600s .VohW=D3  
rule_timeout=3600 QpS7 nGev  
{*<%6?  
# check port list tOo\s& j  
portlist="80" ([7XtG/?  
z&jASL  
# max established connection per ip `-?`H>+OG  
max_active_conn=8 ~4mRm!DP  
7d+0'3%  
# iptables chain name v0T?c53?  
iptables_chain_name="RH-Lokkit-0-50-INPUT" <KE%|6oER  
jBd=!4n  
# log facility {j4&'=C:  
log_facility="local0" O]@s` w  
]c]^( C  
# Block policy Zt9ld=T  
ipchains_block_policy="DENY" ]]y,FQ,r  
iptables_block_policy="REJECT" ?>gr9w\  
;3%Y@FS@  
# myself vjA!+_I6  
myself=`basename $0` Tz 0XBH_  
(.5 Ft^3W  
mylogger_info() Q9; VSF)  
{ *<}R=X.  
logger -p $log_facility.info -t $myself $@ 2>/dev/null [ /<kPi  
} &MB1'~Q,hq  
bkrl>Im<n  
mylogger_debug() CdtCxy5  
{ ,F+,A].wG  
logger -p $log_facility.debug -t $myself $@ 2>/dev/null j9-.bGtm?.  
} =F5zU5`i  
1 qp"D_h  
mylogger_notice() v] m`rV8S[  
{ $I<\Yuy-M9  
logger -p $log_facility.notice -t $myself $@ 2>/dev/null yQ&C]{>TS  
} *qxv"PptX  
*?>52 -&b  
dotimeout() ,vBB". LY'  
{ !P":z0K4  
mylogger_info "reset firewall when timeout arrives" K~fWZT3]  
case "$firewall" in st>%U9  
ipchains) 5v sn'=yN  
  /etc/init.d/ipchains restart 1>/dev/null 2>/dev/null V >~\~H2Y  
  if [ $? = 0 ] ; then Z|A+\#'  
    mylogger_info "ipchains restarted" p<y \ ^a  
  else i?|u$[^=+  
    mylogger_notice "ipchains restart failed" =GiN~$d  
  fi aY DM)b}  
  ;; }C$D-fH8sW  
iptables) J<&?Hb*|  
  /etc/init.d/iptables restart 1>/dev/null 2>/dev/null ):n'B` f}z  
  if [ $? = 0 ] ; then zhY]!  
    mylogger_info "iptables restarted" .\3gb6S }  
  else DU-dIq i  
    mylogger_notice "iptables restart failed" (?i4P5s[!  
  fi s%A?B 8,  
  ;; 14(ct  
*) x Vw1  
  mylogger_notice "neither ipchains nor iptables" |;"(C# B  
  ;; O>9-iqP>`d  
esac k4` %.;  
we kb&?  
} 48{B}j%oU  
y!|4]/G]?t  
blockclient() //bQD>NBO  
{ di<g"8  
if [ -z "$1" ] || [ -z "$2" ]; then :*cd$s  
mylogger_notice "blockclient() missing client or port to block" []?*}o5&>T  
return Ml )<4@  
fi o ?aF  
local ip port FMitIM*]   
7324#HwS  
ip=$1 om6`>I*  
port=$2  Gc;-zq  
f*^bV_  
case "$firewall" in Ix0#eoj  
ipchains) =!/T4Oo  
  mylogger_notice "blocking $1 to $2 via ipchains" +^.xLTX`$  
found=`ipchains -nL | egrep "^$ipchains_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+\->[[:space:]]+$port"` Q v},X~^R  
if [ -z "$found" ] ; then v7D0E[)~  
cmd="ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null" BU|m{YZ$  
mylogger_debug "cmd: $cmd" {&FOa'bP  
`ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null` <t"fL RX  
if [ $? != 0 ] ; then nd5.Py$  
mylogger_notice "$cmd call failed" sBNqg~HwB?  
return <d{>[R)  
fi zY].ZS=7  
new_block=1 YDgG2hT/2  
ever_block=1 'yh)6mid  
else %iZ~RTY6 !  
mylogger_info "$ip already blocked to $port" P7 5@Yu(  
fi dd4^4X`j  
  ;; TnuA uui*  
iptables) {9~3y2:  
  mylogger_notice "blocking $1 to $2 via iptables" ,,?XGx  
found=`iptables -nL | egrep "^$iptables_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+dpt:$port[[:space:]]+"` .{(gku>g(  
if [ -z "$found" ] ; then kAW2vh  
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" .EjjCE/v-  
mylogger_debug "cmd: $cmd" zXe]P(p<  
`iptables -I $iptables_chain_name 1 -p tcp -m tcp -s $ip --dport $port -j $iptables_block_policy 1>/dev/null 2>/dev/null` qR4-~ p 8  
if [ $? != 0 ] ; then eXkpU7w;  
mylogger_notice "$cmd call failed" &7eN EA  
return /KlSI<T@  
fi oF s)UR  
new_block=1 ~e5E%bXxC  
ever_block=1 /5Yl, P  
else S4!B;,?AxN  
mylogger_info "$ip already blocked to $port" WHRBYq_  
fi O81'i2M J9  
  ;; <V|\yH9  
*) f2ck=3  
  mylogger_notice "neither ipchains nor iptables" bc2S?u{  
  ;; P R_| 8H|  
esac j% '~l#nw  
} Uu|R]azbO  
Zy>y7O(,  
restartservice() sDkO!P  
{ =b Q\BY#  
local service o9Tsyjbj  
if [ -z "$1" ] ; then 1Q$/L+uJ5  
mylogger_notice "no port given to see which service to be restart" 6Zv-kG  
return = @ 1{LF;  
fi =r~ExW}+  
>{"E~U  
case "$1" in Uf|@h  
80) 2Xv$  
  service="httpd" t]ID  
  ;; k jx<;##R8  
25) 7<LCX{Uw  
  service="postfix" tl=e!  
  ;; $qiM_06  
110) 2 yRUw  
  service="courier-pop3d" 'lOpoWDL  
  ;; _I0=a@3  
21) n -x Caq  
  service="muddleftpd" Pt/F$A{Cj  
  ;; )vGxF}I3  
53) perhR!#J  
  service="named" D*g K,`  
  ;; :bq UA(k  
3306) ,9$|"e&  
  service="mysqld" <lRjh7  
  ;; GGsAisF"N  
esac  4Gj  
if [ ! -z "$service" ] ; then  CxrsP.  
/etc/init.d/$service restart 1>/dev/null 2>/dev/null #`%V/#YK  
if [ $? = 0 ] ; then 3.h0  
  mylogger_notice "$service restarted" X#ud_+6x  
else %kuUQ%W1  
  mylogger_notice "$service restart failed" _lfS"ae  
fi cvjZ$Fcc%(  
fi 8`Tj*7Y=  
} pV$A?b"?*  
)g ?'Nz  
docheckport() -gv[u,R  
{ PVrNS7 Rk/  
mylogger_info "do check port $1" /mK]O7O7  
local port last_client count client total_count }&^1")2t  
Y0ACJ?|  
if [ -z "$1" ] ; then QiNLE'19^  
mylogger_notice "docheckport() port not given" CW,|l0i  
return "j=E8Dd}  
fi YOUX  
H5be5  
port=$1 .G>~xm0  
b\H,+|i K  
clientlist=`netstat -an --tcp| grep ESTABLISHED | awk "{ if ( index(\\$4,\":$port\") ) print \\$5}" | awk -F ':' '{print $1}'|sort` \\Nt^j3qR  
if [ $? != 0 ] ; then J5}?<Dd:  
mylogger_notice "netstat call failed" %:7/ym[  
return h3Nbgxa.  
fi 0"i QHi  
#echo $clientlist 0SJ(Ln`0K  
# reset new_block 9 }  ]C  
new_block=0 v 1 f^gde  
count=0 <@;bxSUx  
total_count=0 ;.7]zn.X]2  
last_client="" Iz&<rL;s  
for client in $clientlist (mx}6A  
do G_xql_QR  
#echo "client is $client" #/)U0 IR)  
if [ -z "$last_client" ] ; then %< Jj[F  
  count=$((count+1)) /.(F\2+A  
  total_count=$((total_count+1)) )Zrn?KM  
  last_client=$client #2%8@?_-M  
else pK)!o  
  if [ "$client" = "$last_client" ] ; then F`o"t]AD-a  
  count=$((count+1)) I3YSW  
  total_count=$((total_count+1)) th+LScOX  
  else hjp,v)#  
  mylogger_debug "$last_client $count connections" cZAf?,>u  
  if [ $count -ge $max_active_conn ] ; then +KIFLuL  
    mylogger_notice "client $last_client connection $count >= $max_active_conn" L"( {6H  
    blockclient $last_client $port {Vf].l:kn  
  fi I1JF2" {c  
  count=1 \Lm`jU(:l  
  total_count=$((total_count+1)) HcHwvf6y  
  last_client=$client O*c<m,  
  fi / &yc?Ui  
fi OOzXA%<%c  
done B%z+\<3^q  
# check the last client 5PE}3he:  
if [ ! -z "$client" ] ; then |^gnT`+  
count=$((count+1)) 5]2 p>%G  
total_count=$((total_count+1)) I~,bZA  
mylogger_debug "$client $count connections" 6Z{(.'Be  
if [ $count -ge $max_active_conn ] ; then L!~ap  
  mylogger_notice "client $client connection $count >= $max_active_conn" !'a <Dw5  
  blockclient $client $port Sea6xGdq  
fi {X-a6OQj  
fi !'>,37()  
mylogger_info "total connections on port $port: $total_count" $rPQ%2eF4  
p,7?rI\N  
if [ $new_block = 1 ] ; then WpC9(AX5g  
restartservice $port }bnodb^.7  
fi Xi!e=5&Pa  
} 6ck%M#v  
]6,D 9^{;  
docheckall() >C`#4e?}  
{ jwhe J G  
# reset wakeup_time n'!x"O7  
wakeup_time=$wakeup_time_max > ".@;  
for port in $portlist 0+AMN-  
do z</^qy  
docheckport $port FhQb9\g  
if [ $new_block = 1 ] ; then X#o;`QM  
  # set wakeup_time shorter cause we found some abuse client vILgM\or  
  wakeup_time=$wakeup_time_min l/A!ofc#)  
fi W?n/>DML  
done uFFC.w  
} chM-YuN|  
6xu%M&h t  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/ipchains ] ; then oslj<  
firewall="ipchains" im F,8'  
fi ]hZk #rp}  
D[{"]=-  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/iptables ] ; then olK*uD'`  
firewall="iptables" Bk5ft4v-  
fi Q+Eqaz`  
^cuH\&&7  
if [ -z "$firewall" ] ; then "tu*(>'~5  
echo "Error: This machine does not have ipchains or iptables firewall support" Ii>#9>!F  
exit 1 S`vw<u4t  
fi .GWN~iR(  
M{p9b E[j  
mylogger_info "firewall.sh v$myver ValueOf.com starting" ""h%RhcZ\  
mylogger_info "Firewall is:       $firewall" ^Zlbs goZ  
mylogger_info "Port protected:     $portlist" qipS`:TER  
mylogger_info "Max connection per ip: $max_active_conn" rym*W\AWx  
mylogger_info "Min time to check:   $wakeup_time_min""s" C}\kp0mz  
mylogger_info "Max time to check:   $wakeup_time_max""s" _:JV-lM  
mylogger_info "Timeout circle:     $rule_timeout""s"  1 K]  
mylogger_info "Output is logged to:   $log_facility" 0UQ DB5u  
l I2UpfkBP  
# if new ip blocked at this check run? %m$t'?  
new_block=0 ,/[1hhP@  
# if new ip blocked at this timeout run? x[$ :^5V  
ever_block=0 i'}"5O+  
# reset wakeup_time A$?o3--#]G  
wakeup_time=$wakeup_time_max fqn;,!D?9  
WrR8TYq9D]  
lasttime=`date +%s` 7 *4i0{]  
x(rl|o  
while [ 1 ] !X=93%  
do oOGFg3X  
curtime=`date +%s` Z-aB[hE  
timediff=$((curtime-lasttime)) :kXxxS  
#echo "timediff: $timediff" .iST!nh  
if [ $timediff -ge $rule_timeout ] && [ $ever_block = 1 ] ; then YW"nPZNPy~  
lasttime=$curtime 'f6!a5qC  
ever_block=0 4n%|h-!8  
dotimeout )XYCr<s2"  
fi l Ng)k1  
docheckall RMAbu*D0  
mylogger_info "sleep for $wakeup_time""s" z@2nre  
sleep $wakeup_time M*F`s& vM  
done $ccCI \  
UQjZhH  
$EZr@n  
^_o:Ddz?l"  
1. 说明 !1P<A1K  
firewall.sh是一个shell脚本程序,每隔一段时间检查tcp连接的统计信息,如果来自某个ip对某个端口的活动连接超过规定的最大数量, KzB9 mMrO  
则自动将该IP对该端口的访问屏蔽,并重新启动相应的服务。再每隔一段时间,会重设防火墙到初始状态。 W}k)5<C4v  
该程序可以同时保护多个端口 'he&h4fm  
_61tE  
2. 安装 I5g!c|#y  
tar zxf firewall-1.0b.tar.gz --TY[b  
cd firewall-1.0b x%RE3J-  
install -m 700 firewall.sh /usr/prima/sbin/firewall.sh #F+b^WTR  
Y+3r{OI  
3. 配置 F/D/1w^ iR  
主要配置项目如下: xGX U7w:X  
# 最小检查周期,缺省为120秒 u~27\oj,  
wakeup_time_min=120 8uB6C0,6?  
h8HA^><Xr  
# 最大检查周期,缺省为300秒 lUHpGr|U%  
wakeup_time_max=600 !(qaudX{>k  
k7bfgb {  
# 重设防火墙状态的时间,缺省为3600秒 200Fd8Ju  
rule_timeout=3600 0,m@BsK  
vrXNa8,L  
# 保护的端口列表,缺省为80和25,支持的其他端口包括21(ftp), 110(pop3), 53(named), 3306(mysql) m[&pR2T  
# 一般的网络攻击都是针对80和25,又以80居多 ,in" 8aT}~  
portlist="80 25"  Qs\!Kk@  
gOn^}%4.I  
# 每个ip可占用的最大活动(Established)连接数 vce1'aW  
max_active_conn=8 Ndqhc  
3?yq*uE}  
# iptables防火墙规则链名称,必须和/etc/sysconfig/iptables中一致 c+]5[6  
# 如果用的是ipchains,可以忽略此项 <>[]- Vq  
iptables_chain_name="RH-Lokkit-0-50-INPUT" 4CioVQdj  
08;t%[R  
# 日志输出目标 <@H=XEn  
log_facility="local0" AO^c=^  
j*@EJ"Gm>  
**** 关于检查周期 **** m*H6\on:  
程序定义了两个检查周期,如果上次检查中屏蔽了某个IP,则程序会更频繁地检查连接情况,反之则等待更长时间。通过检查周期 mX QVL.P\  
的动态调整,可以有效调度在遭受攻击和正常状态下程序的运行次数。 W8s/"  
Ih5F\eM  
**** ipchains vs iptables **** /mFa*~dj2  
目前该程序支持ipchains和iptables两种软件防火墙,使用何种是由程序启动时自动检测的。如果/etc/sysconfig/ipchains和 vhu5w#]u*  
/etc/sysconfig/iptables都没有检测到,则报错退出。 5SmgE2}  
9N{"ob Z  
**** 日志输出 **** agxR V  
程序的输出信息记录在系统日志中,目标是local0。如果没有特殊配置,可以在/var/log/messages中看到。建议在/etc/syslog.conf YNWAef4  
中加入一条: FVS@z5A8<=  
local0.*                 /var/log/firewall.log nV+]jQ~o  
然后重新启动syslog "ku ?A^f  
/etc/init.d/syslog restart 'Gds?o8  
这样,可以将firewall.sh输出的日志单独记到文件/var/log/firewall.log里。 %4HpTx  
!Typ_Cs  
4. 运行 0`l(c  
/usr/prima/sbin/firewall.sh & k=qb YGK  
F B7.b  
范例输出: {pW(@4U  
*** firewall.sh v1.0b ValueOf.com*** [P?.( *  
Firewall is:       ipchains [X|KXlNfm  
Port protected:     80 25 ~ J,e^$u  
Max connection per ip: 8  [EU \-  
Min time to check:   120s L;s,xV  
Max time to check:   300s -R-|[xN  
Timeout circle:     3600s b".e6zev  
Output is logged to:   local0 A('_.J=  
fA>FU/r  
察看/var/log/firewall.log,可以看到: j9Y'HU5"  
Oct 16 14:08:55 server firewall.sh: do check port 80                   // 检查80端口 \@i4im@%xU  
Oct 16 14:08:55 server firewall.sh: 192.168.0.60 2 connections             // 有两个来自192.168.0.60的连接 4Sxt<7[f  
Oct 16 14:08:55 server firewall.sh: total connections on port 80: 2         // 80端口总共2个连接 />\6_kT  
Oct 16 14:08:55 server firewall.sh: do check port 25                   // 检查25端口 >*aqYNft  
Oct 16 14:08:55 server firewall.sh: total connections on port 25: 0         // 25端口没有连接 A#P]|i  
Oct 16 14:08:55 server firewall.sh: sleep for 300s                     // 等待300秒 4(FEfde=  
96$qH{]Ap  
5. 停止 m=uW: ~  
先用ps命令察看firewall.sh进程的进程号,然后用kill命令将其终止,如 t*'U|K4L/  
# ps auxww|grep firewall.sh 8bIwRVA2\  
root   27932 0.0 0.5 2312 1060 pts/2   S   12:38   0:00 /bin/sh /usr/prima/sbin/firewall.sh ayvH S&h  
root   27967 0.0 0.3 1732 592 pts/2   S   12:39   0:00 grep firewall.sh wkwsBi  
第一行即firewall.sh的进程,用kill命令: &^4E)F  
# kill 27932 CnA0 ^JX  
[1]   Terminated             /usr/prima/sbin/firewall.sh {v>orP?  
即将其终止


常州电信/网通机房,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-10-20
查看作者资料 发送短消息 推荐此帖 引用回复这个帖子

通过脚本自动屏蔽非法IP

http://www.bornin76.cn/?p=31 OIuEC7XM^C  
/mb?C/CI  
最近很是奇怪,我查看我的服务器日志,居然发现有来自全世界[1]的很多人在锲而不舍的试图猜解我的系统密码(遗憾的是还没人可以成功入侵)。我是穷尽我吃奶的智商也想不通,就这么一个破机器(无屏的IBM T23,开博说明里就已经明确说了),上面只是跑了一个可有可无的Blog程序而已,咋就这么多人感兴趣?莫不是都把我这里当成了入侵中央银行的系统入口?我倒是希望这是那个入口哦! z(AhO  
_`/: gkZS  
研究了一下,觉得通过对日志文件进行判断,识别出扫描者的IP地址,然后再对其进行处理,这样也许是一种比较不错的简单的解决办法。经过实践,证明这是可行的。脚本代码如下: =kp-[7  
z9k3@\ 7  
&TmN^R>  
#! /bin/bash p nS{W \Q  
Fxu'(xa  
SCANIP=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'` #Z'r;YOzs  
73kF=*m  
for i in $SCANIP |fx*F}1  
do )Q_^f'4  
NUMBER=`echo $i|awk -F= '{print $1}'` t;7 tuq   
SCANIP=`echo $i|awk -F= '{print $2}'` p#VA-RSUQ|  
echo $NUMBER Oy :;v7  
echo $SCANIP TG\3T%gH/s  
if [ $NUMBER -gt 10 ] && [ -z "`iptables -vnL INPUT|grep $SCANIP`" ] b<|l* \  
then [ 7W@/qqv  
iptables -I INPUT -s $SCANIP -m state --state NEW,RELATED,ESTABLISHED -j DROP ^f:oKKaAW;  
echo "`date` $SCANIP($NUMBER)" >> /var/log/scanip.log (x{6N^J.t  
fi ggr\nY  
done pDGX$1O"  
B|Y6;4?  
这个世界终于清静了!有遇到类似情况的朋友可以一试,我的系统是Linux,防火墙是用的Iptables。 481SDG[b  
+Ar=89  
qNI2+<u)j  
------------------------------------------------------- S]kY'(V(*  
[FHSFr E,5  
注释: 1(z&0Y;  
J. ;9-  
有美国、冰岛、日本、韩国、印度、挪威、唐山、内蒙古、广州等等,不过也许只是同一个人通过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.018629(s) query 5, Gzip enabled
会员言论不代表本站立场 本站法律顾问:北京汇泽律师事务所 韩律师
QQ:点击这里给我发消息 /点击这里给我发消息 /点击这里给我发消息