解析频繁 IP 的日志文件

gab*_*be. 12 logs ip text-processing

因此,我在遭受 DDOS 攻击时将其一起破解,以从我的日志中提取顽皮的ip。任何人都有任何改进或其他建议以使其更好?

这是一般的想法:

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

和字符串o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt

War*_*ung 7

听起来您正在重新发明fail2ban轮子。

看看fail2ban。它可能已经满足您的需求,如果没有,也很容易定制。


Mar*_*ppi 7

我一直用这个:

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
Run Code Online (Sandbox Code Playgroud)

将产生:

4 A
1 B
2 A
Run Code Online (Sandbox Code Playgroud)

不是想要的输出。所以我们对第一列进行排序(在这种情况下是 ips,但我们可以对其他列进行排序)然后uniq它们,最后对计数进行升序排序,以便我可以看到最高的违规者。


Mar*_*try 7

Marco Ceppi 是awk一个更好的工具,但 awk 也是一个更好的工具sortuniq因为该逻辑可以移入awk. 如果您只是拖尾 1000 行,这并没有太大区别,但是如果您想查看一个巨大的多 gig 日志文件,将其移动到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),这是一个速度比较:

  • 2m 45s 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