自动禁止攻击IP登陆SSH,保护服务器安全

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

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

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

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

ssh_deny.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#!/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。