2010-05-11 39 views
27

me pregunto si esta es la mejor manera de coincidir con una cadena que comienza con una (expresiones regulares al estilo Perl) de direcciones IP privadas:IP privada identificador de dirección en la expresión regular

(^127\.0\.0\.1)|(^192\.168)|(^10\.)|(^172\.1[6-9])|(^172\.2[0-9])|(^172\.3[0-1]) 

Gracias mucho!

+3

En primer lugar, debe revisar RFC1918 para obtener la lista apropiada. En segundo lugar, sugiero que una solución que no incluya expresiones regulares será más fácil de mantener. Una vez que convierte una dirección IP a numérica, es bastante fácil hacerla coincidir con una lista de rangos de IP privados. Esto también le permitirá usar fácilmente las listas públicas falsas, que contienen mucho más que RFC1918. – derobert

+1

@derobert cierto, pero para usos tales como un filtro de dirección remota Tomcat necesita una expresión regular. – Raedwald

+0

Es un error de principiante común pensar '^' significa "no" en este contexto, por lo que debe señalar: Cada '^' en su expresión simplemente ancla la coincidencia al comienzo de la línea. En la expresión regular tradicional, no hay una forma simple de decir "no esta cadena" aunque las expresiones compatibles con Perl/PCRE tienen aspectos negativos con '(?! ...)' – tripleee

Respuesta

48

Asumo que desea hacer coincidir estos rangos:

 
127. 0.0.0 – 127.255.255.255  127.0.0.0 /8 
10. 0.0.0 – 10.255.255.255  10.0.0.0 /8 
172. 16.0.0 – 172. 31.255.255 172.16.0.0 /12 
192.168.0.0 – 192.168.255.255 192.168.0.0 /16 

te faltan algunos puntos que harían que se acepte por ejemplo 172.169.0.0 a pesar de que esto no debería ser aceptada. Lo he arreglado a continuación. Elimina las nuevas líneas, solo para facilitar la lectura.

(^127\.)| 
(^10\.)| 
(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)| 
(^192\.168\.) 

También tenga en cuenta que esto supone que las direcciones IP ya han sido validados - que acepta las cosas como 10.foobar.

+0

Si desea excluir direcciones IP privadas del seguimiento de Google Analytics, use esto: https://gist.github.com/1000402 –

+2

La primera línea debería ser (^ 127 \.) | –

+0

No valida con nuestras IP internas de red: Por ejemplo: 10.131.43.84 Su bloque 10 está roto – mfriis

3

Se ve bien. En lo personal, que cambiaría el primero:

^127\.0 

Con esta: (^127\.0\.0\.1) que busca de cualquier cosa que se inicia con 127.0.0.1 y se pierda en 127.0.0.2*, 127.0.2.*, etc. 127.0.*

+2

Sé que esto es antiguo, pero esta pregunta fue primera o segunda en mi búsqueda de google Creo que todo el bloque 127.0.0.0/8 está reservado para loopback, por lo que 0 ni siquiera debería estar allí. –

3

Esto es en caso de que decida ir con mi comentario, sugiriendo que no use expresiones regulares. No probado (pero probablemente funciona, o al menos cerca), en Perl:

