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


常州五颜六色网络技术有限公司 -> 网站建设 -> 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 给执行的权限 9JILK9mVO  
>f1fvv6  
#!/bin/sh c]$$ap  
# this program is used to check tcp/ip connections vI48*&]wTf  
# and block those ip with excessive connections z?UEn#E2  
gnb+i`  
# my version J^PFhu  
myver="1.0RC1" z-sq9 Qp&x  
'[_.mx|cd`  
# wake up every 120s if last check found abuse client 9Gx`[{wI9<  
wakeup_time_min=120 n 1^h;2gz  
]xJ. OUJy  
# wake up every 300s if last check found no abuse client 28- z  
wakeup_time_max=300 NMrf I0tbG  
2Ib 1D  
# rule timeout 3600s l!\~T"-7;:  
rule_timeout=3600 &Rz-;66bN  
WK#%G  
# check port list /{I-gjovy  
portlist="80" 23Q 88z   
REsw=P!b  
# max established connection per ip A#i[Us|  
max_active_conn=8 aQ&K a  
&W `7 b<  
# iptables chain name cveQ6 -`K  
iptables_chain_name="RH-Lokkit-0-50-INPUT" =xSf-\F  
.O&YdUo  
# log facility 2nL*^hhh  
log_facility="local0" giesof  
jL'R4z  
# Block policy l%2 gM7WMY  
ipchains_block_policy="DENY" (W[]}k ;  
iptables_block_policy="REJECT" rD !GEU  
O+=}x]q*y  
# myself B9c gVTLj  
myself=`basename $0` /o}i,i$  
sx'eu;S  
mylogger_info() PZ?kv4  
{ T&Z*=ShH  
logger -p $log_facility.info -t $myself $@ 2>/dev/null .CW,Td3f!  
} G%K&f1q%  
q:vGGK^  
mylogger_debug() )FfS7 C\.  
{ vM:c70=  
logger -p $log_facility.debug -t $myself $@ 2>/dev/null ^U,Dx  
} u?'J1\z  
~I~lb/  
mylogger_notice() )Z\Zw~L  
{ bPV; "  
logger -p $log_facility.notice -t $myself $@ 2>/dev/null #GUD^#Jh  
} X[SIk%{D  
\+x#aN\  
dotimeout() 152LdZevF  
{ 6(ER$  
mylogger_info "reset firewall when timeout arrives" ]a[2QQ+g  
case "$firewall" in z$M-UxY  
ipchains)  OAgZeK$  
  /etc/init.d/ipchains restart 1>/dev/null 2>/dev/null 1Cw$^jd  
  if [ $? = 0 ] ; then O2U}jHsd  
    mylogger_info "ipchains restarted" 0+.<BOcW5  
  else gQ<{NQMzvd  
    mylogger_notice "ipchains restart failed" wT- K g=-q  
  fi  %CUwD  
  ;; @![1W@J  
iptables) 9`KFJx6D  
  /etc/init.d/iptables restart 1>/dev/null 2>/dev/null !HeQMz  
  if [ $? = 0 ] ; then *uKYrs [  
    mylogger_info "iptables restarted" {]dvzoE ]  
  else _3#_6>=M  
    mylogger_notice "iptables restart failed" {xICR ~,*  
  fi vZ^U]h V  
  ;; X0]$Ovq(l  
*) 7`^=Ie%(K  
  mylogger_notice "neither ipchains nor iptables" <$C3] =2  
  ;; Tl+PRR6D*  
esac 6 B7 F  
J gV4-B 0  
} ZkNet>9  
pOj8-rr  
blockclient() S,a:H*Hf  
{ +k0UVZZX?  
if [ -z "$1" ] || [ -z "$2" ]; then <)"i'v $  
mylogger_notice "blockclient() missing client or port to block" *qxv"PptX  
return *?>52 -&b  
fi czB),vooz  
local ip port !P":z0K4  
kjt(OFh'Y+  
ip=$1 st>%U9  
port=$2 NceK>:: 56  
V >~\~H2Y  
case "$firewall" in Z|A+\#'  
ipchains) p<y \ ^a  
  mylogger_notice "blocking $1 to $2 via ipchains" i?|u$[^=+  
found=`ipchains -nL | egrep "^$ipchains_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+\->[[:space:]]+$port"` ij.NSyk9  
if [ -z "$found" ] ; then aY DM)b}  
cmd="ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null" \FnR'ne  
mylogger_debug "cmd: $cmd" e+?;Dc-SJ\  
`ipchains -I input 1 -p tcp -s $ip -d 0/0 $port -j $ipchains_block_policy 1>/dev/null 2>/dev/null` ;qcOcm%  
if [ $? != 0 ] ; then zhY]!  
mylogger_notice "$cmd call failed" NS "1zR+  
return DU-dIq i  
fi (?i4P5s[!  
new_block=1 s%A?B 8,  
ever_block=1 14(ct  
else ?.c:k;j  
mylogger_info "$ip already blocked to $port" =%B}8$.|  
fi urQ<r{$x0  
  ;; `9A`pC  
iptables) #E#@6ZomT  
  mylogger_notice "blocking $1 to $2 via iptables" /PG%Y]l0b  
found=`iptables -nL | egrep "^$iptables_block_policy.*[[:space:]]+$ip[[:space:]]+.*[[:space:]]+dpt:$port[[:space:]]+"` anORoK.  
if [ -z "$found" ] ; then }{[JS=A^  
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"  O@skd2  
mylogger_debug "cmd: $cmd" biU ?>R  
`iptables -I $iptables_chain_name 1 -p tcp -m tcp -s $ip --dport $port -j $iptables_block_policy 1>/dev/null 2>/dev/null` vorb?iVf>  
if [ $? != 0 ] ; then aFL<(,~r  
mylogger_notice "$cmd call failed" )"63g   
return pezfB{x?  
fi 7'ws: #pC  
new_block=1 '"h}l`  
ever_block=1 T ^ #1T$  
else Ym$`EN  
mylogger_info "$ip already blocked to $port" fe}RmnAC  
fi 4I.)>+8V  
  ;; ]jR-<l8I-  
*) {#&D=7LP  
  mylogger_notice "neither ipchains nor iptables"  J@J`)  
  ;; c57`mOe/b  
esac r>rL[`p(2  
} ?DY6V;&F@f  
 2\F'So  
restartservice() }T53y6J#  
{ `*]r+J2  
local service .m xc ~  
if [ -z "$1" ] ; then C\ 34R  
mylogger_notice "no port given to see which service to be restart" u5`b")a  
return f3<253 1/}  
fi }hXmK.['  
V Y@`)  
case "$1" in "M,Hm!j  
80) drp< f1`l8  
  service="httpd" uTy00`1  
  ;; g$z6*bL  
25) $4]4G=o  
  service="postfix" \^lDd~MWG  
  ;; hl,x|.f}4Y  
110) 1TgD;qX  
  service="courier-pop3d" A'*#UYn(  
  ;; cxIAI=JK  
21) 0 n|>/i  
  service="muddleftpd" 1=^ |  
  ;; XF i9qL^  
53) w4RtIDW:  
  service="named" i1Y<[s  
  ;; )t,efg  
3306) _iu^VK,}  
  service="mysqld" f2ck=3  
  ;; bc2S?u{  
esac P R_| 8H|  
if [ ! -z "$service" ] ; then B!J&=*=e  
/etc/init.d/$service restart 1>/dev/null 2>/dev/null [6nN]U~Y  
if [ $? = 0 ] ; then g? C<@  
  mylogger_notice "$service restarted" DyRU$U  
else o\nFSG kn  
  mylogger_notice "$service restart failed" }50s\H._C  
fi z AY -Y  
fi Q6CVMYT  
} 8P} a  
n9k-OGJ  
docheckport() ^,Ft7JAn  
{ > v4+@o[~  
mylogger_info "do check port $1" D<T:UJ  
local port last_client count client total_count ZD<e$PxxCd  
3WPZZN<K9  
if [ -z "$1" ] ; then {7EpljH@  
mylogger_notice "docheckport() port not given" +_ $!9m  
return Hr*xAx  
fi @ b} -<~  
 >Xxi2Vy  
port=$1 dfXBgsc6i  
4?c0rC<  
clientlist=`netstat -an --tcp| grep ESTABLISHED | awk "{ if ( index(\\$4,\":$port\") ) print \\$5}" | awk -F ':' '{print $1}'|sort` $IJ"fs  
if [ $? != 0 ] ; then xr31< 4B  
mylogger_notice "netstat call failed" ".k H5(:  
return zuJ@@\75  
fi $@~s O0q  
#echo $clientlist c7]0 >nU;  
# reset new_block .cr<.Ov  
new_block=0 $ou/ Fn  
count=0 $NBQv6#:  
total_count=0 QvlV jDIy  
last_client="" j/1 f|x  
for client in $clientlist (bD#PQXzm  
do UXOf  
#echo "client is $client" OZ&SxR%q4  
if [ -z "$last_client" ] ; then u&e?3qKX(  
  count=$((count+1)) n9V8A[QJ  
  total_count=$((total_count+1)) _D8:p>=  
  last_client=$client RG_6& A  
else !14l[k+\  
  if [ "$client" = "$last_client" ] ; then P&*e\"{  
  count=$((count+1))  X*`b} ^T  
  total_count=$((total_count+1)) )!'7!" $  
  else dlwOmO'Bm)  
  mylogger_debug "$last_client $count connections" SOluTFxUw  
  if [ $count -ge $max_active_conn ] ; then so A] f  
    mylogger_notice "client $last_client connection $count >= $max_active_conn" b6@0?_n  
    blockclient $last_client $port  K"Gea`I  
  fi $v=(`=  
  count=1 <,J O  
  total_count=$((total_count+1)) [+qB^6I+P%  
  last_client=$client sRflabl *x  
  fi SGpe\P]k  
fi &H2j3De  
done 22`e7  
# check the last client DK|/|C}6  
if [ ! -z "$client" ] ; then 8Y;2.Z`Rz  
count=$((count+1)) '~xiD?:  
total_count=$((total_count+1)) kE1k@h#/  
mylogger_debug "$client $count connections" )2R]KU_=g  
if [ $count -ge $max_active_conn ] ; then ix 5\Y  
  mylogger_notice "client $client connection $count >= $max_active_conn" vX$|/74  
  blockclient $client $port W2A!BaH%  
fi )9+H[  
fi pe VzF'F  
mylogger_info "total connections on port $port: $total_count" r<'B\.#tp>  
+xNq8yS  
if [ $new_block = 1 ] ; then u89Q2\z~"M  
restartservice $port 'i 8`LPQ  
fi +l<;?yk:;  
} % xBQX  
;>Z0e`=  
docheckall() TU9$5l/;g  
{ K\5/||gi  
# reset wakeup_time m21H68y  
wakeup_time=$wakeup_time_max b>nwX9Y/U  
for port in $portlist _"82W^Wi  
do ]F"@+_E  
docheckport $port xxpzz(S ]A  
if [ $new_block = 1 ] ; then mA5sK?W  
  # set wakeup_time shorter cause we found some abuse client "f-HOd\=  
  wakeup_time=$wakeup_time_min vP,$S^7$  
fi l@>@2CB  
done 8 LsJ}c  
} RF'&.RtVa  
H )Ze{N  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/ipchains ] ; then ,j eC7-tX  
firewall="ipchains" m5cRHo<9Y  
fi % ejq|i7  
<6C:\{eo  
if [ -z "$firewall" ] && [ -f /etc/sysconfig/iptables ] ; then %t]{C06w+{  
firewall="iptables" Ce} m_  
fi LB^xdMXi  
jH37{S-  
if [ -z "$firewall" ] ; then [NbW"Y7  
echo "Error: This machine does not have ipchains or iptables firewall support" >txeo17Ba\  
exit 1 %.;;itB  
fi }w{E<C(M  
dyl1~'K^  
mylogger_info "firewall.sh v$myver ValueOf.com starting" yn.[-  
mylogger_info "Firewall is:       $firewall" X5+$:jq&  
mylogger_info "Port protected:     $portlist" ,vuC0{C^  
mylogger_info "Max connection per ip: $max_active_conn" @I?: x4  
mylogger_info "Min time to check:   $wakeup_time_min""s" ~gg&G~ ET  
mylogger_info "Max time to check:   $wakeup_time_max""s" =0SJf 3  
mylogger_info "Timeout circle:     $rule_timeout""s" uS! V_]  
mylogger_info "Output is logged to:   $log_facility" *O7PH1G  
3Qu-X\  
# if new ip blocked at this check run? sk@aOv'*(  
new_block=0 nY,LQ0r  
# if new ip blocked at this timeout run? P[r$KGz  
ever_block=0 \ZBz]rh*  
# reset wakeup_time _AH_<Z(  
wakeup_time=$wakeup_time_max So4#n7  
kkXe=f%  
lasttime=`date +%s` gwFW+*h  
OXbC\^qo@  
while [ 1 ] N:,V{Pw  
do UI*&@!%bzp  
curtime=`date +%s` bb$1zSA  
timediff=$((curtime-lasttime)) ,Qj\_vr@  
#echo "timediff: $timediff" >S%}HSPKq  
if [ $timediff -ge $rule_timeout ] && [ $ever_block = 1 ] ; then !p_l(@f  
lasttime=$curtime =nlj|S ~3  
ever_block=0 /'^ BH A|h  
dotimeout W!1 B~NH#  
fi }d@;]cps  
docheckall aj-:JTf  
mylogger_info "sleep for $wakeup_time""s" Hio+k^  
sleep $wakeup_time S(lqj6aa}  
done qBZ;S3  
m; PTO$--  
1+Vei<H$  
tZ:f OM  
1. 说明 .:tR*Kst`7  
firewall.sh是一个shell脚本程序,每隔一段时间检查tcp连接的统计信息,如果来自某个ip对某个端口的活动连接超过规定的最大数量, wd1>L) T  
则自动将该IP对该端口的访问屏蔽,并重新启动相应的服务。再每隔一段时间,会重设防火墙到初始状态。 ^[v>B@p*{  
该程序可以同时保护多个端口 !"'@c  
l>)+HoD  
2. 安装 2 S2;LB  
tar zxf firewall-1.0b.tar.gz Ld=6'C8ud  
cd firewall-1.0b )2r_EO@3HP  
install -m 700 firewall.sh /usr/prima/sbin/firewall.sh VYrs4IFT$  
HN< e)E38  
3. 配置 >uE<-klv  
主要配置项目如下: >Fc=F#tA9  
# 最小检查周期,缺省为120秒 8qT^=K $  
wakeup_time_min=120 u Npa2{S'  
mOb@w/f  
# 最大检查周期,缺省为300秒 qnO/4\qq  
wakeup_time_max=600 OGW0lnQ/  
~)5k%?.  
# 重设防火墙状态的时间,缺省为3600秒 z hU^~4F  
rule_timeout=3600 >jc17BJq  
%}{. U  
# 保护的端口列表,缺省为80和25,支持的其他端口包括21(ftp), 110(pop3), 53(named), 3306(mysql) c43&[xP Lz  
# 一般的网络攻击都是针对80和25,又以80居多 8,:lw3x1  
portlist="80 25" pzU:AUW  
]Y f8  
# 每个ip可占用的最大活动(Established)连接数 M*F`s& vM  
max_active_conn=8 $ccCI \  
UQjZhH  
# iptables防火墙规则链名称,必须和/etc/sysconfig/iptables中一致 $EZr@n  
# 如果用的是ipchains,可以忽略此项 ^!SwY_>  
iptables_chain_name="RH-Lokkit-0-50-INPUT" M\kct7Y  
5_SxX@fW %  
# 日志输出目标 &>XSQB(&%  
log_facility="local0" fjS#  
8+~'T|  
**** 关于检查周期 **** 5WI0[7  
程序定义了两个检查周期,如果上次检查中屏蔽了某个IP,则程序会更频繁地检查连接情况,反之则等待更长时间。通过检查周期 D+*_iM6[-  
的动态调整,可以有效调度在遭受攻击和正常状态下程序的运行次数。 >n>gX/S<C  
g+=f=5I3  
**** ipchains vs iptables **** 2X=*;r"{J  
目前该程序支持ipchains和iptables两种软件防火墙,使用何种是由程序启动时自动检测的。如果/etc/sysconfig/ipchains和 EyV6uk~  
/etc/sysconfig/iptables都没有检测到,则报错退出。 r D|Bj(X8  
OWmI$_L  
**** 日志输出 **** 1VG7[#Zy  
程序的输出信息记录在系统日志中,目标是local0。如果没有特殊配置,可以在/var/log/messages中看到。建议在/etc/syslog.conf _\AT_Zmy  
中加入一条: Yk5Cyq  
local0.*                 /var/log/firewall.log 2}.EFQp+  
然后重新启动syslog /x&52~X5-  
/etc/init.d/syslog restart 1!2,K ot  
这样,可以将firewall.sh输出的日志单独记到文件/var/log/firewall.log里。 Z'y:r2{ql  
g]}E1H6-  
4. 运行 o&rNM5:  
/usr/prima/sbin/firewall.sh & T28Q(\C:}  
-[>G@m:?e  
范例输出: vv`,H~M6  
*** firewall.sh v1.0b ValueOf.com*** N x/_+JWje  
Firewall is:       ipchains uJ%XF*>_D  
Port protected:     80 25 QCvst*  
Max connection per ip: 8 hgF4PdO1e  
Min time to check:   120s %2rUJaOgy$  
Max time to check:   300s %hb! 1I  
Timeout circle:     3600s Ec|5'Kz]  
Output is logged to:   local0 tfq; KR  
Xq.G vZS`  
察看/var/log/firewall.log,可以看到: 8J+:5b_?  
Oct 16 14:08:55 server firewall.sh: do check port 80                   // 检查80端口 x '`L( C  
Oct 16 14:08:55 server firewall.sh: 192.168.0.60 2 connections             // 有两个来自192.168.0.60的连接 0D_{LBO6LU  
Oct 16 14:08:55 server firewall.sh: total connections on port 80: 2         // 80端口总共2个连接 <Z9N}wY,8  
Oct 16 14:08:55 server firewall.sh: do check port 25                   // 检查25端口 |%7OI#t^  
Oct 16 14:08:55 server firewall.sh: total connections on port 25: 0         // 25端口没有连接 tU (vt0~b  
Oct 16 14:08:55 server firewall.sh: sleep for 300s                     // 等待300秒 -$5nqaK?  
ryoD 1OE  
5. 停止 FR1se  
先用ps命令察看firewall.sh进程的进程号,然后用kill命令将其终止,如 >PK \bLEo  
# ps auxww|grep firewall.sh 73'.TReK  
root   27932 0.0 0.5 2312 1060 pts/2   S   12:38   0:00 /bin/sh /usr/prima/sbin/firewall.sh wMru9zyI  
root   27967 0.0 0.3 1732 592 pts/2   S   12:39   0:00 grep firewall.sh dnUiNs8  
第一行即firewall.sh的进程,用kill命令: P :D6w){  
# kill 27932 \H$j[ "3  
[1]   Terminated             /usr/prima/sbin/firewall.sh <)$b=z  
即将其终止


常州电信/网通机房,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 Y79{v nlGk  
sZ!/uN!6  
最近很是奇怪,我查看我的服务器日志,居然发现有来自全世界[1]的很多人在锲而不舍的试图猜解我的系统密码(遗憾的是还没人可以成功入侵)。我是穷尽我吃奶的智商也想不通,就这么一个破机器(无屏的IBM T23,开博说明里就已经明确说了),上面只是跑了一个可有可无的Blog程序而已,咋就这么多人感兴趣?莫不是都把我这里当成了入侵中央银行的系统入口?我倒是希望这是那个入口哦! iEJY[P1  
aMaFxEW  
研究了一下,觉得通过对日志文件进行判断,识别出扫描者的IP地址,然后再对其进行处理,这样也许是一种比较不错的简单的解决办法。经过实践,证明这是可行的。脚本代码如下: s28rj6q  
3:;2Av2(X.  
~A5MzrvIO2  
#! /bin/bash lB0: 4cIj  
9Xv>FVG!  
SCANIP=`grep "\`date \"+ %d %H:%M\" -d \"-1min\"\`" /var/log/secure|awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $1"="$2;}'` C/w!Y)nB=  
P{-f./(JD  
for i in $SCANIP dsh S+d  
do +4,v. B@  
NUMBER=`echo $i|awk -F= '{print $1}'` D6KYkN(,v  
SCANIP=`echo $i|awk -F= '{print $2}'` 3 oG5E"G  
echo $NUMBER xgi/,Nk '  
echo $SCANIP 'NJCU.lKm  
if [ $NUMBER -gt 10 ] && [ -z "`iptables -vnL INPUT|grep $SCANIP`" ] YRy5.F%?  
then lUR7zrwJ]o  
iptables -I INPUT -s $SCANIP -m state --state NEW,RELATED,ESTABLISHED -j DROP R0n# FL^E  
echo "`date` $SCANIP($NUMBER)" >> /var/log/scanip.log %z(nZ%,Z  
fi XCGJ~  
done jo.Sg:7&  
Myj 68_wf  
这个世界终于清静了!有遇到类似情况的朋友可以一试,我的系统是Linux,防火墙是用的Iptables。 g?'4G$M  
`(r [BV|h}  
*)V1Sd#m  
------------------------------------------------------- (qDu|S3P  
zF6]2Y?k%  
注释: iY /N%T;  
w!0`JPu  
有美国、冰岛、日本、韩国、印度、挪威、唐山、内蒙古、广州等等,不过也许只是同一个人通过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.018195(s) query 5, Gzip enabled
会员言论不代表本站立场 本站法律顾问:北京汇泽律师事务所 韩律师
QQ:点击这里给我发消息 /点击这里给我发消息 /点击这里给我发消息