如何从SSH攻击日志生成Top20末尾为0的唯一IP段列表?
解决SSH攻击IP网段统计的问题(Top20合并版)
我来帮你搞定这个需求!你的核心目标是从所有/var/log/secure日志(包括归档文件)里提取SSH攻击IP,合并同网段(最后一段改成0),再按攻击次数取Top20。咱们一步步修正命令:
一、处理「Failed password for」密码失败攻击
你原来的命令只能统计单个IP,没法合并网段,而且没覆盖归档日志。试试这个完整命令:
# 遍历所有secure日志,转成网段后统计Top20 grep -h "Failed password for" /var/log/secure* | grep -Po "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | awk '{split($0, octets, "."); print octets[1]"."octets[2]"."octets[3]".0"}' | sort | uniq -c | sort -nr | head -n 20
拆解下每个步骤做了啥:
grep -h "Failed password for" /var/log/secure*:扫所有secure开头的文件(包括归档的secure-YYYYMMDD),-h让输出不带文件名,只留日志内容。grep -Po "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b":精准抓IP地址,\b是为了避免匹配到类似123.45.678.901这种非法IP或者数字片段。awk '{split($0, octets, "."); print octets[1]"."octets[2]"."octets[3]".0"}':把IP按.拆成四段,把最后一段换成0,变成网段格式。sort | uniq -c:排序后统计每个网段出现的次数。sort -nr | head -n 20:按次数从多到少排序,取前20个网段。
二、处理「refused connect from」连接拒绝日志
你之前的命令没输出,是踩了个小坑:直接搜末尾是0的IP,但日志里的攻击者都是真实的单IP(比如116.110.220.123),不是预先生成的网段,肯定匹配不到!修正后的命令如下:
# 处理连接拒绝日志,合并网段取Top20 grep -h "refused connect from" /var/log/secure* | grep -Po "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | awk '{split($0, octets, "."); print octets[1]"."octets[2]"."octets[3]".0"}' | sort | uniq -c | sort -nr | head -n 20
三、合并两类攻击的统计结果(可选)
如果想把「密码失败」和「连接拒绝」的攻击次数合并统计,用这个命令:
# 合并两类日志,统计总攻击次数的Top20网段 grep -h -E "Failed password for|refused connect from" /var/log/secure* | grep -Po "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | awk '{split($0, octets, "."); print octets[1]"."octets[2]"."octets[3]".0"}' | sort | uniq -c | sort -nr | head -n 20
四、额外优化:排除合法IP网段
要是日志里有自己的管理IP或者合法网段,可以加个过滤步骤,比如排除192.168.1.0网段:
# 排除指定合法网段后的统计 grep -h "Failed password for" /var/log/secure* | grep -Po "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" | awk '{split($0, octets, "."); seg=octets[1]"."octets[2]"."octets[3]".0"; if (seg != "192.168.1.0") print seg}' | sort | uniq -c | sort -nr | head -n 20
内容的提问来源于stack exchange,提问作者Joanne
相关产品推荐
相关产品推荐

