2009-02-17 21 views
9

Estoy buscando un paquete que sea similar a Net_IPv4 y Net_IPv6 pero escrito para Java. Tiene que ser capaz de hacer lo siguiente:Cálculos de red IPv4/IPv6 y validación para Java?

  • verificar una dirección válida (por ejemplo, 127.0.0.1 es válida, no es 127.0.0.257)
  • regreso si una dirección está contenida dentro de una subred (por ejemplo 127,0 .0.11 está en 127.0.0.0/28)
  • devolver la dirección de broadcast para una subred determinada (por ejemplo, para 127.0.0.0/28 es 127.0.0.15)

sería increíble si también podía:

  • devolver una lista de direcciones de una subred con el fin
  • Ordenar una lista de direcciones

probablemente podría escribir un paquete que hacer todo esto, pero si alguien ya ha pasado por la molestia y muy probablemente tiene hecho un mejor trabajo, estoy a punto de usar eso. ¿Alguien sabe de tal paquete o paquetes que podrían hacer todo esto? Estamos expandiendo a IPv6, por lo que debe funcionar tanto para IPv4 como para IPv6 si es posible.

Agradezco cualquier ayuda.

Respuesta

5

es sólo para IPv4, pero la clase SubnetUtils que forma parte de Commons Net tiene la funcionalidad que busca. ¡Sobre la base de eso, podría codificar una versión IPv6 y contribuir de nuevo al proyecto! :)

5

Tal vez CIDRUtils puede ayudarle. Le permite convertir la notación CIDR a un rango de IP.

Descargo de responsabilidad: soy el autor de CIDRUtils.

+0