@private = (
    {network => inet_aton('127.0.0.0'), mask => inet_aton('255.0.0.0') }, 
    {network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') }, 
    # ... 
); 

$ip = inet_aton($ip_text); 
if (grep $ip & $_->{mask} == $_->{network}, @private) { 
    # ip address is private 
} else { 
    # ip address is not private 
} 

Nota ahora cómo @private es sólo datos, que se pueden cambiar fácilmente. O descargue sobre la marcha desde el Cymru Bogon Reference.

editar: Se me ocurre que pedir una expresión regular de Perl no significa que conozca a Perl, por lo que la línea clave es que allí está el 'grep', que simplemente pasa por encima de cada rango de direcciones privadas. Usted toma su IP, a nivel de bit y con la máscara de red, y la compara con la dirección de red. Si es igual, es parte de esa red privada.

13

Esto es lo mismo que la respuesta correcta de Mark, pero ahora incluye las direcciones privadas de IPv6.

/(^127\.)|(^192\.168\.)|(^10\.)|(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|(^::1$)|(^[fF][cCdD])/ 
+4

No es bueno: según Wikipedia, (http://en.wikipedia.org/wiki/Unique_local_address), el bloque (fc00 ::/7) está reservado para direcciones locales únicas. Esta Regex solo agrega la dirección del host local (:: 1) a la solución aceptada. – dana

+3

De acuerdo con https://github.com/rails/rails/pull/12651/files la expresión regular para esto sería '^ [fF] [cCdD]' - Estoy editando la respuesta en consecuencia. – blueyed

+0

El caracter '/' al principio y al final del script me sugiere que está usando la expresión en algún idioma como Javascript, pero eso no es válido en otros idiomas. A pesar de eso, una versión más corta (y sin las barras) es '^ (127 \.) | (192 \ .168 \.) | (10 \.) | (172 \ .1 [6-9] \.) | (172 \ .2 [0-9] \.) | (172 \ .3 [0-1] \.) | (:: 1 $) | ([fF] [cCdD]) ' – Mrdev

8

He generado esta

REGEXP para redes de clase A:

(10)(\.([2]([0-5][0-5]|[][6-9])|[1][0-9][0-9]|[1-9][0-9]|[0-9])){3}

REGEXP para redes de clase B:

(172)\.(1[6-9]|2[0-9]|3[0-1])(\.([2][0-5][0-5]|[1][0-9][0-9]|[1-9][0-9]|[0-9])){2}

REGEXP para redes de clase C :

(192)\.(168)(\.[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]){2}

Quiero saber si se encuentra cualquier error

Si no está seguro de su salida (digamos por ejemplo netstat) y no tiene necesidad de comprobar sobre la validez dirección IP porque ya está hecho , entonces puede capturar direcciones IP privadas con esta fórmula

grep -P "(10. | 192.168 | 172.1 [6-9]. | 172.2 [0-9]. | 172.3 [01].) *"

+3

Simplemente usando' [ 2] [0-5] [0-5] 'para el rango de 200 a 255, los números como 206 a 209 y 216 a 219, etc. no coincidirán. Tendrás que reemplazar esto con '([0-9] | [1-9] [0-9] | 1 [0-9] [0-9] | 2 [0-4] [0-9] | 25 [0-5]) '. – kielabokkie

+0

¿Para qué idioma se usa? No puedo hacer que funcione, https://regex101.com/r/jdVmny/1 – Justin

1

Si está buscando system.net defaultProxy y proxy bypasslist config que utiliza un proxy para la externa, pero utiliza conexiones directas para los hosts internos (podría hacer con un poco de apoyo IPv6) ...

<system.net> 
    <defaultProxy enabled="true"> 
    <proxy proxyaddress="http://proxycluster.privatedomain.net:8080" bypassonlocal="True" /> 
    <bypasslist> 
     <!-- exclude local host --> 
     <add address="^(http|https)://localhost$" /> 
     <!-- excludes *.privatedomain.net --> 
     <add address="^(http|https)://.*\.privatedomain\.net$" /> 
     <!-- excludes simple host names --> 
     <add address="^(http|https)://[a-z][a-z0-9\-_]*$" /> 
     <!-- exclude private network addresses 192.168, 172.16..31 through 31, 127.* etc. --> 
     <add address="^(http|https)://((((127)|(10))\.[0-9]+\.[0-9]+\.[0-9]+)|(((172\.(1[6-9]|2[0-9]|3[0-1]))|(192\.168))\.[0-9]+\.[0-9]+))$"/> 
    </bypasslist> 
    </defaultProxy> 
    <connectionManagement> 
    <add address="*" maxconnection="10" /> 
    </connectionManagement> 
</system.net> 
-1

Fwiw este patrón fue de 10% más rápido utilizando pattern.matcher:

^1((0)|(92\\.168)|(72\\.((1[6-9])|(2[0-9])|(3[0-1])))|(27))\\. 
+1

Hice algunas pruebas, pero parece ser un 100% más lento. ¿Puedes proporcionar algunas pruebas para respaldar esto? –

0
 //RegEx to check for the following ranges. IPv4 only 
     //172.16-31.xxx.xxx 
     //10.xxx.xxx.xxx 
     //169.254.xxx.xxx 
     //192.168.xxx.xxx 

    var regex = /(^127\.)|(^(0)?10\.)|(^172\.(0)?1[6-9]\.)|(^172\.(0)?2[0-9]\.)|(^172\.(0)?3[0-1]\.)|(^169\.254\.)|(^192\.168\.)/; 
2

aquí es lo que yo uso en Python:

rfc1918 = re.compile('^(10(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){3}|((172\.(1[6-9]|2[0-9]|3[01]))|192\.168)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{1,2}|[0-9]{1,2})){2})$') 

se puede quitar el^$ y/o anclajes si lo desea.

Prefiero la expresión regular anterior porque elimina los octetos inválidos (cualquier valor superior a 255).

ejemplo de uso:

if rfc1918.match(ip): 
    print "ip is private" 
Cuestiones relacionadas