背景
之前用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
|
效果演示
这里是用我的手机做的测试,可以看到手机已经连接不上了。
战术总结
- 通过这次实践熟悉了shell编程的强大之处、了解iptables命令的基本用法、了解crontab强大的定时执行功能
- 虽然好像今天没有恶意ip来连接我ssh了,测试都是用的我自己的手机2333。但是这也是好事,以后可以没有后顾之忧地使用ssh内网穿透到我的实验室机器啦!