所以,我在进行 DDOS 攻击时将其一起破解,以拉取淘气ips 从我的日志中消失。有人有任何改进或其他建议以使其变得更好吗?
总体思路如下:
- 仅从日志文件中提取 ip
- 对它们进行排序
- uniq 并计算它们
- 再次对它们进行排序
还有管弦:
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