前因
早上发现云服务遭到奇怪IP地址大量的ssh登录,查了一下是国外的IP地址,应该是因为我ssh端口修改了,不然可能会更多登录尝试
[root@i-9d1eq6no black]# lastb |awk '{print $3}' |sort|uniq -c |sort -n 1 1 Sat 6603 137.184.6.21 7085 161.35.215.224
准备干活
写个脚本将最近登录失败的IP给加入黑名单,然后定时执行脚本
准备脚本
[root@i-9d1eq6no ~]# mkdir black [root@i-9d1eq6no black]# cd !$ [root@i-9d1eq6no black]# vim black.sh [root@i-9d1eq6no black]# chmod u+x black.sh
脚本内容如下
#!/bin/bash DATE=$(date +"%a %b %e %H") # 定义DATE方便grep过滤 #BAD_IP=$(lastb |grep "$DATE" |awk '{a[$3]++}END{for(i in a)if(a[i]>5)print i}') # 找出登录失败大于5次的地址 COUNT=0 # 定义循环次数方便判断是否重启sshd for IP in $BAD_IP; do # insert_ip=$(grep "$IP" /etc/hosts.deny |wc -l) # 查询BAD_IP是否已经在 hosts.deny 中 # 这个判断在调试的时候可以用一下,正式使用感觉没必要开启 # if [[ $insert_ip -eq 0 ]]; then echo "sshd:$IP" >> /etc/hosts.deny # 将IP加入到hosts.deny,但是暂不生效 iptables -t filter -A INPUT -s $IP -j DROP # 使用iptables拉黑IP echo "$(date +"%Y-%m-%d %H:%M:%S") 屏蔽IP: $IP" >> /root/black/black.log COUNT=$(( $COUNT + 1 )) # fi done if [[ $COUNT -ge 1 ]]; then service iptables save # systemctl restart sshd # echo -e "\n$(date +"%Y-%m-%d %H:%M:%S") 本次屏蔽$COUNT个IP完成\n" >> /root/black/black.log fi
本来是想将黑名单IP都加入到hosts.deny,然后重启sshd生效的,群里大佬提示这样频繁重启sshd太暴力,就改成iptables了,但是追加到hosts.deny任然存在,可以定期自己登录服务器查看一下决定是否重启sshd服务
ps:如果要自己测试hosts.deny的话,记得先把自己IP加入hosts.allow,避免出现自己登录不上的情况
定时执行
[root@i-9d1eq6no ~]# crontab -e # 加入定时任务 [root@i-9d1eq6no ~]# crontab -l # config ssh blacklist 50 * * * * /root/black/black.sh # 每小时的50分执行脚本