解析日誌檔案以查找頻繁的 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

相關內容