Grepping para rangos CIDR

10

De vez en cuando quiero grep rangos CIDR fuera de mis archivos de registro de Apache. Esto es fácil para rangos que caen dentro de los límites naturales (/ 8, / 16 y / 24) pero no es tan fácil para otros rangos como / 17 y / 25.

Ejemplos:

# 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

Estas expresiones regulares ignoran las direcciones IP que incluyen ceros a la izquierda, como 192.168.001.001, que no es un problema en los archivos de registro de Apache pero podría estar en otros archivos de registro. A las impresoras en particular parece gustarles los ceros iniciales. Es bastante fácil agregar los ceros opcionales a la expresión regular, pero solo hace que todo sea un poco más difícil. Tiene que haber una manera más fácil.

¿Hay una manera fácil de seleccionar líneas de un archivo que coincida con cualquier rango CIDR?

Las extensiones de expresiones regulares de lujo se considerarán al igual que las diferentes herramientas (como awko perlsi es necesario, pero quiero que sea de una sola línea) si facilitan el trabajo. Idealmente, lo que me gustaría es algo como

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

Una herramienta que convierte un rango CIDR en la expresión regular apropiada también estaría bien.

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

o

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

Puntos de bonificación si su respuesta también cubre IPv6.

Ladadadada
fuente

Respuestas:

17

No es, como era de esperar, una herramienta para esto: grepcidr.

No se incluye de manera predeterminada con ningún sistema que conozca, pero puede descargarlo desde aquí , y también está en el repositorio de paquetes de Ubuntu y en la colección de puertos de FreeBSD.

(La versión 2.0 también funciona con redes IPv6)

voretaq7
fuente
2
Si necesita la funcionalidad IPv6, algo horrible podría piratearse usando Net :: CIDR en perl ...
voretaq7
También he creado una pequeña herramienta CLI basada en Node.js para IPv4 cidr-grepping
Michele Pangrazzi
5

La rgxgherramienta de línea de comandos recientemente lanzada genera expresiones regulares que coinciden con todas las direcciones en un bloque 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])

o

$ 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 obtener más información, consulte http://rgxg.sf.net .

hvhaugwitz
fuente