将恶意ip加入ssh黑名单的自动化shell脚本实现 2.0 - wuuconix's blog
2023-06-13 09:16:46 时间
背景
之前写的AutoBan 1.0脚本在写好后的很长一段时间里都没什么人来爆破我的8022端口,以至于我觉得这种情况将一直持续下去。直到昨天晚上0点的时候,那时候我正在看奥运会回放,苏炳添的9.83创造了历史让我振奋不已,振奋之余 我向往常一样查看了一下frp的日志文件,让我吃惊的事情发生了。
有两个ip从9点半开始一直不间断地发起ssh请求,已经整整爆破了两个半小时了。
为什么我的autoban.sh没有ban掉它们? 我看了一下我的autoban.log。
我发现了我的AutoBan的重大问题,那个脚本是如何判断的呢?就是从frp日志文件里取出后三条记录,如果它们都是ssh请求,且它们都是同一个ip发起的,并且相互间隔不超过5s种,那就ban掉这个ip,条件太过严苛,在昨天晚上的情景中,首先每次请求的时间间隔大于5s,还是两个ip几乎交叉请求,我的自动ban脚本一代无能为力,同时还有一个不利因素,就是我之前因为没人来扫我,我就把脚本自动运行时间设置成了5分钟,也大大降低了脚本的威力。
解决办法
- 由于一代脚本写的过于蹩脚,判断条件也过于拉跨,遂决定重构。
- 2代脚本的判断条件:
- 筛选出最近一分钟的所有ssh记录。对其ip种类、个数进行统计。
- 大于3条请求的ip将被直接封禁。
- 以下是花了一个中午写出来的Autoban 2.0
time=`date '+%Y/%m/%d %H:'``date -d '1 minute ago' '+%M'`':[00-59]'
num=`grep "$time" /root/frp_0.37.0_linux_386/nohup.out | grep -c 'ssh'`
echo "`date '+%Y/%m/%d %H:%M:%S'` 过去一分钟的ssh请求个数为: $num" >> /root/frp_0.37.0_linux_386/autoban2.log
if [ $num -ge 3 ]
then
echo "`date '+%Y/%m/%d %H:%M:%S'` 过去一分钟的ssh请求个数大于3,开始反击!" >> /root/frp_0.37.0_linux_386/autoban2.log
ips=(`grep "$time" /root/frp_0.37.0_linux_386/nohup.out | grep 'ssh' | awk '{print substr($NF, 2, index($NF, ":")-2 )}'`)
declare -A ipinfo
for ip in ${ips[@]}
do
let ipinfo[$ip]++
done
for ip in ${!ipinfo[@]} #数组前面加叹号表示取下标,而不是取值
do
num=${ipinfo[${ip}]}
echo "`date '+%Y/%m/%d %H:%M:%S'` $ip 访问次数: $num" >> /root/frp_0.37.0_linux_386/autoban2.log
if [ $num -ge 3 ]
then
echo "`date '+%Y/%m/%d %H:%M:%S'` 该ip在1分钟内访问超过三次,已经锁定,准备开ban!" >> /root/frp_0.37.0_linux_386/autoban2.log
iptables -I INPUT -p tcp -s $ip --dport 8022 -j DROP
echo "`date '+%Y/%m/%d %H:%M:%S'` 已经成功ban掉恶意ip $ip" >> /root/frp_0.37.0_linux_386/autoban2.log
fi
done
fi
成果演示
ps:麻烦这两位老哥看到后不要再扫我了2333
战术总结
- 这次我脚本比一代精简了很多,代码行数是是一代的一半,但是却实现了更好的好恶意ip判断。
- 了解到了类似
grep '2021/08/02 15:10:[00-59]'
的筛选用法和grep -c
的对结果的行数统计功能 - 了解到了
date -d '1 minute ago' '+%M
这种返回一分钟前的分钟数这种看似不可思议的究极智能的用法。 - 了解到了grep 配合上管道符
|
,实现在将前一个grep的结果作为后一个grep的输入,实现多关键字匹配的问题。 - 了解到了awk命令里强大的内置函数,熟悉的substr, index,梦回c++。
- 初次见到了declare申明变量的关键字和let关键字,let关键字让丑陋的
(())
消失了。 - 了解了shell中遍历数组的两种方法 for ip in {ips[@]} 表示便利数组里的值,而 for ip in {!ipinfo[@]} 即在数组名前加上叹号,则表示遍历下标。
相关文章
- Nginx转发ssh服务「建议收藏」
- 将恶意ip加入ssh黑名单的自动化shell脚本实现 - wuuconix's blog
- Linux系统中SSH服务基于key认证实践的过程
- CentOS VMware 下SSH配置方法详解程序员
- Redis实现虚拟IP解决方案(redis虚拟ip)
- and SSHLinux外部运行与SSH的完整连接(linuxout运行)
- 到WindowsLinux利用SSH拷贝文件至Windows系统(ssh从linux拷文件)
- Linux SSH连接详细教程(linuxssh详解)
- Linux下网卡IP配置的指南(linux网卡ip配置)
- 探索Linux:极致SSH体验(linuxssh版本)
- Linux下远程操作之SSH命令(linux命令ssh)
- 追踪Oracle:记录IP安全性分析(oracle记录ip)
- 安全提高安全:立刻搭建Linux IP防火墙!(linux防火墙ip)
- 访问从 Oracle 控制IP访问:权限机制实现(oracle指定ip)
- 渗透技巧之SSH篇
- 远程Linux服务器连接:SSH配置固定IP(linuxsship)
- 如何使用 MySQL 查询数据库 IP?(mysql查询数据库ip)
- 如何在Linux命令行下配IP:入门指南(linux命令行配ip)
- 快速搭建Redis服务基于SSH安装篇(ssh安装redis)
- Oracle 全新IP修改体验(oracle 修改了ip)
- Redis连接IP及其安全性研究(redis 链接ip)
- Oracle SSH连接安全便捷的管理方式(oracle ssh连接)
- Oracle数据库安全性提升IP白名单的配置方法(oracle ip白名单)
- Oracle服务器IP的改变与系统稳定性之间的关系(oracle ip改变)
- ssh自动备份主机文件的脚本