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.



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)


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 .

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.