Analysieren von Protokolldateien für häufige IP-Adressen


12

Also habe ich dies zusammen gehackt, während ich einen DDOS-Angriff durchgemacht habe, um freche ips aus meinen Protokollen zu ziehen . Hat jemand irgendwelche Verbesserungen oder andere Vorschläge, um es besser zu machen?

Hier ist die allgemeine Idee:

  1. IPs nur aus der Protokolldatei ziehen
  2. sortiere sie
  3. uniq und zähle sie
  4. sortiere sie nochmal

Und die Schnur o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt


Ich bin mir nicht sicher, ob dies in Webmastern besser gefragt werden würde ... aber da alles Unix-Utils und die Befehlszeile verwendet ... fand ich, dass dies angemessener wäre.
gabe.

Scheint gut hier. Es basiert auf Unix und ist nicht spezifisch für das Internet (Dies könnte möglicherweise auf viele verschiedene Dinge in den IPs der Apache- oder Firewall-Protokolle zutreffen)
Stefan Lasiewski

Antworten:


7

Ich habe das immer benutzt:

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

Mit kann tailich festlegen, wie weit ich wirklich zurück gehen möchte - gut, wenn Sie nicht log rotate verwenden (aus welchem ​​Grund auch immer), zweitens, wenn ich davon Gebrauch mache awk- da die meisten Logs durch Leerzeichen getrennt sind. ' Ich hatte die Möglichkeit, zusätzliche Informationen (möglicherweise die URLs, die sie aufgerufen haben, Status, Browser usw.) durch Hinzufügen der entsprechenden $Variablen abzurufen. Schließlich uniqfunktioniert ein Fehler darin nur in sich berührenden Paaren - IE:

A
A
A
A
B
A
A

Wird herstellen:

4 A
1 B
2 A

Nicht die gewünschte Ausgabe. Also sortieren wir die erste Spalte (in diesem Fall die ips, aber wir könnten auch andere Spalten sortieren) und uniqsortieren schließlich die Anzahl aufsteigend, damit ich die höchsten Täter sehen kann.


Ja, ich habe das Problem auch mit uniq erkannt, daher meine erste Sortierung, bei der alle IPS so angeordnet wurden, dass Duplikate nebeneinander liegen. Der Tail-Tipp ist auch gut, da das Parsen des gesamten Protokolls bei etwa 4 GB einige Zeit in Anspruch nehmen kann. Gutes Zeug, danke.
gabe.

-k1ist redundant, (1) es gibt nur einen Schlüssel (2) sortverwendet das erste Wort ohnehin als Schlüssel.
Lekensteyn

7

Es klingt so, als ob Sie gerade dabei sind, das fail2ban- Rad neu zu erfinden .

Probieren Sie fail2ban aus. Es macht wahrscheinlich schon, was Sie wollen, und wenn nicht, ist es einfach anzupassen.


1
Das ist ein ziemlich interessantes Projekt, von dem ich nichts wusste, danke. Gleichzeitig möchte ich nichts auf dem Protokollserver installieren, was nicht erforderlich ist, und es ist einfach genug, das zu tun, was ich bereits tue. Ich bin nur auf der Suche nach Verbesserungsvorschlägen. Vielen Dank!
gabe.

Das sieht echt cool aus und die GPL auch.
Eli Frey

7

Marco Ceppi hat Recht awk, ein besseres Werkzeug dafür zu sein, aber awk ist auch ein besseres Werkzeug als sortund uniqseitdem kann diese Logik verwendet werden awk. Es macht keinen großen Unterschied, wenn Sie nur 1000 Zeilen nachverfolgen, aber wenn Sie sich eine riesige Multi-Gig-Protokolldatei ansehen möchten, ist es möglicherweise um Größenordnungen schneller, diese zu verschieben awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -nwird tun, was Sie brauchen, ist aber viel schneller für große Dateien. Es erstellt ein Array von IPs in awk, wobei die IP-Adresse als Schlüssel und die Häufigkeit, mit der die IPs auftreten, als Wert verwendet werden.

Die Geschwindigkeit steigt, weil awk die Daten überschreitet und den größten Teil der Arbeit erledigt, mit Ausnahme des Sortierens der endgültigen Ausgabe. Wenn Sie mit der anderen Methode 1.000.000 Zeilen im Übertragungsprotokoll haben, liest awk diese 1.000.000 Zeilen, die 1.000.000 IPs ausspucken, und sortiert dann die gesamten 1.000.000 IPs und sendet die jetzt sortierten 1.000.000 IPs an uniq Datenmenge, bevor Sie diese sortieren. Anstatt mehrere Durchläufe auf 1.000.000 IPs durchzuführen, erledigt awk fast alles in einem Durchgang.

Mit einem 5.513.132-Zeilen-Apache-Protokoll (1,1 GB) auf meinem Laptop ist hier ein Geschwindigkeitsvergleich:

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

Sehr cool. Ich füge das meiner Trickkiste hinzu.
gabe.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.