可通过解析/var/log/secure中“Invalid user”日志提取高频攻击IP,用awk等命令统计5分钟内≥5次的IP,调用iptables封禁并记录日志,配合定时任务与安全校验实现轻量自动防御。

可以通过提取 /var/log/secure 中高频出现的“Invalid user”登录尝试IP,结合简单阈值判断,触发封禁脚本(如调用 iptables 或 firewalld),实现轻量级自动防御。关键在于日志解析的准确性、频率统计的合理性,以及封禁动作的安全可控。
提取并统计高频攻击IP
使用 awk + grep + sort + uniq 快速识别短时间内的异常IP:
- 筛选含
Invalid user的行,并提取第11字段(通常是源IP,具体位置需根据实际日志格式校验,常见为$11或$12) - 按分钟或5分钟窗口聚合(例如用
date -d "$(awk '{print $1,$2,$3}' | head -1)" +%s辅助切片,但更推荐用awk内建时间处理或配合journalctl --since "5 minutes ago") - 统计每IP出现次数,过滤超过阈值(如 ≥5 次/5分钟)的IP
示例命令(适用于标准 rsyslog 格式,Invalid user 行中IP通常在倒数第二或第三个字段):
grep "Invalid user" /var/log/secure | awk '{print $(NF-1)}' | sort | uniq -c | awk '$1 >= 5 {print $2}'编写可安全执行的封禁脚本
新建 /usr/local/bin/block-ssh-brute.sh,支持添加/删除IP、避免重复封禁、记录操作日志:
- 检查目标IP是否已在
iptables的自定义链(如SSH-BRUTE)中,避免冗余规则 - 使用
iptables -I SSH-BRUTE 1 -s $ip -j DROP插入规则,确保最高优先级拦截 - 封禁后写入
/var/log/ssh-block.log,包含时间、IP、触发次数 - 可选:自动解封(如30分钟后清理),或仅人工审核后解封
用cron或systemd timer定期触发检测
不依赖实时守护进程,用定时任务平衡资源与响应速度:
- 每3分钟运行一次检测脚本:
*/3 * * * * /usr/local/bin/detect-and-block.sh - 脚本开头加锁(
flock -n /tmp/ssh-block.lock)防止并发冲突 - 检测前先截取最新日志段(如
tail -n 200 /var/log/secure或用journalctl -u sshd --since "3 minutes ago"),减少全量扫描开销
增强可靠性与安全性注意事项
避免误封、绕过或系统干扰:
- 不直接封禁内网IP(如
192.168.0.0/16、10.0.0.0/8)、localhost、运维跳板机IP - iptables 链需提前创建:
iptables -N SSH-BRUTE && iptables -I INPUT -j SSH-BRUTE - 脚本执行用户应为
root,但日志读取权限需确认(/var/log/secure默认仅 root 可读) - 首次部署建议加
echo替代真实封禁,验证逻辑无误后再启用iptables











