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)

3voto

Alexander Pogrebnyak Punkte 43705

Denken Sie daran, dass die IP-Adresse nur ein int-Wert ist, der aus historischen Gründen als 4 Oktette in Dezimalform dargestellt wird.

Ebenso ist das Subnetz wirklich ein Bereich aufeinanderfolgender ints von der Netzwerkadresse bis zur Broadcast-Adresse.

Daher können Sie, wenn Ihr IP-Adressobjekt einen int-Konverter hat, einfach überprüfen, ob diese Zahl im Bereich des Subnetzes liegt, indem Sie einfache int-Vergleiche durchführen.

3voto

skaffman Punkte 389758

Apache Commons Net verfügt über ein SubnetUtils für diese Art von Dingen, einschließlich der Bestimmung, ob eine bestimmte IP-Adresse innerhalb eines bestimmten Subnetzes liegt.

Triviale Beispiel:

    String[] subnetsMasks = { ... };
    Collection subnets = new ArrayList();
    for (String subnetMask : subnetsMasks) {
        subnets.add(new SubnetUtils(subnetMask).getInfo());
    }

    String ipAddress = ...;
    for (SubnetInfo subnet : subnets) {
        if (subnet.isInRange(ipAddress)) {
            System.out.println("IP-Adresse " + ipAddress + " befindet sich im Bereich " + subnet.getCidrSignature());
        }
    }

0 Stimmen

Warum benötigen Sie eine API für etwas, das Sie mit dem &-Operator überprüfen können? ... deshalb werden Netzmasken als Netzmasken bezeichnet ...

3 Stimmen

Weil das Umwandeln einer CIDR-Maske in eine Nummer eine Aufgabe ist, die man leicht falsch machen kann. Warum es neu implementieren, wenn man es fertig kaufen kann?

0 Stimmen

Du machst wohl Witze, oder? Du musst nicht einmal die Bytes in einen Integer umwandeln, du kannst die Bytes einfach in einer Schleife maskieren. Etwa 4 Zeilen Code.

1voto

Sean F Punkte 3844

Der beste Weg, dies zu tun, ist die Verwendung eines Adress-Trie und die Überprüfung der Enthaltung in allen Adressen gleichzeitig. Die IPAddress Java-Bibliothek bietet die Möglichkeit, dies sowohl für IPv4 als auch für IPv6 zu tun. Haftungsausschluss: Ich bin der Projektmanager.

String subnets[] = { "10.172.80.0/21", "10.172.88.0/24", "10.172.89.0/24" };
IPv4AddressTrie blocksTrie = new IPv4AddressTrie();
for(String str : subnets) {
    blocksTrie.add(new IPAddressString(str).getAddress().toIPv4());
}
IPAddressString toFindAddrStr = new IPAddressString("10.172.88.3");
IPv4Address toFindBlockFor = toFindAddrStr.getAddress().toIPv4();
IPv4TrieNode containingNode = blocksTrie.elementsContaining(toFindBlockFor);
System.out.println("Für Adresse " + toFindBlockFor + " enthält Block ist " +
    containingNode.toTreeString(false, false) + "\n");

Ergebnis:

Für Adresse 10.172.88.3 enthält Block ist 
 10.172.88.0/24

Die Adresse bietet auch die Möglichkeit, die Enthaltung einzeln zu überprüfen, wie in dieser Antwort: Wie überprüft man, ob eine IP-Adresse aus einem bestimmten Netzwerk/Netzwerk in Java stammt?

0voto

chburd Punkte 4091

Wenn Ihre Tabelle eine SQL-Tabelle ist UND Ihre Datenbank PostgreSql ist, können Sie PostgreSQL Typen und Funktionen verwenden.

Nun, das sind viele Bedingungen ...

0voto

user207421 Punkte 297318

Wandeln Sie die IP-Adresse und die Netzmaske in Ganzzahlen um und verknüpfen Sie sie mit UND. Wenn das Ergebnis der IP-Adresse entspricht, handelt es sich um eine Adresse in dieser Netzmaske. Beachten Sie, dass es zu mehr als einem Treffer kommen kann, wenn Ihre Netzmasken nicht eindeutig sind.

1 Stimmen

Dies gilt nur für IPv4. Die gleiche Technik funktioniert für IPv6, aber die Adressen sind keine ints. Sie sind noch nicht einmal longs. Es handelt sich um 128-Bit-Zahlen, die Java als Byte-Array darstellt.

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