解析日志文件以查找频繁的 IP

解析日志文件以查找频繁的 IP

所以,我在进行 DDOS 攻击时将其一起破解,以拉取淘气ips 从我的日志中消失。有人有任何改进或其他建议以使其变得更好吗?

总体思路如下:

  1. 仅从日志文件中提取 ip
  2. 对它们进行排序
  3. uniq 并计算它们
  4. 再次对它们进行排序

还有管弦:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

答案1

我一直用这个:

tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1

tail可以设置我真正想要回溯多远的限制 - 如果您不使用日志旋转(无论出于何种原因),那很好,其次我正在使用awk- 因为大多数日志都是以空格分隔的我'通过添加适当的变量,我可以提取额外的信息(可能是他们访问的 URL、状态、浏览器等)$。最后,它的一个缺陷uniq只适用于接触对 - IE:

A
A
A
A
B
A
A

将产生:

4 A
1 B
2 A

不是所需的输出。因此,我们对第一列(在本例中是 ips,但我们可以对其他列进行排序)进行排序,然后对uniq它们进行排序,最后对计数进行升序排序,以便我可以看到最高的违规者。

答案2

听起来你正在重塑失败2禁止车轮。

给fail2ban 看一下。它可能已经满足您的要求,如果没有,也可以轻松定制。

答案3

Marco Ceppi 关于awk成为一个更好的工具是正确的,但 awk 也是一个比sort和更好的工具,uniq因为该逻辑可以移入awk.如果您只是尾随 1000 行,这并没有多大区别,但如果您想查看一个巨大的多 GB 日志文件,将其移至awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n会做你需要的事情,但对于大文件来说速度要快得多。它在 awk 中创建一个 IP 数组,使用 IP 地址作为键,使用 IP 出现的次数作为值。

速度的提高是因为 awk 只传递一次数据并完成大部分工作(除了对最终输出进行排序之外)。使用另一种方法,如果传输日志中有 1,000,000 行,awk 读取这 1,000,000 行并吐出 1,000,000 个 IP,然后排序遍历整个 1,000,000 个 IP,将现在排序的 1,000,000 个 IP 发送到 uniq,从而将其减少到更小的值在进行排序之前的数据量。 awk 不是在 1,000,000 个 IP 上进行管道传输/多次传递,而是一次性完成几乎所有事情。

在我的笔记本电脑上使用 5,513,132 行 apache 日志(1.1 gigs),以下是速度比较:

  • 2米45秒cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
  • 0米40秒cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n

相关内容