
Então, eu hackeei isso juntos enquanto sofria um ataque DDOS para extrairdanadinhoips dos meus logs. Alguém tem alguma melhoria ou outra sugestão para melhorar?
Aqui está a ideia geral:
- extraia ip apenas do arquivo de log
- classifique-os
- uniq e conte-os
- classifique-os novamente
E a corda de flautas:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
Responder1
Eu sempre usei isso:
tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
Com tail
eu sou capaz de definir o limite de quão longe eu realmente quero voltar - bom se você não usar a rotação de log (por qualquer motivo), segundo estou usando awk
- já que a maioria dos logs são delimitados por espaço. Eu me deixei com a capacidade de extrair informações adicionais (possivelmente quais URLs eles estavam acessando, status, navegadores, etc.) adicionando a $
variável apropriada. Por último, uma falha uniq
só funciona em pares tocantes - IE:
A
A
A
A
B
A
A
Vai produzir:
4 A
1 B
2 A
Não é a saída desejada. Então classificamos a primeira coluna (neste caso os ips, mas poderíamos classificar outras colunas), depois uniq
elas, finalmente classificamos a contagem crescente para que eu possa ver os maiores infratores.
Responder2
Parece que você está reinventando ofail2banroda.
Dê uma olhada no fail2ban. Provavelmente já faz o que você deseja e, se não, é fácil de personalizar.
Responder3
Marco Ceppi está certo sobre awk
ser uma ferramenta melhor para isso, mas o awk também é uma ferramenta melhor do que sort
e uniq
já que essa lógica pode ser movida para awk
. Não faz muita diferença se você está apenas seguindo 1000 linhas, mas se você quiser ver um enorme arquivo de log de vários gigs, pode ser muito mais rápido movê-lo para awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
fará o que você precisa, mas é muito mais rápido para arquivos grandes. Ele cria uma matriz de IPs no awk, usando o endereço IP como chave e o número de vezes que os IPs ocorrem como valor.
A aceleração ocorre porque o awk passa pelos dados e faz a maior parte do trabalho, exceto classificar a saída final. Usando o outro método, se você tiver 1.000.000 de linhas no log de transferência, o awk lê essas 1.000.000 de linhas, cuspindo 1.000.000 de IPs e, em seguida, a classificação percorre todos os 1.000.000 de IPs, enviando os 1.000.000 de IPs agora classificados para o uniq, o que o reduz a um valor muito menor. quantidade de dados antes de fornecê-los para classificação. Em vez de fazer várias passagens em 1.000.000 de IPs, o awk faz quase tudo em uma única passagem.
Usando um log Apache de 5.513.132 linhas (1,1 GB) no meu laptop, aqui está uma comparação de velocidade:
- 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