logo  

运维备忘录

运维备忘录
作者: 陈安廉

摘要:软件开发进阶系列


自动禁止攻击IP登陆SSH


2022-11-11 10:45:10


当你拥有一台服务器并且可以远程ssh登陆后,你会发现有很多恶意扫描工具骚扰你的服务器。最好的方法就是更换SSH登陆的端口号并且定时修改。但是仅仅想禁止某些IP登陆呢?

在服务器上有这么一个文件记录着禁止IP访问的信息,/etc/hosts.deny,如果你不想一个IP通过SSH远程访问你的服务器,可以在这个文件下添加一条信息:sshd:xx.xx.xx.xx:deny即可。

既然手动添加即可生效,那我想通过从sshd的日志里发现恶意访问的IP自动添加到这里该怎么办呢?

前人提供了这么一个脚本可以做这件事。前提:有systemd服务管理。

ssh_deny.sh

#!/bin/bash


journalctl -u ssh.service | awk '/Failed/{print $(NF-3)}'|sort|uniq -c|awk '{print $2"="$1;}' > /root/black.list
for i in `cat  /root/black.list`
do
  IP=`echo $i |awk -F= '{print $1}'`
  NUM=`echo $i|awk -F= '{print $2}'`
  if [ ${#NUM} -gt 1 ]; then
    grep $IP /etc/hosts.deny > /dev/null
    if [ $? -gt 0 ];then
      echo "sshd:$IP:deny" >> /etc/hosts.deny
    fi
  fi
done



将这个脚本放到/root/下,然后输入命令:crontab -e,添加一个定时任务:*/1 * * * *  sh /root/ssh_deny.sh ,这样就可以了。

目前我的服务器已经记录了600多个恶意尝试登陆的IP。


重启crontab :

systemctl reload crond.service




crontab 日志:

日志位于/var/log/cron,参考这里清理日志文件。