解析日志文件以获取频繁的IP


12

因此,在遭受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


不确定在网站管理员中是否会更好...但是由于它们全部使用unix utils和命令行...我认为这里比较合适。
gabe。

似乎在这里很好。它是基于Unix的,并且不是特定于Web的内容(这可能适用于Apache或防火墙日志IP中的许多不同内容)
Stefan Lasiewski 2010年

Answers:


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

将产生:

4 A
1 B
2 A

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


是的,我也意识到了uniq的问题,因此我的第一种方法是将所有IPS排列整齐,以使重复项彼此相邻。尾部提示也很好,因为解析整个日志(约4GB)可能需要一些时间。好东西,谢谢。
gabe。

-k1是多余的,(1)只有一个键(2)sort无论如何都将第一个单词用作键。
Lekensteyn

7

听起来您正在重塑fail2ban轮子。

看看一下fail2ban。它可能已经完成了您想要的操作,如果没有,则很容易自定义。


1
谢谢,那是一个我没有意识到的非常有趣的项目。同时,我不想在日志服务器上安装不需要的任何东西,并且很容易做我已经在做的事情。我只是在寻找有关改进的建议。谢谢!
gabe。

这看起来真的很酷,GPL也是如此。
伊莱·弗雷

7

Marco Ceppi是awk一个更好的工具,但是awk也是一个更好的工具sortuniq因为该逻辑可以移入awk。如果仅尾随1000行,这并没有多大区别,但是如果您要查看巨大的多演出日志文件,将其移入可能要快几个数量级awk

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n将完成您需要的操作,但是对于大文件则要快得多。它使用IP地址作为键并将IP出现的次数作为值,在awk中创建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演出),这是速度比较:

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

很酷。我将其添加到我的技巧包中。
gabe。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.