2012-03-15 24 views
9

¿Cómo verificaría si la dirección IP está en la categoría privada?Compruebe si la dirección IP está en el rango privado

if(isPrivateIPAddress(ipAddress)) { 
    //do something 
} 

Cualquier sugerencia será apreciada.

RESPUESTA ACTUALIZADO

private static boolean isPrivateIPAddress(String ipAddress) { 

     InetAddress ia = null; 

     try { 
      InetAddress ad = InetAddress.getByName(ipAddress); 
      byte[] ip = ad.getAddress(); 
      ia = InetAddress.getByAddress(ip); 
     } catch (UnknownHostException e) { 

      e.printStackTrace(); 
     } 

     return ia.isSiteLocalAddress(); 
    } 

de escribir este método y que está funcionando muy bien para mí. ¿Pero hay algún caso en el que este método no funcione? Solo quería asegurarme de que funcionará para todos los casos.

+0

duplicados de http://stackoverflow.com/questions/8141277/check-if-ipv4-address-is-in-private-range – sw1nn

Respuesta

2

Este es un hack rápido que generé para probar mi propia dirección.

import java.net.InetAddress; 
import java.net.UnknownHostException; 

public class LocalAddress { 

    public static void main(String[] args) { 
     InetAddress address = null; 
     try { 
      address = InetAddress.getLocalHost(); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } 
     if (address.isSiteLocalAddress()) { 
      System.out.println("Site Local Address: " + address.getHostAddress()); 
     } else { 
      System.out.println("Routeable Address: " + address.getHostAddress()); 
     } 
    } 

} 

EDITAR: Este código no se ha probado para el enlace local direcciones, localhost o bloques de direcciones reservados para la documentación. Los primeros dos casos tienen métodos que los devuelven. El último no está referenciado en la documentación de la clase.

+0

Si necesito verificar alguna dirección IP al azar, ¿cómo puedo hacerlo? Supongamos que si ipAddress es 172.18.36.81 – AKIWEB

+0

Reemplace 'getLocalHost()' con 'getByName (" 172.18.36.81 ")'. Lea el JavaDoc para InetAddress. – BillThor

13

Editar: El método correcto es InetAddress.isSiteLocalAddress().

Rutina de utilidad para comprobar si InetAddress es una dirección local del sitio.

Devoluciones: un valor booleano que indica si InetAddress es un sitio local dirección; o falso si la dirección no es una dirección de unicast local del sitio.

Consulte los comentarios para una discusión.

+0

¿Puede darme un ejemplo basado en esto? Muy apreciado. Gracias – AKIWEB

+0

ejemplos en el enlace que pongo en duda comentario ... – sw1nn

+1

es '' InetAddress.isSiteLocalAddress() '' en lugar de '' isLinkLocalAddress() ''. Ver http: // 4sysops.com/archives/ipv6-tutorial-part-6-site-local-addresses-and-link-local-addresses/para la discusión – sw1nn

2

En primer lugar, las redes privadas pueden utilizar direcciones IPv4 en cualquier lugar en las siguientes gamas:

  • a) 192.168.0.0 - 192.168.255.255 direcciones (IP) 65.536
  • b) 172.16.0.0 - 172,31 .255.255 (1.048.576 direcciones IP)
  • c) 10.0.0.0 - 10.255.255.255 (direcciones IP) 16777216

Como podemos ver en el método isSiteLocalAddress en Inet4Address.java:

public boolean isSiteLocalAddress() { 
    // refer to RFC 1918 
    // 10/8 prefix 
    // 172.16/12 prefix 
    // 192.168/16 prefix 
    int address = holder().getAddress(); 
    return (((address >>> 24) & 0xFF) == 10) 
     || ((((address >>> 24) & 0xFF) == 172) 
      && (((address >>> 16) & 0xF0) == 16)) 
     || ((((address >>> 24) & 0xFF) == 192) 
      && (((address >>> 16) & 0xFF) == 168)); 
} 

So case b) 172.16.0.0 - 172.31.255.255 (1.048.576 direcciones IP) no está satisfecho. Pero se puede escribir fácilmente es el propietario versión de cómo saber si una dirección es privada address.Here es mi versión:

import com.google.common.net.InetAddresses; 

private static boolean isPrivateV4Address(String ip) { 
    int address = InetAddresses.coerceToInteger(InetAddresses.forString(ip)); 
    return (((address >>> 24) & 0xFF) == 10) 
      || ((((address >>> 24) & 0xFF) == 172) 
       && ((address >>> 16) & 0xFF) >= 16 
       && ((address >>> 16) & 0xFF) <= 31) 
      || ((((address >>> 24) & 0xFF) == 192) 
       && (((address >>> 16) & 0xFF) == 168)); 
} 
+1

Esta respuesta es incorrecta. El caso b) está satisfecho porque la máscara es '0xF0'. Es trivial probar que 'InetAddress.getByName (" 172.31.255.255 "). IsSiteLocalAddress()' devuelve verdadero. –

+1

@AlejandroCDeBaca es correcto. –

0

utilizo este:

public boolean isPrivateIP(String ipAddress) { 
     boolean isValid = false; 

     if (ipAddress != null && !ipAddress.isEmpty()) { 
      String[] ip = ipAddress.split("\\."); 
      short[] ipNumber = new short[] { 
        Short.parseShort(ip[0]), 
        Short.parseShort(ip[1]), 
        Short.parseShort(ip[2]), 
        Short.parseShort(ip[3]) 
       }; 

      if (ipNumber[0] == 10) { // Class A 
       isValid = true; 
      } else if (ipNumber[0] == 172 && (ipNumber[1] >= 16 && ipNumber[1] <= 31)) { // Class B 
       isValid = true; 
      } else if (ipNumber[0] == 192 && ipNumber[1] == 168) { // Class C 
       isValid = true; 
      } 
     } 

     return isValid; 
    } 
Cuestiones relacionadas