Zuordnen einer ip-Adresse auf eine Tabelle von Subnetz-Masken... Was ist der beste Ansatz in Java?
Hier ist das Szenario... ich habe eine Tabelle der Subnetze. (siehe unten) ich habe eine ip-Adresse. Ich würde gerne erfahren, aus welchem Subnetz die ip-Adresse gehört, die auf Grundlage einer Suche in der Tabelle. Dieser Verein wird dann verwendet, um zu bestimmen, welche Position der Nutzer zu. Es ist ein privates Netzwerk den Raum, so dass die standard-internet-zu-Standort-lookups würde nicht gelten. Was wäre die beste Herangehensweise? Würde ich brauchen, um zu brechen die ip-Adresse in die numerische Teile und ein bitweiser Vergleich gegen alle Subnetze.. oder gibt es integrierte tools in der Java-API, die könnte mir das Leben erleichtern für den Vergleich der IP-Adresse Subnetz-Maske?
Ich bin hauptsächlich auf der Suche für die besten vergleichen Sie IP-Adresse, die zu einem gegebenen Subnet-Maske und die Bestimmung ja, das passt, oder nicht es nicht.. Optional. Irgendwelche Tipps, um die Liste zu speichern und suchen Sie mit minimalen Operationen würde werden geschätzt auch.
Idealerweise würde ich etwas tun, ähnlich wie diese:
List subnetInfo = null;
subnetInfo = findSubnet('192.168.0.1'); //value null if nothing found
....
//return null if nothing found
List findSubnet(String ipaddress) {
List subnetDetails = null;
.... code here ...
return subnetDetails;
}
Tabelle 1: Beispiel für eine Liste der Subnetze
dk-ballerup-gen-off-v411 10.172.80.0/21 NANR-denmark-ballerup-metallbuen66-ground-first-floors-incl-dhcp-(sr14585203)
ae-dubai-ofssl-gen-off-v410 10.172.88.0/24 NANR-arab-emirates-ofssl-iflex-general-office-v410-(sr12781477)
ru-stpetersburg-gen-off-v411 10.172.89.0/24 NANR-russia-stpetersburg-general-office-incl-dhcp (bsteinba)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Apache Commons Net hat eine SubnetUtils für diese Art der Sache, einschließlich der Bestimmung, ob eine gegebene IP-Adresse in einem bestimmten Subnetz.
Triviales Beispiel:
Erinnern, dass die IP-Adresse ist nur ein
int
Wert aus historischen Gründen dargestellt als 4 Oktetts in dezimaler form.Für die gleichen token, das Subnetz ist wirklich eine Reihe von aufeinander folgenden
ints
aus Netzwerk-Adresse eine broadcast-Adresse.Deshalb, wenn Ihre IP-Adresse Objekt hat einen int-Konverter, können Sie einfach überprüfen, wenn die ganze Zahl im Bereich von Subnetz über einfache int-Vergleiche.
Wenn Ihre Tabelle eine SQL-Tabelle UND die Datenbank ist PostgreSql verwenden, können Sie PostgreSQL Typen und Funktionen.
Nun, das ist eine Menge von Bedingungen, ...
Drehen Sie die IP-Adresse und Netzmaske in ints und UND Sie Sie zusammen. Wenn das Ergebnis gleich der IP-Adresse ist eine Adresse, die Netzmaske. Beachten Sie, dass Sie möglicherweise mehr als eine übereinstimmung, wenn Sie Ihre Netzmasken sind nicht unterscheidbar.
Es ist eine alte Frage, aber ich dachte, es lohnt sich, spart jemand anderes, der Schmerz, der mir.
Meiden die Apache Commons Net SubnetUtils Klasse, es ist buggy:
http://en.newinstance.it/2009/03/25/checking-if-an-ip-is-in-a-subnet-range-subnetutilssubnetinfo-isinrange-bug/
spring-web-security
können dies tun in diesen Tagen.Ich bin vor der gleichen Frage, als Sie aber beschränkt auf private Netzwerke (
192.168.X.X, 10.x.x.x, ...
& IPv6).Wenn Sie zu beschränkt sind, um diesen Fall zu, sollten Sie mit dem eingebauten
InetAddress.isSiteLocalAddress()
Ich auf skaffman Lösung eine Methode. Für diejenigen, die interessiert sind in copy-paste-Lösung:
Gehören die folgenden jar-Ihre in pom.xml
Frühjahr bietet die oben genannten Bibliothek zur Unterstützung des ipv4 und ipv6.
Unten ist das code-snippet, um zu überprüfen, ob ip fällt unter bestimmten Subnetz.