Grepping para faixas CIDR

10

De tempos em tempos, eu quero grep CIDR varia fora dos meus arquivos de log do Apache. Isso é fácil para intervalos que caem nos limites naturais (/ 8, / 16 e / 24), mas não é tão fácil para outros intervalos como / 17 e / 25.

Exemplos:

# 192.168.0.0/16: (easy)
grep " 192\.168\." access_log

# 192.168.128.0/17: (more thought required)
grep -E " 192\.168\.(12[89]|1[3-9][0-9]|2[0-5][0-9])\." access_log

# 192.168.0.0/17: (more thought required)
grep -E " 192\.168\.([0-9]|[0-9][0-9]|1[01][0-9]|12[0-7])\." access_log

# 192.168.128.0/18: (straining my brain)
grep -E " 192\.168\.(1[2-8][0-9]|19[01])\." access_log

Essas regexes ignoram endereços IP que incluem zeros à esquerda, como 192.168.001.001, o que não é um problema nos arquivos de log do Apache, mas pode estar em outros arquivos de log. As impressoras, em particular, parecem gostar dos zeros iniciais. É fácil adicionar os zeros opcionais à regex, mas isso torna a coisa toda um pouco mais difícil. Tem que haver uma maneira mais fácil.

Existe uma maneira fácil de selecionar linhas de um arquivo que corresponda a qualquer intervalo CIDR?

As extensões sofisticadas de regex serão consideradas, assim como as diferentes ferramentas (como awkou perlse necessário, mas eu quero que seja uma linha única) se facilitarem o trabalho. Idealmente, o que eu gostaria é algo como

grep "[:CIDR 192.168.128.0/18:]" access_log

Uma ferramenta que converte um intervalo CIDR no regex apropriado também seria OK.

$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}

ou

$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log

Pontos de bônus se sua resposta também cobrir o IPv6.

Ladadadada
fonte
1
Ao pesquisar isso, encontrei uma ferramenta baseada na Web para converter intervalos de IP em regexes .
Ladadadada

Respostas:

17

Há, obviamente, uma ferramenta para isso: grepcidr.

Por padrão, ele não está incluído em nenhum sistema que eu conheça, mas você pode baixá-lo aqui e está no repositório de pacotes Ubuntu e na coleção de portas FreeBSD também.

(A versão 2.0 também funciona com redes IPv6)

voretaq7
fonte
2
Se você precisa de IPv6 funcionalidade algo horrível poderia ser cortado em conjunto, utilizando Net :: CIDR em perl ...
voretaq7
Eu também construiu uma pequena ferramenta CLI baseado em Node.js para IPv4 CIDR-grepping
Michele Pangrazzi
5

A rgxgferramenta de linha de comando lançada recentemente gera expressões regulares que correspondem a todos os endereços em um bloco CIDR:

$ rgxg cidr 192.168.128.0/18
192\.168\.(19[01]|1[3-8][0-9]|12[89])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])

ou

$ rgxg cidr 2001:db8:a:b:c:d::/112
2001:0?[Dd][Bb]8:0?0?0?[Aa]:0?0?0?[Bb]:0?0?0?[Cc]:0?0?0?[Dd]((::[0-9A-Fa-f]{1,4}|::|:0?0?0?0(::|:[0-9A-Fa-f]{1,4}))|:0\.0(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){2})

Para mais informações, consulte http://rgxg.sf.net .

hvhaugwitz
fonte