You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从fail2ban日志提取唯一IP及对应封禁次数的实现方法

fail2ban SSH封禁IP统计实现方案

原命令失效原因

你之前直接拼接grep ssh | uniq -c的写法无法输出正确统计结果,核心问题如下:

  • uniq的原生逻辑是仅对相邻、完全一致的行做计数合并,原始日志行带有毫秒级精度的时间戳、进程编号等差异字段,哪怕是同一个IP的两条检测记录,整行内容也完全不同,根本无法被uniq识别为同一条目
  • 没有对提取后的IP做相邻排序,就算过滤出纯IP内容,分散存储的同IP记录也没法被正常计数

正确实现命令

通用版本(依赖grep的perl正则支持):

zcat /var/log/fail2ban.log* | grep "sshd" | grep -oP 'Found \K([0-9]{1,3}\.){3}[0-9]{1,3}' | sort | uniq -c | sort -rn | less

兼容版本(无grep正则依赖,所有Linux系统通用):

zcat /var/log/fail2ban.log* | awk '/sshd.*Found/ {print $8}' | sort | uniq -c | sort -rn | less

各步骤作用说明

  • zcat /var/log/fail2ban.log*:同时读取当前活动日志和所有压缩归档的历史日志,保证统计范围完整,不会遗漏老日志里的IP记录
  • grep "sshd" / awk '/sshd.*Found/':过滤其他服务的检测记录,只保留和SSH服务相关的触发条目
  • grep -oP 'Found \K([0-9]{1,3}\.){3}[0-9]{1,3}' / awk '{print $8}':关键前置预处理步骤——只提取每行中"Found"字段后的IP地址,把时间、日志级别、模块名等无关内容全部剔除,让同一个IP的记录变成完全一致的纯文本行
  • sort:把相同IP的记录排列到相邻位置,满足uniq的统计输入要求
  • uniq -c:对相邻重复的IP做计数,输出格式为「出现次数 + IP」,和你需要的参考输出完全匹配
  • sort -rn:最终将统计结果按出现次数从高到低排序,方便优先排查高频攻击的IP

补充:如果不需要全量历史统计,只需要针对单份归档日志(比如原命令中的fail2ban.log.4.gz)做分析,把zcat后面的文件路径替换成对应文件即可。

内容的提问来源于stack exchange,提问作者somenxavier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.27 21:06:07