2009-02-17 14 views
9

Sto cercando un pacchetto simile a Net_IPv4 e Net_IPv6 ma scritto per Java. Ha bisogno di essere in grado di effettuare le seguenti operazioni:Calcoli e convalida della rete IPv4/IPv6 per Java?

  • verificare un indirizzo valido (ad esempio 127.0.0.1 è valido, non è 127.0.0.257)
  • ritorno se un indirizzo è contenuto all'interno di una sottorete (ad esempio 127,0 .0.11 è in 127.0.0.0/28)
  • ritorno l'indirizzo di broadcast per una data sottorete (ad esempio per 127.0.0.0/28 è 127.0.0.15)

sarebbe fantastico se potesse anche:

  • Restituisce una lista di indirizzi per una sottorete per
  • Ordinamento di un elenco di indirizzi

probabilmente potrei scrivere un pacchetto per fare tutto questo, ma se qualcuno ha già passato attraverso il disturbo e molto probabilmente ha fatto un lavoro migliore, sto tutto usando questo. Qualcuno sa di un pacchetto o di pacchetti che potrebbero fare tutto questo? Ci stiamo espandendo in IPv6, quindi, se possibile, deve funzionare sia per IPv4 che per IPv6.

Apprezzo qualsiasi aiuto.

risposta

5

E 'solo per IPv4, ma la classe SubnetUtils che fa parte del Commons Net ha la funzionalità che si sta cercando. Basandoti su questo, potresti codificare una versione IPv6 e contribuire al progetto! :)

5

Forse CIDRUtils può aiutarvi. Ti consente di convertire la notazione CIDR in un intervallo IP.

Disclaimer: Sono l'autore di CIDRUtils.

+0

Grazie per pubblicare la tua risposta! Si prega di leggere attentamente le [FAQ sulla promozione di sé] (http://stackoverflow.com/faq#promotion) attentamente. Si noti inoltre che * è * richiesto * di pubblicare un disclaimer ogni volta che si collega al proprio sito/prodotto. –

+0

@AndrewBarber Grazie. Non ero a conoscenza di questo. Stavo solo cercando di aiutare gli altri che potrebbero avere lo stesso problema che avevo. Ad ogni modo, farò un disclaimer. –

3

Sono il principale contributore di commons-ip-math, una libreria Java open source che offre una ricca API per gestire i calcoli più comuni di IPv4, IPv6 e numeri AS. Anche se è stato aperto solo di recente, è stato testato per anni nella battaglia RIPE NCC. Guarda come puoi usarlo qui sotto.

(Tutti gli esempi funzionano con una sintassi simile per i numeri IPv6 e AS. Basta utilizzare invece le classi Ipv6, Ipv6Range, Asn e AsnRange).

  • 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

Anche se la biblioteca di confronta i comparatori per i tipi di intervallo (ad es. confrontando la dimensione delle sottoreti), non esiste un comparatore per i singoli indirizzi.Tuttavia, è abbastanza banale per scrivere il proprio dal IPv4, IPv6 e tipi ASN implementano l'interfaccia 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

Secondo: http://www.helpsystems.com/intermapper/ipv6-address-validation e http://v6decode.com/ "1: 2: 3: 4: 5: 6: 1.2.3.4" è un valore valido IPv6, ma Ipv6.parse ("1: 2: 3: 4: 5: 6: 1.2.3.4") genera IllegalArgumentException. :/ – Pawel

+0

Per gli indirizzi IPv6 con indirizzi IPv4 incorporati come nell'esempio, la libreria deve essere conforme a http://tools.ietf.org/html/rfc4291#section-2.5.5. Quindi, è troppo severo rispetto ai siti web o potresti aver trovato un bug. Indagherò – jgonian

+0

@Pawel Ho creato https://github.com/jgonian/commons-ip-math/issues/2 per indagare su – jgonian

2

The IPAddress Java library supporta sia IPv4 che IPv6 in modo polimorfico tra cui sottoreti. Il javadoc è disponibile al link. Disclaimer: io sono il project manager.

Tutti i casi d'uso elencati sono supportati sia per IPv4 che per IPv6 in modo trasparente. In altre parole, si differenzia dalla maggior parte delle altre utility nel senso che il codice seguente funziona identicamente con IPv4 o IPv6 come stringhe di input.

Verificare se un indirizzo valido

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

ritorno se l'indirizzo è contenuto all'interno di una sottorete

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 
    } 

ritorno l'indirizzo di broadcast per una data sottorete

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 
    } 

restituire un elenco di indirizzi per una sottorete nell'ordine

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 
    } 

Ordinamento di un elenco di indirizzi

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

Preparati di reti subnetted e l'elenco degli indirizzi (risposta 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

Grazie per la brillante biblioteca. La tua libreria supporta quanto segue. 1. Elenco di restituzione degli indirizzi IP in una sottorete 2. Sottorete una rete, ad es. 192.168.0.0/28 sottorete in due/29 reti. Può restituire entrambe le reti sottorete create? – AhmedRana

+0

Prego. Sì, può fare quelle cose, ho aggiornato la risposta con il codice per il tuo esempio, nel tuo esempio ci sono due sottoreti prodotte, ognuna con 8 indirizzi.Tuttavia, nel rispondere alla tua domanda, ora vedo che mentre è possibile ottenere l'elenco delle sottoreti in modo abbastanza semplice ed efficiente, ottenerle come elenco o insieme è facile ma non efficiente per sottoreti di grandi dimensioni (iterando attraverso molti indirizzi), quindi farò aggiungere un metodo di iteratore a blocchi di prefissi per farlo in modo più efficiente, il che dovrebbe semplicemente scorrere l'elenco delle reti subnet. –

+0

Grazie Sean, Qualche versione di questa libreria è compatibile con JRE 1.5 (o c'è un modo per renderla compatibile con 1.5)? Sono interessato solo a IPv4 e ho un limite che deve essere eseguito sul sistema che ha Java 5 – AhmedRana

Problemi correlati