11
votes

Associer une adresse IP à une table de masques de sous-réseau ... Quelle est la meilleure approche en Java?

Voici le scénario ... J'ai une table de sous-réseaux. (Voir ci-dessous) J'ai une adresse IP. J'aimerais savoir quel sous-réseau l'adresse IP appartient à la recherche d'une recherche dans la table. Cette association sera ensuite utilisée pour déterminer quel emplacement à l'utilisateur. C'est un espace de réseau privé afin que l'Internet standard des recherches de localisation ne s'appliquerait pas. Quelle serait la meilleure approche? Aurais-je besoin de casser l'adresse IP dans ses pièces numériques et d'une comparaison des bits contre tous les sous-réseaux. Ou existe-t-il des outils intégrés dans l'API de Java qui pourrait faciliter ma vie pour la comparaison de l'adresse IP au masque de sous-réseau?

Je cherche principalement le meilleur moyen de comparer iPaddress à un système de sous-réseau donné et de déterminer Oui ces matchs, ou non, cela ne signifie pas .. éventuellement. Toute astuce sur la manière de stocker la liste et la recherche avec des opérations minimales serait également appréciée. P>

Idéalement, je ferais quelque chose de similaire à celui-ci: p> xxx pré>

Tableau 1: Exemple de la liste des sous-réseaux p>

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)


0 commentaires

9 Réponses :


3
votes

N'oubliez pas que l'adresse IP n'est qu'une valeur int pour des raisons historiques représentées sous forme de 4 octets de la forme décimale.

Pour le même jeton, le sous-réseau est vraiment une gamme de consécutifs à partir d'une adresse réseau à une adresse de diffusion.

Par conséquent, si votre objet d'adresse IP a un convertisseur INT, vous pouvez simplement vérifier si cet entier est dans la plage du sous-réseau en faisant de simples comparaisons int.


0 commentaires

0
votes

Si votre table est une table SQL et votre base de données est PostgreSQL, vous pouvez utiliser PostgreSQL Types et Fonctions .

Eh bien c'est beaucoup de conditions ...


0 commentaires

0
votes

Tournez l'adresse IP et le masque Netmask en InTS et et-les ensemble. Si le résultat est égal à l'adresse IP, il s'agit d'une adresse dans ce masque de réseau. Notez que vous pouvez obtenir plus d'un match si vos masques ne sont pas distincts.


1 commentaires

Ceci est seulement vrai pour IPv4. La même technique fonctionne pour IPv6, mais les adresses ne sont pas des INTS. Ils ne sont même pas longs. Ce sont des chiffres de 128 bits, que Java représente comme une matrice d'octet.



3
votes

Apache Commons Net a un Subnetutils Pour ce type de chose, y compris la détermination du cas d'une adresse IP donnée dans un sous-réseau donné .

Exemple trivial: P>

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

    String ipAddress = ...;
    for (SubnetInfo subnet : subnets) {
        if (subnet.isInRange(ipAddress)) {
            System.out.println("IP Address " + ipAddress + " is in range " + subnet.getCidrSignature());
        }
    }


4 commentaires

Pourquoi auriez-vous besoin d'une API pour quelque chose que vous pouvez vérifier avec l'opérateur? ... C'est pourquoi les Netmasks sont appelés Netmasks ...


Parce que tourner un masque CIDR en un nombre est le type de tâche que vous pouvez facilement vous tromper. Pourquoi le ré-mise en oeuvre, quand vous pouvez l'obtenir de l'étagère?


Tu plaisante, n'Est-ce pas? Vous n'avez même pas besoin de convertir les octets en un entier, vous pouvez simplement masquer les octets dans une boucle. Environ 4 lignes de code.


Et si le masque de la CIDR traverse la limite d'octet? Plus de lignes de code. Et plus de bugs. Ce problème a été résolu dans les bibliothèques, il y a de meilleures choses à dépenser notre énergie.



0
votes

C'est une vieille question, mais je pensais que cela vaut la peine d'économiser quelqu'un d'autre la douleur qu'elle m'avait causé.

Steer Clear de la classe Subnetutils net Apache Commons, c'est Buggy:

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


5 commentaires

Votre lien est cassé, s'il vous plaît pourriez-vous le mettre à jour? Quel est le problème avec Apache Commons?


Bonne question. Cela a 6 ans maintenant, je ne sais pas ce que les détails étaient. Je soupçonne que j'avais un cas clairement incorrect, j'ai regardé le code et j'ai trouvé une erreur. Étant donné qu'il est assez facile d'appliquer un masque vous-même, je l'aurai à la place.


Si c'est si facile, comment Apache a-t-il eu le problème? ;-) Il ressemble à iPaddressmatcher dans Spring-web-Security peut le faire ces jours-ci.


Droit. J'ai regardé en arrière et j'ai des souvenirs vagues qui correspondent à ce que j'ai trouvé. Si vous regardez: Problèmes.apache.org/jira/browse/net-260< A> Vous pouvez voir qu'ils n'ont pas été considérés comme des entiers pourraient être négatifs, ils ne vérifient pas correctement les gammes. On dirait qu'ils l'avaient réparé à Svn par le point que je m'engusais, que je n'avais pas découvert à l'époque, mais je suis assez sûr qu'il n'y avait pas de version de libération. Certainement je n'ai pas pu trouver une version qui n'avait pas ce bogue.


Donc, en toute justice, ils ont réparé cela maintenant, si vous voulez l'utiliser maintenant, assommez-vous.



0
votes

Je suis confronté à la même question que vous mais limité à Réseaux privés ( 192.168.xx, 10.xxx, ... & IPv6).

Si vous êtes limité à ce cas, vous devez également utiliser l'intégré inetaddress.issitelocaladdress ()


0 commentaires

0
votes

J'ai construit sur la solution Skaffman une méthode. Pour ceux qui sont intéressés par Copy Coller Solution: xxx


0 commentaires

-3
votes

Inclure le JAR suivant VOTRE IN POM.XML

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);
}


0 commentaires

1
votes

La meilleure façon de le faire est d'utiliser une adresse Trie et de vérifier le confinement dans toutes les adresses en même temps. La bibliothèque Java iPaddress fournit les moyens de le faire pour IPv4 et IPv6. Disclaimer: Je suis le chef de projet.

For address 10.172.88.3 containing block is 
● 10.172.88.0/24


0 commentaires