
Entonces, hackeé esto mientras sufría un ataque DDOS para sacartraviesoips fuera de mis registros. ¿Alguien tiene alguna mejora u otras sugerencias para mejorarlo?
Aquí está la idea general:
- extraer las IP únicamente del archivo de registro
- ordenarlos
- uniq y contarlos
- ordenarlos de nuevo
Y la cuerda de flautas:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
Respuesta1
Siempre he usado esto:
tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
Con tail
Puedo establecer el límite de qué tan atrás realmente quiero llegar; bueno si no usas la rotación de registros (por cualquier motivo), segundo, lo estoy usando, awk
ya que la mayoría de los registros están delimitados por espacios. Me he dejado con la capacidad de extraer información adicional (posiblemente qué URL estaban visitando, estados, navegadores, etc.) agregando la $
variable apropiada. Por último, hay un defecto en uniq
que solo funciona en pares que se tocan, es decir:
A
A
A
A
B
A
A
Producirá:
4 A
1 B
2 A
No es el resultado deseado. Entonces ordenamos la primera columna (en este caso las ips, pero podríamos ordenar otras columnas), luego uniq
las ordenamos y finalmente ordenamos el recuento de manera ascendente para poder ver los infractores más altos.
Respuesta2
Parece que estás en medio de reinventar elfalla2banrueda.
Échale un vistazo a fail2ban. Probablemente ya haga lo que desea y, si no, es fácil de personalizar.
Respuesta3
Marco Ceppi tiene razón al decir que awk
es una mejor herramienta para esto, pero awk también es una mejor herramienta sort
y uniq
desde entonces esa lógica se puede trasladar a awk
. No hace mucha diferencia si solo estás siguiendo 1000 líneas, pero si quieres ver un enorme archivo de registro de varios gigas, puede ser mucho más rápido moverlo a awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
hará lo que necesita 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 aparece la IP como valor.
La aceleración se debe a que awk pasa los datos y hace la mayor parte del trabajo, excepto ordenar el resultado 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 escupiendo 1.000.000 de IP, luego ordena las 1.000.000 de IP completas y envía las 1.000.000 de IP ahora ordenadas a uniq, lo que las reduce a un número mucho más pequeño. cantidad de datos antes de darlos para ordenar. En lugar de realizar múltiples pasadas en 1.000.000 de IP, awk hace casi todo en una sola pasada.
Usando un registro de Apache de 5.513.132 líneas (1,1 gigas) en mi computadora portátil, aquí hay una comparación de velocidades:
- 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