SSH 登录失败,封禁IP脚本
✅ 脚本功能:
从
lastb
命令中提取失败登录的 IP;统计每个 IP 出现的次数;
如果某个 IP 的失败次数超过 5 次,就使用
iptables
添加一条拒绝规则(可选切换为firewalld
);日志记录已屏蔽的 IP,防止重复处理。
✅ 脚本内容(建议保存为 /usr/local/bin/block_bruteforce.sh
):
#!/bin/bash# 阈值定义
THRESHOLD=5
# 日志文件记录已封锁IP,避免重复处理
BLOCKED_LOG="/var/log/blocked_ssh_ips.log"# 确保日志文件存在
touch "$BLOCKED_LOG"# 获取失败登录的IP地址列表并统计出现次数
lastb | awk '{print $3}' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | while read COUNT IP; doif [[ $COUNT -ge $THRESHOLD ]]; then# 检查是否已封锁过if grep -q "$IP" "$BLOCKED_LOG"; thenecho "$IP 已封锁,跳过"elseecho "检测到 $IP SSH 登录失败 $COUNT 次,正在封锁..."# 使用 iptables 封锁该 IP(可根据需要替换为 firewalld)iptables -I INPUT -s "$IP" -j DROP# 记录到日志echo "$IP" >> "$BLOCKED_LOG"fifi
done
✅ 设置定时任务(每5分钟执行一次):
chmod +x /usr/local/bin/block_bruteforce.sh# 编辑 crontab
crontab -e# 添加以下行(每5分钟运行一次脚本)
*/5 * * * * /usr/local/bin/block_bruteforce.sh
🔐 若使用 firewalld(替换脚本中封锁部分):
# 使用 firewalld 而不是 iptables
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$IP' reject"
firewall-cmd --reload