11 Stimmen

Übereinstimmung einer IP-Adresse mit einer Tabelle von Subnetzmasken... Was ist der beste Ansatz in Java?

Hier ist das Szenario... Ich habe eine Tabelle von Subnetzen. (siehe unten) Ich habe eine IP-Adresse. Ich möchte herausfinden, zu welchem Subnetz die IP-Adresse gehört, basierend auf einer Suche in der Tabelle. Diese Zuordnung wird dann verwendet, um zu bestimmen, an welchem Standort sich der Benutzer befindet. Es handelt sich um einen privaten Netzwerkbereich, sodass die Standard-Internet-zu-Ort-Suchen nicht zutreffen würden. Was wäre der beste Ansatz? Müsste ich die IP-Adresse in ihre numerischen Teile aufteilen und einen Bitweisen Vergleich gegen alle Subnetze durchführen.. oder gibt es eingebaute Werkzeuge in der Java API, die mir das Leben erleichtern könnten, um eine IP-Adresse mit einer Subnetzmaske zu vergleichen?

Ich suche hauptsächlich nach dem besten Weg, eine IP-Adresse mit einer gegebenen Subnetzmaske zu vergleichen und festzustellen, ob diese übereinstimmt oder nicht.. Optional. Jede Hilfe, wie man die Liste speichert und mit minimalen Operationen sucht, wäre ebenfalls willkommen.

Idealerweise würde ich etwas Ähnliches tun:

List subnetInfo = null;

subnetInfo = findSubnet('192.168.0.1'); // Wert null, wenn nichts gefunden

....

// Gib null zurück, wenn nichts gefunden
List findSubnet(String ipaddress) {
   List subnetDetails = null;
   .... code here ...
   return subnetDetails;
}

Tabelle 1: Beispiel Liste von Subnetzen

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)

0voto

Clive Evans Punkte 638

Es ist eine alte Frage, aber ich dachte, es lohnt sich, jemand anderem den Schmerz zu ersparen, den es mir verursacht hat.

Achten Sie auf die Apache Commons Net SubnetUtils Klasse, sie ist fehlerhaft:

http://en.newinstance.it/2009/03/25/checking-if-an-ip-is-in-a-subnet-range-subnetutilssubnetinfo-isinrange-bug/

0 Stimmen

Dein Link ist defekt, könntest du ihn bitte aktualisieren? Was stimmt nicht mit Apache Commons?

0 Stimmen

Gute Frage. Dies ist jetzt 6 Jahre alt, ich habe keine Ahnung, was die genauen Details waren. Ich vermute, ich hatte offensichtlich einen falschen Fall, habe mir den Code angesehen und einen Fehler gefunden. Da es ziemlich einfach ist, selbst eine Maske anzuwenden, habe ich das stattdessen gemacht.

0 Stimmen

Wenn es so einfach ist, wie hat es Apache dann falsch gemacht? ;-) Es sieht so aus, als ob IpAddressMatcher in spring-web-security das heutzutage tun kann.

0voto

Cerber Punkte 2809

Ich stehe vor derselben Frage wie du, jedoch auf private Netzwerke (192.168.X.X, 10.x.x.x, ... & IPv6) beschränkt.

Wenn du auch auf diesen Fall beschränkt bist, solltest du die integrierte InetAddress.isSiteLocalAddress() verwenden.

0voto

Pavel Niedoba Punkte 1577

Ich habe eine Methode auf Basis der Lösung von skaffman entwickelt. Für alle, die an einer Lösung zum Kopieren und Einfügen interessiert sind:

    /**
     * Überprüft, ob die Client-IP mit den in der durch Semikolon getrennten Liste von IP-Netzwerken angegebenen IPs übereinstimmt oder in deren Bereich liegt
     *
     * @param clientIp in numerischer Form wie "192.168.0.10"
     * @param ipList wie "127.0.0.1;192.168.0.0/24;10.0.0.0/8"
     * @return true, wenn die Client-IP aus der Liste der IPs und Netzwerke stammt 
     */
    protected boolean evaluateIp(String clientIp, String ipList) {
        BusinessLogger log = getLog();
        log.debug("IP auswerten");
        if (ipList == null) {
            log.info("Keine IP-Adresse in ApiPrivilege angegeben");
            return false;
        }
        String[] subnetMasks = ipList.split(";");
        for (String subnetMask : subnetMasks) {
            subnetMask = subnetMask.trim();
            if (eq(subnetMask, clientIp))
                return true;
            if (subnetMask.contains("/")) {
                if (new SubnetUtils(subnetMask).getInfo().isInRange(clientIp))
                    return true;
            }
        }
        return false;
    }

-3voto

Mohit Garg Punkte 145

Fügen Sie das folgende Jar Ihrer pom.xml hinzu

*
    org.springframework.security
    spring-security-web
    3.0.7.RELEASE
*

Spring stellt die oben genannte Bibliothek zur Unterstützung von ipv4 und ipv6 bereit.

Im Folgenden finden Sie den Code-Ausschnitt, um zu überprüfen, ob die IP-Adresse innerhalb des angegebenen Subnetzes liegt.

System.out.println(matches("192.168.2.1", "192.168.2.1/11"));
System.out.println(  matches("192.168.2.1", "192.168.2.0/32")); 
System.out.println(  matches("192.168.2.5", "192.168.2.0/24"));
System.out.println(  matches("fe80:0:0:0:0:0:c0a8:11", 
  "fe80:0:0:0:0:0:c0a8:1/120")); 
System.out.println(  matches("fe80:0:0:0:0:0:c0a8:11", 
  "fe80:0:0:0:0:0:c0a8:1/128")); 
System.out.println( matches("2401:4900:1780:0:0:0:0:11", 
   "2401:4900:1780:0:0:0:0:0/44")); 

private static boolean matches(String ip, String subnet) {
    IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(subnet);
    return ipAddressMatcher.matches(ip);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X