Linux服务器防暴力破解常用lastb提取失败登录IP并统计频次,超阈值后用iptables封禁,需去重、持久化及定时自动化;推荐fail2ban替代手动方案。

直接用 lastb 查失败登录记录,再结合 iptables 或 firewalld 封禁高频探测的 IP,是 Linux 服务器防暴力破解的常用手段。核心逻辑是:从 btmp 日志提取异常 IP → 统计失败次数 → 超过阈值就封 → 记录避免重复处理。
用 lastb 提取并识别高频失败 IP
lastb 默认读取 /var/log/btmp(二进制格式,不能直接 cat),它只记录认证失败事件,比如 SSH 密码错误、密钥拒绝等。
执行以下命令可快速列出所有失败登录的源 IP 并按频次排序:
lastb | awk '{print $3}' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | sort -nr-
$3是lastb输出中的 IP 字段(部分系统可能是$4,可用lastb | head -5确认列位置) -
grep -Eo确保只提取合法 IPv4 地址,排除主机名或-占位符 -
uniq -c统计每 IP 出现次数,sort -nr按次数倒序排列
如果某 IP 失败超 5 次(或你设定的阈值),就值得警惕;超过 100 次基本可判定为暴力扫描。
用 iptables 封禁指定 IP
确认目标 IP 后(例如 203.124.55.88),执行:
iptables -I INPUT -s 203.124.55.88 -j DROP
-
-I INPUT表示插入到 INPUT 链最前面,优先级最高 -
-s指定源 IP,支持 CIDR 格式(如203.124.55.0/24封整个段) -
-j DROP是静默丢弃,攻击者收不到任何响应,更安全
封完后验证是否生效:
iptables -nL INPUT | grep 203.124.55.88
看到对应规则即表示已生效。注意:该规则重启后会丢失,需保存(CentOS 7:service iptables save;或使用 iptables-persistent 工具)。
自动化脚本实现批量封禁
手动查+封效率低,建议部署定时脚本自动处理。一个轻量可靠的做法:
- 设置失败阈值(如
THRESHOLD=5) - 用
lastb提取 IP 并统计 - 对未封过的 IP 执行
iptables -I INPUT -s X.X.X.X -j DROP - 将已封 IP 写入日志(如
/var/log/blocked_ssh_ips.log),防止重复添加
示例关键逻辑片段:
lastb | awk '{print $3}' | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | while read count ip; do
[ "$count" -ge 5 ] || continue
if ! grep -q "^$ip$" /var/log/blocked_ssh_ips.log; then
iptables -I INPUT -s "$ip" -j DROP 2>/dev/null
echo "$ip" >> /var/log/blocked_ssh_ips.log
fi
done可配合 cron 每 5 分钟运行一次(*/5 * * * * /usr/local/bin/block_bruteforce.sh)。
替代方案:用 fail2ban 更省心
如果服务器长期暴露在公网,推荐用 fail2ban:
- 它监听
/var/log/secure或auth.log,自动解析 SSH 登录失败 - 支持自定义阈值(如“3 分钟内失败 5 次”)、封禁时长、多服务联动
- 后端可对接
iptables、nftables或firewalld,无需手写规则
安装后只需启用 sshd 监控器,基本开箱即用,比纯脚本更健壮、易维护。
不复杂但容易忽略细节,关键是把 lastb 的原始数据转化为可操作的封禁动作,并确保规则持久化和去重。


















