提取登录失败IP应匹配Failed password或Invalid user且含from的行,用awk遍历字段提取IPv4地址:awk '/Failed password|Invalid user/ && /from/ {for(i=1;i

怎么从 auth.log 提取登录失败的 IP
关键不是“找日志”,而是准确识别失败事件。Ubuntu/Debian 默认用 auth.log,CentOS/RHEL 是 /var/log/secure,先确认路径:
ls -l /var/log/auth.log /var/log/secure 2>/dev/null。失败登录常见匹配模式是
Failed password(SSH)或 Invalid user,但注意:同一行可能含多个 IP,要提取 IPv4 地址段,避免误抓端口号或日志前缀。推荐用 awk 配合正则:awk '/Failed password|Invalid user/ && /from/ {for(i=1;i<=NF;i++) if($i ~ /^([0-9]{1,3}\.){3}[0-9]{1,3}$/) print $i}' /var/log/auth.log | sort | uniq -c | sort -nr
怎么用 fail2ban 替代手写封禁逻辑
自己调 iptables 或 nftables 封 IP 看似简单,实际容易漏掉:重复封禁、未持久化、未解封过期条目、忽略 SSH 密钥登录失败等边界情况。fail2ban 是专干这事的标准工具,安装后只需配一个 jail:
sudo apt install fail2ban # Debian/Ubuntu<br>sudo yum install fail2ban # CentOS/RHEL。编辑
/etc/fail2ban/jail.local,启用并调低阈值:[sshd]<br>enabled = true<br>maxretry = 3<br>bantime = 1h<br>findtime = 10m。它默认就解析
auth.log,无需额外脚本。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
如果坚持用自定义脚本,怎么安全执行封禁
手动封 IP 必须绕过 root 权限问题和并发冲突。不要在 crontab 里直接写 sudo iptables,而应:
- 用
sudo visudo添加免密指令,例如:%admin ALL=(root) NOPASSWD: /sbin/iptables -I f2b-ssh *, /sbin/iptables -D f2b-ssh *
- 封禁前检查该 IP 是否已在链中,避免重复插入导致规则错位:
sudo iptables -C f2b-ssh -s "$ip" -j REJECT 2>/dev/null || sudo iptables -I f2b-ssh -s "$ip" -j REJECT
- 必须创建专用链(如
f2b-ssh),并在INPUT链中插入跳转,否则重启后失效且干扰主策略
iptables 规则不持久,需配合 iptables-save 或使用 netfilter-persistent。为什么统计频率别设成每分钟一次
高频扫描类攻击(如暴力破解)常在数秒内发出几十次请求,但日志刷盘有延迟,auth.log 可能批量写入。若脚本每分钟跑一次,可能漏掉中间批次;设成每 5 分钟反而更稳——既能覆盖典型攻击窗口,又避免 grep 频繁读大日志拖慢系统。更关键是:用 logrotate 的 postrotate 触发脚本,比 cron 更精准,因为只在日志切片后处理新增内容。示例片段:
/var/log/auth.log {<br> daily<br> postrotate<br> /usr/local/bin/block-failed-ips.sh<br> endscript<br>}

















