背景
之前用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内网穿透到我的实验室机器啦!