Entonces, pirateé esto juntos mientras sufría un ataque DDOS para sacar ips traviesos de mis registros. ¿Alguien tiene alguna mejora u otras sugerencias para mejorarlo?
Aquí está la idea general:
- sacar ip solo del archivo de registro
- ordenarlos
- uniq y contarlos
- ordenarlos de nuevo
Y la cuerda o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
text-processing
logs
ip
gabe
fuente
fuente
Respuestas:
Siempre he usado esto:
tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
Gracias a
tail
que soy capaz de establecer el límite de la distancia que realmente quiero llegar, bueno si no usa la rotación de registros (por cualquier razón), en segundo lugar estoy haciendo usoawk
, ya que la mayoría de los registros están delimitados por espacios I ' Me dejé a mí mismo con la capacidad de extraer información adicional (posiblemente, qué URL estaban golpeando, estados, navegadores, etc.) agregando la$
variable adecuada . Por último, un defectouniq
solo funciona al tocar pares - IE:Producirá:
No es la salida deseada. Entonces ordenamos la primera columna (en este caso, los ips, pero podríamos ordenar otras columnas) y luego las
uniq
ordenamos, finalmente ordenamos el recuento ascendente para que pueda ver a los delincuentes más altos.fuente
-k1
es redundante, (1) solo hay una clave (2)sort
comienza a usar la primera palabra como clave de todos modos.Parece que estás en medio de reinventar la rueda fail2ban .
Dale a fail2ban una mirada. Probablemente ya haga lo que desea, y si no, es fácil de personalizar.
fuente
Marco Ceppi tiene razón acerca de
awk
ser una mejor herramienta para esto, pero awk también es una mejor herramienta quesort
yuniq
desde que esa lógica se puede trasladarawk
. No hace mucha diferencia si solo estás siguiendo 1000 líneas, pero si quieres ver un gran archivo de registro de múltiples conciertos, puede ser mucho más rápido moverloawk
.cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
hará lo que necesite pero es mucho más rápido para archivos grandes. Crea una matriz de IP en awk, utilizando la dirección IP como clave y la cantidad de veces que las IP se producen como valor.La aceleración se produce porque awk pasa una vez por los datos y hace la mayor parte del trabajo, excepto para ordenar la salida final. Usando el otro método, si tiene 1,000,000 de líneas en el registro de transferencia, awk lee esas 1,000,000 de líneas que escupen 1,000,000 de IPs, luego ordena las 1,000,000 de IPs completas, enviando las 1,000,000 de IP ahora clasificadas a uniq, lo que lo reduce a un tamaño mucho más pequeño cantidad de datos antes de dar eso para ordenar. En lugar de pasar / hacer múltiples pases con 1,000,000 de IP, awk hace casi todo en un solo paso.
Utilizando un registro de apache de 5.513.132 líneas (1.1 gigas) en mi computadora portátil, aquí hay una comparación de velocidad:
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
fuente