Analisar logs do apache para excluir intervalos de IP

3

Eu preciso procurar algumas solicitações em uma pilha enorme de logs do apache. Minha única exigência é esta:

Só preciso ver as solicitações provenientes de qualquer endereço IP que NÃO esteja incluído em uma lista de 50 intervalos de IP que possuo.

Como posso fazer isso acontecer usando qualquer combinação de regexes awk grep ou qualquer coisa? Não consigo pensar em um caminho fácil. A idéia seria obter cada linha, obter a primeira parte (o endereço IP), combiná-la com um arquivo com todos os intervalos e, se não estiver lá, exibi-la. Não faço ideia de como fazer isso, então qualquer ajuda é bem vinda!

Amostras:

uma linha de log http típica é

123.456.789.012 - - [22/Oct/2012:06:37:48 +0100] "GET /test/test HTTP/1.1" 302 224 "-" "some user agent/4.3.5"

Uma linha típica do meu arquivo de intervalos de IP é

192.168.0.1 - 192.168.0.255

Dos percursos, o arquivo de intervalos IP pode ser convertido para a notação 192.168.0.1/24, se necessário. O bom é que todos os intervalos são da classe C (apenas notei isso), então eu acho que apenas as 3 primeiras partes do endereço IP poderiam ser combinadas e isso deve ser bom o suficiente.

    
por unixkiddie 22.10.2012 / 11:16

2 respostas

3

Uma maneira simples e grosseira poderia ser usar grep.

Crie um arquivo ( ranges.txt ) com um intervalo assim:

192\.168\.0\.[0-9]*
10\.0\.0\.[0-9]*

Para criar esse arquivo a partir do arquivo de intervalo que você já tinha, você pode usar sed da seguinte forma:

sed -n -e 's/^\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\) .*$/^\.\.\.[0-9]* /p' your-range-file > ranges.txt

Em seguida, exclua as linhas correspondentes ao padrão nesse arquivo usando o grep da seguinte forma:

$ grep -v -f ranges.txt apache-log-file.log

ou

$ cat apache-log-file.log | < do some pre cleaning > | grep -v -f ranges.txt

Isso pode ajudar você a começar, mas provavelmente não é uma boa solução se a consulta for executada com freqüência e em grandes arquivos de log.

Boa sorte!

    
por 22.10.2012 / 11:50
0

Log é o seu arquivo de log, e iprange é o seu arquivo contendo o ipranges. Perl parte da solução obtém os 3 primeiros componentes do seu endereço IP, e o loop for imprime se ele não existir no arquivo ipranges:

for i in 'perl -lne 'print $1 if (m/(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}/);' log'
> do
>  grep -q $i iprange || echo $i;
> done
    
por 22.10.2012 / 11:44