利用 /etc/hosts.deny可以现状某些IP连接服务器。可以利用/var/log/secure日志筛选,只有是登陆失败的、并且超过一定次数的就将这个IP 加入的/etc/hosts.deny文件里面,从而拒绝这个IP连接服务器。代码如下,也参考了网络上的资料。



#/bin/bash
#OS:CentOS 6.7
#
#
#定义一个登录失败的次数,如果超过这数字就把这个ip加入到/etc/hosts.deny文件上
DefineTimes="3"
ToDay=`date +"%y-%m-%d"`
#过滤/var/log/secure 日志文件,把里面登录失败的ip过滤出来并且排序、汇总失败的次数,重定向到一个文件上,
#然后通过for循环把ip地址和错误次数过滤出来,并个设定的错误次数对比,如果超过了,就到/etc/hosts.deny
#文件上匹配,如果有,$?的返回值会大于0,然后就把这IP追加到/etc/hosts.deny文件上,从而达到拒绝多次失败的登录链接。
cat /var/log/secure |awk '/Failed/ {print $(NF-3)}'|sort|uniq -c |awk '{print $2 ":" $1;}' > /data/Ssh_login_Failed_ip_${ToDay}_.txt
for i in `cat /data/Ssh_login_Failed_ip_${ToDay}_.txt`
  do
  Failed_IP=`echo $i |awk -F ':' '{print $1}'`
  Failed_Num=`echo $i |awk -F ':' '{print $2}'`
  if [ $Failed_Num -gt $DefineTimes ]
    then
      grep $Failed_IP /etc/hosts.deny > /dev/null
      if [ $? -gt 0 ]
        then
          echo "sshd:$Failed_IP" >> /etc/hosts.deny
      fi
  fi
done


然后在将这个脚本放入到任务计划执行,比如10分钟执行一次,如下:

*/10 * * * * root /bin/bash /data/Check_Ssh_IP_Failed_ToDeny.sh


参考:http://yuhongchun.blog.51cto.com/1604432/662500