从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
相关产品推荐
相关产品推荐