Gracias por publicar su respuesta! Asegúrese de leer detenidamente [Preguntas frecuentes sobre autopromoción] (http://stackoverflow.com/faq#promotion). También tenga en cuenta que * se requiere * que publique una exención de responsabilidad cada vez que se vincula a su propio sitio/producto. –

+0

@AndrewBarber Gracias. No estaba enterado de esto. Solo estaba tratando de ayudar a otros que podrían tener el mismo problema que yo. De todos modos, voy a un descargo de responsabilidad. –

3

Soy el principal colaborador de commons-ip-math, una biblioteca Java de código abierto que ofrece una API rica para tratar los cálculos más comunes de los números IPv4, IPv6 y AS. Aunque solo ha sido recientemente abierto, ha sido probado en batalla por años dentro de RIPE NCC. Vea cómo puede usarlo a continuación.

(Todos los ejemplos funcionan con una sintaxis similar para los números IPv6 y AS. Solo use las clases Ipv6, Ipv6Range, Asn y AsnRange en su lugar).

  • Verify an address is valid (e.g. 127.0.0.1 is valid, 127.0.0.257 is not)
Ipv4.parse("127.0.0.1");  // IPv4 representation of "127.0.0.1" 
Ipv4.parse("127.0.0.257"); // IllegalArgumentException 
  • Return if an address is contained within a subnet (e.g. 127.0.0.11 is in 127.0.0.0/28)
Ipv4Range.parse("127.0.0.0/28").contains(Ipv4.parse("127.0.0.11")); //true 
  • Return the broadcast address for a given subnet (e.g. for 127.0.0.0/28 it's 127.0.0.15)
Ipv4Range.parse("127.0.0.0/28").start().upperBoundForPrefix(28) // 127.0.0.15 
  • Return a list of addresses for a subnet in order
// Range types are Iterable 
for (Ipv4 ipv4 : Ipv4Range.parse("127.0.0.0/30")) { 
    System.out.println(ipv4); 
} 
// Will print: 
127.0.0.0 
127.0.0.1 
127.0.0.2 
127.0.0.3 
  • Sort a list of addresses

Aunque la biblioteca de comparadores para los tipos de rango (p. comparando el tamaño de las subredes), no hay comparador para direcciones individuales.Sin embargo, es bastante trivial para escribir su propia desde IPv4, IPv6 y ASN tipos implementan la interfaz Comparable:

List<Ipv4> list = new ArrayList<Ipv4>(); 
list.add(Ipv4.of("0.0.0.3")); 
list.add(Ipv4.of("0.0.0.4")); 
list.add(Ipv4.of("0.0.0.2")); 
list.add(Ipv4.of("0.0.0.1")); 
Collections.sort(list, new Comparator<Ipv4>() { 
    @Override 
    public int compare(Ipv4 left, Ipv4 right) { 
     return left.compareTo(right); 
    } 
}); 
System.out.println(list); 
// Will print: 
[0.0.0.1, 0.0.0.2, 0.0.0.3, 0.0.0.4] 
+0

De acuerdo con: http://www.helpsystems.com/intermapper/ipv6-address-validation y http://v6decode.com/ "1: 2: 3: 4: 5: 6: 1.2.3.4" es un válido IPv6, pero Ipv6.parse ("1: 2: 3: 4: 5: 6: 1.2.3.4") arroja IllegalArgumentException. :/ – Pawel

+0

Para direcciones IPv6 con direcciones IPv4 incrustadas como en su ejemplo, la biblioteca debe cumplir con http://tools.ietf.org/html/rfc4291#section-2.5.5. Por lo tanto, es demasiado estricto en comparación con los sitios web o es posible que haya encontrado un error. Voy a investigar. – jgonian

+0

@Pawel He creado https://github.com/jgonian/commons-ip-math/issues/2 para investigar – jgonian

2

The IPAddress Java library soporta IPv4 e IPv6 de forma polimórfica incluyendo subredes. El javadoc está disponible en el enlace. Descargo de responsabilidad: soy el gerente del proyecto.

Todos los casos de uso enumerados son compatibles tanto para IPv4 como para Ipv6 de forma transparente. En otras palabras, difiere de la mayoría de las otras utilidades en el sentido de que el siguiente código funciona de forma idéntica con IPv4 o IPv6 como cadenas de entrada.

comprobar si una dirección es válida

String str = "::1"; 
    IPAddressString addrString = new IPAddressString(str); 
    try { 
     IPAddress addr = addrString.toAddress(); 
     ... 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

retorno si la dirección está contenida dentro de una subred

String str = "1::1"; 
    String subnetStr = "1::/64"; 
    IPAddressString addrString = new IPAddressString(str); 
    IPAddressString subnetString = new IPAddressString(subnetStr); 
    try { 
     IPAddress addr = addrString.toAddress(); 
     IPAddress subnet = subnetString.toAddress(); 
     boolean isContained = subnet.contains(addr); //true in this case 
     ... 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

Volver la dirección de difusión para una subred determinada

String subnet = "127.0.0.0/28"; 
    IPAddressString subnetString = new IPAddressString(subnet); 
    try { 
     IPAddress subnet = subnetString.toAddress(); 
     IPAddress broadcastAddr = subnet.getHighest(); 
     ... 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

devolver una lista de direcciones para una subred en orden

String subnet = "127.0.0.0/28"; 
    IPAddressString subnetString = new IPAddressString(subnet); 
    try { 
     IPAddress subnet = subnetString.toAddress(); 
     for(IPAddress addr : subnet) { 
      ... 
     } 
    } catch(IPAddressStringException e) { 
     //e.getMessage provides validation issue 
    } 

Ordenar una lista de direcciones

List<IPAddressString> addrs; 
    Collections.sort(addrs); //IPAddressString implements Comparable 

Consiga el sistema de redes con subredes y lista de direcciones (de respuesta a AhmedRana):

IPAddress subnet = new IPAddressString("192.168.0.0/28").getAddress(); 
    IPAddress newSubnets = subnet.setPrefixLength(subnet.getPrefixLength() + 1, false); 
    System.out.println(newSubnets); //192.168.0.0-8/29 
    HashSet<IPAddress> subnetSet = new HashSet<IPAddress>(); 
    ArrayList<IPAddress> addrList = new ArrayList<IPAddress>(); 
    for(IPAddress addr : newSubnets.getIterable()) { 
     subnetSet.add(addr.toPrefixBlock()); 
     addrList.add(addr); 
    } 
    System.out.println(subnetSet);//[192.168.0.0/29, 192.168.0.8/29] 

    System.out.println(addrList); 
       //[192.168.0.0/29, 192.168.0.1/29, 192.168.0.2/29, 
       //192.168.0.3/29, 192.168.0.4/29, 192.168.0.5/29, 
       //192.168.0.6/29, 192.168.0.7/29, 192.168.0.8/29, 
       //192.168.0.9/29, 192.168.0.10/29, 192.168.0.11/29, 
       //192.168.0.12/29, 192.168.0.13/29, 192.168.0.14/29, 
       //192.168.0.15/29] 
+0

Gracias por la brillante biblioteca. ¿Tu biblioteca admite lo siguiente? 1. Lista de devoluciones de direcciones IP en una subred 2. Subred a una red, p. 192.168.0.0/28 subnet en dos/29 redes. ¿Puede devolver estas redes subneted creadas? – AhmedRana

+0

De nada. Sí, puede hacer esas cosas, actualicé la respuesta con el código para su ejemplo, en su ejemplo, hay dos subredes producidas, cada una con 8 direcciones.Sin embargo, al responder a su pregunta, ahora veo que si bien puede obtener la lista de subredes de manera bastante fácil y eficiente, obtenerlas como una lista o conjunto es fácil pero no eficiente para subredes grandes (iterando a través de muchas direcciones), así que lo haré agregue un método de iterador de bloque de prefijo para hacerlo de manera más eficiente, lo que simplemente iteraría a través de la lista de redes en subredes. –

+0

Gracias Sean, ¿Alguna versión de esta biblioteca es compatible con JRE 1.5 (o hay una forma de hacerlo compatible con 1.5)? Estoy interesado en IPv4 solamente. Y tengo una limitación de que debe ejecutarse en el sistema que tiene Java 5 – AhmedRana