将恶意ip加入ssh黑名单的自动化shell脚本实现

背景

之前用frp,实现了22端口的内网穿透,在公网可以直接ssh连接我的实验室主机。方便的同时,也带来了非常恐怖的事情。

下面这张图是之前我前天截的。

令人害怕的日志

我们可以看到这个骇客利用某种强悍的技术每秒钟3次甚至有时候每秒6次来试图ssh连接我的实验室机器。使得frps的日志文件里整页都是这些记录,让人看了十分害怕,当时我被迫暂停ssh的内网穿透服务,向这位骇客妥协了。

今天闲来无事,遂决定写一个脚本来自动ban这些恶意连接的ip。

实现过程

经过一些周折之后写完了以下shell脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#!/bin/bash

formatip(){
ip__=$1
ip_=${ip__%%:*}
ip=${ip_:1}
echo $ip
}

time_now=`date '+%Y/%m/%d %H:%M:%S'`
eval $(tail -n 1 /root/frp_0.37.0_linux_386/nohup.out | awk '{printf("time=%s\ %s type=%s ip=%s"), $1, $2, $6, $11}')
difference=$((`date +%s -d "$time_now"`-`date +%s -d "$time"`))
if [ $type == "[ssh]" -a $difference -le 60 ]
then
ip="$(formatip $ip)"
echo "`date '+%Y/%m/%d %H:%M:%S'` 倒数第一条发现ssh请求 时间 $time ip $ip" >> /root/frp_0.37.0_linux_386/autoban.log
array=($(tail -n 3 /root/frp_0.37.0_linux_386/nohup.out | awk '{print $1, $2, $6, $11}'))
time2="${array[4]} ${array[5]}"
type2=${array[6]}
ip2="$(formatip ${array[7]})"
if [ $type2 == "[ssh]" ]
then
echo "`date '+%Y/%m/%d %H:%M:%S'` 倒数第二条发现ssh请求 时间 $time2 ip $ip2" >> /root/frp_0.37.0_linux_386/autoban.log
end=`date +%s -d "$time"`
start=`date +%s -d "$time2"`
difference=$(($end-$start))
if [ $difference -le 5 -a $ip == $ip2 ]
then
echo "`date '+%Y/%m/%d %H:%M:%S'` 时间差 $difference s" >> /root/frp_0.37.0_linux_386/autoban.log
echo "`date '+%Y/%m/%d %H:%M:%S'` 倒数第二条和倒数第一条ssh请求ip一致,请求时间差小于5s" >> /root/frp_0.37.0_linux_386/autoban.log
echo "`date '+%Y/%m/%d %H:%M:%S'` 发现重大嫌疑目标" >> /root/frp_0.37.0_linux_386/autoban.log
time3="${array[0]} ${array[1]}"
type3=${array[2]}
ip3="$(formatip ${array[3]})"
echo "`date '+%Y/%m/%d %H:%M:%S'` 倒数第三条发现ssh请求 时间 $time3 ip $ip3" >> /root/frp_0.37.0_linux_386/autoban.log
end=`date +%s -d "$time2"`
start=`date +%s -d "$time3"`
difference=$(($end-$start))
if [ $difference -le 5 -a $ip2 == $ip3 ]
then
echo "`date '+%Y/%m/%d %H:%M:%S'` 时间差 $difference s" >> /root/frp_0.37.0_linux_386/autoban.log
echo "`date '+%Y/%m/%d %H:%M:%S'` 倒数第三条和倒数第二条ssh请求ip一致 请求时间差小于5s" >> /root/frp_0.37.0_linux_386/autoban.log
echo "`date '+%Y/%m/%d %H:%M:%S'` 已经锁定目标ip $ip 准备开ban" >> /root/frp_0.37.0_linux_386/autoban.log
iptables -I INPUT -p tcp -s $ip3 --dport 8022 -j DROP
echo "`date '+%Y/%m/%d %H:%M:%S'` 已经成功ban掉ip $ip" >> /root/frp_0.37.0_linux_386/autoban.log
echo "`date '+%Y/%m/%d %H:%M:%S'` 已经成功ban掉ip $ip" >> /root/frp_0.37.0_linux_386/fruits
fi
fi
fi
else
echo "`date '+%Y/%m/%d %H:%M:%S'` 1分钟内没有新的请求!" >> /root/frp_0.37.0_linux_386/autoban.log
fi

其实现的主要功能主要是去读取frps的日志文件,查看最后三条记录,看它们是不是都是ssh请求,请求的时间是不是隔的特别近。如果是,就被判定为恶意ip,利用iptables命令进行拉黑操作。

写完了脚本,那我们怎么让它定时自动执行呢?

这里我用到了crontab这个强大的工具。

在Ubuntu Server 20.04 LTS中只需要在/etc/crontab文件中添加一条以下的记录,即可实现每分钟自动运行。

1
* *   * * *   root    bash /root/frp_0.37.0_linux_386/autoban.sh

效果演示

无请求的状态

有恶意ip访问的状态

手机连接失败

这里是用我的手机做的测试,可以看到手机已经连接不上了。

战术总结

  • 通过这次实践熟悉了shell编程的强大之处、了解iptables命令的基本用法、了解crontab强大的定时执行功能
  • 虽然好像今天没有恶意ip来连接我ssh了,测试都是用的我自己的手机2333。但是这也是好事,以后可以没有后顾之忧地使用ssh内网穿透到我的实验室机器啦!

将恶意ip加入ssh黑名单的自动化shell脚本实现
https://wuuconix.link/2021/07/29/AutoBan/
作者
wuuconix
发布于
2021年7月29日
许可协议