shell脚本自动拉黑恶意试图攻击IP

(本文章只是用于个人用时查看,有问题请勿喷!觉得行可供参考。)

首先我来说下配置这个shell脚本的原理,为什么要配置这个脚本.

在Linux中,虽然系统自带有iptables防火墙,但是这只能说服务器相对安全,但不能说服务器非常安全。当服务器配置了防火墙,但是还是有人恶意对我们的端口进行扫描,进行攻击。 如果我们允许22端口对外网所有人访问,如果我们没有做VPN,比如我在上海,服务器在北京,如果我们要远程,但是现在IP已经变化了,而且我们的服务器22号端口已经打开,全国所有人都可以访问我们服务器,如果频繁的进行扫描,那迟早会把服务器攻破,盗取我们的密码。当然,我们可以把密码设置得非常复杂,大小写、特殊字符,数字32位,别人扫描没有3-5年是无法攻破的。但是设置复杂了,他还是每天不停的在扫描试图攻击。

如果我们对所有用户开放了22端口,那么我们就可以在/var/log/secure文件里查看,这里面全是恶意攻击的IP ,那么我们又该如何拒绝这些IP在下次攻击时直接把他拉黑,封掉呢? 或者这个IP再试图登陆3次4次我就把他拒绝了,把他这个IP永久的封掉呢?这个时候我们就可以用这下面这个脚本来实现。

这儿我直接用两个服务器来测试这个shell脚本,当然,在真实环境是同一道理

如下:

服务器A:192.168.33.10

服务器B:192.168.33.14

安装完成后,我们在服务器B上ssh服务器A
ssh -l root 192.168.33.10
回车后yes
会提示你输入密码  当然你肯定是故意输错  ,然后多试图登陆几次

然后我们在服务器A上去查看
tail -fn 100 /var/log/secure
我们就可以看到很多的Failed password for root from 什么的,
如下图:

 

 

很多东西是吧,我们可以直接取这些IP
tail -n 100 /var/log/secure |grep "Failed password"| awk '{print $11}'
如下图:

 

 

当然,如果IP很多的话我们可以直接用命令统计出某个IP试图登陆的次数
tail -n 100 /var/log/secure |grep "Failed password"| awk '{print $11}'|sort|uniq -c |sort -nr
如下图显示:

 

 

如果一个IP登陆错误7次,那这种人肯定是不知道密码的
我们知道这个IP后我们可以直接加到防火墙里
vim /etc/sysconfig/iptables
-A INPUT -s 192.168.33.14 -j DROP     :一定要注意规则的抒写
重启防火墙后我们在服务器B上在试图登陆ssh
ssh -l root 192.168.33.10   
现在连密码都不能输入了,因为我们把他封掉了还登陆个屁啊!
这只是简单的手动限制,如果有上百个这样的IP,那我们不可能每个手动去这样实现啊,接下来我们就会用到这个自动脚本了
#!/bin/bash
#auto drop ssh failed IP address
#by authors kanghui 2016-6-14
#定义变量
SEC_FILE=/var/log/secure
#下面是为了截获secure文件恶意攻击的IP远程登录22端口,大于等于4次后就写入到防火墙里,直接拉黑,禁止后再登录服务器的22端口,egrep -o "([0-9{1,3\.}]){3}[0-9]{1,3}"是配置IP的意>思,[0-9]表示任意一个数,{1,3}表示匹配1-3次
IP_ADDR=`tail -n 100 /var/log/secure |grep "Failed password"| egrep -o "([0-9{1,3\.}]){3}[0-9]{1,3}" | sort -nr | uniq -c | awk ' $1>=4 {print $2}'`
IPTABLE_CONF=/etc/sysconfig/iptables
for i in `echo $IP_ADDR`
do
#查看iptables配置文件是否含有提取的IP信息
        cat $IPTABLES_CONF |grep $i >/dev/null
if
        [ $? -ne 0 ];then
#判断iptables配置文件里是否存在已拒绝的ip,如果不存在,就不再添加相应条目,sed a参数的意思是配置之后加入的行,比如你的防火墙规则里有一条-A INPUT -i lo -j ACCEPT,他的意思就>说在这一条规则的后面添加。
        sed -i "lo/a -A INPUT -s $i -m state --state NEW -m tcp -p tcp --dport 22 -j DROP" $IPTABLES_CONF
else
#如果存在的话,那就显示提示信息
        echo "This is $i is exist in iptables,please exit ....."
fi
done
#最后重启
/etc/init.d/iptables restart

 或者如下图

 

 最后我们就可以把这个脚本加入到crontab   这儿我就不写出来了

猜你喜欢

转载自kangh.iteye.com/blog/2304836