Linux自动封禁多次连接失败的IP

封禁多次连接失败的 IP

最近几天多次看我的服务器有大量连接失败的日志,其中有大量的不同用户名的尝试连接失败的记录
虽然我已经更改了 SSH 的连接端口,并开启了唯密钥登录
虽然这样入侵成功的概率很低很低,但是它大量的尝试连接也是会占用我的带宽和 CPU,这也是一种 DDoS攻击,名为 CC (ChallengeCollapsar,挑战黑洞) 攻击
于是我就尝试禁止它们的连接

编写 Shell 脚本

为了获取到这些多次连接失败的 IP,地址,可以用如下的命令获取

1
lastb | awk '{print $3}' | sort | uniq -c | sed '/[A-Z]/d' | awk '{if($1>3) print$2}'

命令 lastb 可以获取到连接失败的日志,后面从该日志中获取到重复次数超过3次的 IP 地址

文件 /etc/hosts.deny 是一个黑名单,在该名单中的主机将被拒绝连接
所以创建脚本文件 /opt/AutoBanIP.sh

1
touch /opt/AutoBanIP.sh

编写如下代码

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
iplist=`lastb | awk '{print $3}' | sort | uniq -c | sed '/[A-Z]/d' | awk '{if($1>3) print$2}'` # 获取需要封禁的 IP 地址列表
for ip in $iplist # 遍历该列表
do
if (grep -q $ip /etc/hosts.deny) # 判断该 IP 地址是否已经存在于 /etc/hosts.deny 中
then
continue
else
echo "sshd:$ip:deny" >> /etc/hosts.deny # 添加该地址到黑名单中
fi
done

赋予执行权限

1
chmod +x AutoBanIP.sh

定时运行脚本

为了定时运行该脚本,需要编写两个文件

1
touch /etc/systemd/system/AutoBanIP.service /etc/systemd/system/AutoBanIP.timer

编辑 /etc/systemd/system/AutoBanIP.service 文件

1
2
3
4
5
6
7
8
[Unit]
Description=Auto ban IP

[Service]
ExecStart=/opt/AutoBanIP.sh

[Install]
WantedBy=multi-user.target

编辑 /etc/systemd/system/AutoBanIP.timer 文件

1
2
3
4
5
6
7
8
9
[Unit]  
Description=Run AutoBanIP.sh evey 1 hour

[Timer]
OnBootSec=30m
OnUnitActiveSec=30m

[Install]
WantedBy=timers.target

AutoBanIP.timer 文件定义了每30分钟自动执行一次 AutoBanIP.sh 脚本

编写完成后,运行如下命令启动脚本

1
2
systemctl daemon-reload 
systemctl enable --now AutoBanIP.timer

屏蔽脚本编写完成后,希望能减少这些连接失败的日志 (ꐦ°᷄д°᷅)
不知道怎么回事就被人盯上了我的服务器,里面也没什么好东西啊,希望后面能停止这种攻击吧,CC 攻击我没什么好处 (ノ▼Д▼)ノ