将恶意ip加入ssh黑名单的自动化shell脚本实现 - wuuconix's blog

2023-03-13 17:20:20 浏览数 (2)

背景

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

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

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

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

实现过程

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

代码语言:javascript复制
#!/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

效果演示

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

战术总结

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

0 人点赞