11
votes

Valider une adresse IP (avec masque)

J'ai des adresses IP et un masque tel que 10.1.1.1/32 . Je voudrais vérifier si 10.1.1.1 est à l'intérieur de cette plage. Y a-t-il une bibliothèque ou une utilité qui ferait cela ou dois-je écrire quelque chose moi-même?


6 Réponses :


28
votes

Tout d'abord, vous voudrez convertir vos adresses IP en Int int S, qui sera plus facile à utiliser avec: xxx

une fois que vous avez vos adresses IP En tant que nature int S, vous pouvez faire du bit arithmétique pour effectuer la vérification: xxx


6 commentaires

Supposons que je commence par string ip = "10.1.1.1"; INT MASK = 24 Comment obtenir 0x0a010100 ?


Donc, il n'y a vraiment aucun soutien à cela dans la bibliothèque de la classe de base ou dans un ensemble de manutention de la troisième partie du troisième partie recommandé?


Serait utile de réécrire la solution pour les adresses IPv6


J'ai utilisé cela avec Android pour obtenir l'adresse réseau masquée. Mais le résultat était faux au lieu de 192.168.178.0 J'ai reçu le 0.178.168.192. Vous devez changer de commande de 24,16,8,0 à 0,8,16,24


Je pense qu'il peut être cassé pour bits = 0 (masque '/ 0')


Le passage à INT peut être fait avec nouveau BigInteger (ByTeaddress) .IntValue () pour ceux qui ne veulent pas le transmettre manuellement à int. Merci pour cette réponse



1
votes

Merci à John Kugelman - J'ai utilisé ses extraits de code pour créer cette classe.

$> uname -a
Linux guin 2.6.37.6-0.5-desktop #1 SMP PREEMPT 2011-04-25 21:48:33 +0200 x86_64 x86_64 x86_64 GNU/Linux
$> java -version
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.0-b11, mixed mode)
$> 


0 commentaires

4
votes
public static boolean netMatch(String addr, String addr1){ //addr is subnet address and addr1 is ip address. Function will return true, if addr1 is within addr(subnet)

        String[] parts = addr.split("/");
        String ip = parts[0];
        int prefix;

        if (parts.length < 2) {
            prefix = 0;
        } else {
            prefix = Integer.parseInt(parts[1]);
        }

        Inet4Address a =null;
        Inet4Address a1 =null;
        try {
            a = (Inet4Address) InetAddress.getByName(ip);
            a1 = (Inet4Address) InetAddress.getByName(addr1);
        } catch (UnknownHostException e){}

        byte[] b = a.getAddress();
        int ipInt = ((b[0] & 0xFF) << 24) |
                         ((b[1] & 0xFF) << 16) |
                         ((b[2] & 0xFF) << 8)  |
                         ((b[3] & 0xFF) << 0);

        byte[] b1 = a1.getAddress();
        int ipInt1 = ((b1[0] & 0xFF) << 24) |
                         ((b1[1] & 0xFF) << 16) |
                         ((b1[2] & 0xFF) << 8)  |
                         ((b1[3] & 0xFF) << 0);

        int mask = ~((1 << (32 - prefix)) - 1);

        if ((ipInt & mask) == (ipInt1 & mask)) {
            return true;
        }
        else {
            return false;
        }
}

0 commentaires

3
votes

Voici une version qui prend des descriptions de sous-réseau de plusieurs manières courantes, y compris IPv6 .

basée sur l'autre code posté ici. Sur IPv4 adresses, il pourrait fonctionner plus lentement que l'approche de l'exécution des opérations binaires sur Bare int 's. xxx


0 commentaires

2
votes

Ceci est juste quelques lignes de code avec le bibliothèque de java ipaddress open-source . Disclaimer: Je suis le chef de projet de la bibliothèque iPaddress. xxx

sortie: xxx


0 commentaires

2
votes

Il y a Bibliothèque de la communication de la communication de la communication IP-IP-Math qui est très bonne travail. Veuillez noter qu'en mai 2019, aucune mise à jour de la bibliothèque depuis 2 ans (pourrait être que sa bibliothèque déjà très mature). Sa disponible sur Maven-Central

Il prend en charge travailler avec des adresses IPv4 et IPv6. Leur documentation présente des exemples sur la manière dont vous pouvez vérifier si une adresse est dans une plage spécifique pour IPv4 et IPv6 P>

Exemple de vérification de la plage IPv4: p>

        String input1 = "10.1.1.1";
        Ipv4 ipv41 = Ipv4.parse(input1);

        // Using CIDR notation to specify the networkID and netmask
        Ipv4Range range = Ipv4Range.parse("10.1.1.1/32");
        boolean result = range.contains(ipv41);
        System.out.println(result); //true

        String input2 = "10.1.1.1";
        Ipv4 ipv42 = Ipv4.parse(input2);

        // Specifying the range with a start and end.
        Ipv4 start = Ipv4.of("10.1.1.1");
        Ipv4 end = Ipv4.of("10.1.1.1");
        range = Ipv4Range.from(start).to(end);

        result = range.contains(ipv42); //true
        System.out.println(result);


0 commentaires