Quale libreria è possibile utilizzare per verificare se un indirizzo IP si trova in una determinata subnet? Sono riuscito a trovare librerie come Apnet Commons SubnetUtils (SubnetUtils.SubnetInfo.isInRange) ma molti non supportano ancora IPv6.Libreria Java per verificare se l'indirizzo IPv4 o IPv6 si trova in una subnet specifica
risposta
edazdarevic's CIDRUtils supporta sia IPv4 che IPv6. L'esempio non menziona booleano isInRange (String ipAddress), ma è implementato!
Un'altra opzione è java-ipv6, ma non supporta IPv4 e requires JDK7.
The IPAddress Java library supporta sia IPv4 che IPv6 in modo polimorfico e supporta le sottoreti, inclusi i metodi che controllano il contenimento di un indirizzo o sottorete in una sottorete. Il javadoc è disponibile al link.
Questo è sample code che risolve il problema, che funziona in modo identico con IPv4 o IPv6.
Utilizzare Spring's IpAddressMatcher. A differenza di Apache Commons Net, supporta sia ipv4 che ipv6.
private void checkIpMatch() {
matches("192.168.2.1", "192.168.2.1"); // true
matches("192.168.2.1", "192.168.2.0/32"); // false
matches("192.168.2.5", "192.168.2.0/24"); // true
matches("92.168.2.1", "fe80:0:0:0:0:0:c0a8:1/120"); // false
matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/120"); // true
matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/128"); // false
matches("fe80:0:0:0:0:0:c0a8:11", "192.168.2.0/32"); // false
}
private boolean matches(String ip, String subnet) {
IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(subnet);
return ipAddressMatcher.matches(ip);
}
Suggerimento: Anche se non si sta usando la primavera e hai bisogno di una soluzione rapida leggera, è ancora possibile utilizzare questa classe con molto piccole modifiche (rimuovendo l'interfaccia) al source code. (Anche se questo approccio non è raccomandato per i progetti seri e/o se si sta violando la loro license!)
commons-ip-math fornisce il supporto per IPv4 e indirizzi IPv6. Ecco come è possibile verificare se un indirizzo IP è in una data sottorete:
Ipv4Range.parse("192.168.0.0/24").contains(Ipv4.parse("10.0.0.1"))
// false
Ipv6Range.parse("2001:db8::/32").contains(Ipv6.parse("2001:db8::4"))
// true
(dichiarazione di non responsabilità, io sono uno dei manutentori di commons-ip-matematica)
Commons richiesta di funzionalità rete per votare per: https://issues.apache.org/jira/browse/NET-405 – Vadzim