Un filtre CIDR fet amb java

"CIDR és un estàndard de xarxa per a la interpretació d’adreces IP. CIDR fa més fàcil l’encaminament al permetre agrupar blocs d’adreces en només una entrada de la taula de rutes. Aquests grups es coneixen com blocs CIDR. Comparteixen la mateixa seqüència inicial de bits en la representació binària de les seves adreces IP.

Els blocs CIDR IPv4 s’identifiquen fent us d’una sintaxi similar a les adreces IPv4:quatre números decimals separats per punts, seguit d’una barra i un número de 0 a 32; A.B.C.D/N.

Els primers quatre números s’interpreten com una adreça IPv4, i el número darrera de la barra és la longitud del prefix, comptant des de l’esquerra, i representa el número de bits comuns a totes les adreces incloses al bloc CIDR."  (de Wikipedia)

Vet aquí una classe java que implementa un Filtre CIDR, o sigui accepta un rang CIDR i ens diu si una IP pertany, o no al rang.

 

package cat.albertbaranguer.filtreip;

import java.util.StringTokenizer;

public class FiltreIP {

private String sRang;

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

FiltreIP filtreIP = new FiltreIP("192.182.152.27/24");

System.out.println("192.182.152.255 " + filtreIP.IsIPInRange("192.182.152.255"));

System.out.println("192.182.152.0 " + filtreIP.IsIPInRange("192.182.152.0"));

System.out.println("192.182.152.23 " + filtreIP.IsIPInRange("192.182.152.23"));

System.out.println("192.182.151.27 " + filtreIP.IsIPInRange("192.182.151.27"));

}

public FiltreIP(String sRang) {

this.sRang = sRang;

}

public void setRang(String sRang) {

this.sRang = sRang;

}

private long ObtenirNumeroIp(String sIP) {

long lIp;

StringTokenizer st = new StringTokenizer(sIP, ".");

String sByte1 = st.nextToken();

String sByte2 = st.nextToken();

String sByte3 = st.nextToken();

String sByte4 = st.nextToken();

long lByte1 = Long.parseLong(sByte1);

long lByte2 = Long.parseLong(sByte2);

long lByte3 = Long.parseLong(sByte3);

long lByte4 = Long.parseLong(sByte4);

lIp = (lByte1 * 16777216) + (lByte2 * 65536) + (lByte3 * 256) + lByte4;

return lIp;

}

// Aquest mètode implementa un Filtre IP especificat en format CIDR

// n1.n2.n3.n4/m

// n1.n2.n3.n4 = b11b12b13b14b15b16b17b18.b21b22b23b24b25b26b27b28.b31b32b33b34b35b36b37b38.b41b42b43b44b45b46b47b48

// m 1 1 1 … 1 0 0 0 … 0

// La màscara s’especifica amb m ‘1’ i 32-m ‘0’

public boolean IsIPInRange(String sIP) {

// obté el rang

StringTokenizer st = new StringTokenizer(sRang, "/");

String sIPRang = st.nextToken();

// obté la màscara

String sNumBitsMascara = st.nextToken();

// número de bits de la màscara del filtre

int iNumBitsMascara = Integer.parseInt(sNumBitsMascara);

// obté la IP base del filtre com a enter

long lBaseRang = ObtenirNumeroIp(sIPRang);

System.out.println("iBaseRang: " + lBaseRang);

System.out.println("Número de 1 de la màscara: " + iNumBitsMascara);

// prepara la màscara base

String sBaseMascara1 = "11111111111111111111111111111111";

String sBaseMascara0 = "00000000000000000000000000000000";

// els primers iNumBitsMascara a "1" i la resta fins 32 a "0".

String sBaseMascara = sBaseMascara1.substring(0, iNumBitsMascara) + sBaseMascara0.substring(0, 32 – iNumBitsMascara);

System.out.println("sBaseMascara: " + sBaseMascara);

// obté la màscara base com enter

long lBaseMascara = Long.parseLong(sBaseMascara, 2);

System.out.println("lBaseMascara: " + lBaseMascara);

System.out.println("lBaseMascara: " + Long.toBinaryString(lBaseMascara));

// obté la màscara aplicant la màscara base a la IP base del filtre

long lMascara = lBaseRang & lBaseMascara;

System.out.println("lMascara: " + lMascara);

System.out.println("lBaseMascara: " + Long.toBinaryString(lMascara));

// obté com enter la IP que es vol determinar si està el el rang especificat pel filtre.

long lIp = ObtenirNumeroIp(sIP);

System.out.println("IP: " + lIp);

System.out.println("IP: " + Long.toBinaryString(lIp));

// elimina els bits del rang final fent and amb la màscara base

long lIpRangEmmascarat = (lIp & lBaseMascara);

System.out.println("IP rang emmascarat: " + lIpRangEmmascarat);

System.out.println("IP rang emmascarat: " + Long.toBinaryString(lIpRangEmmascarat));

// fa xor de la màscara amb la IP emmascarada, per veure si pertany al rang del filtre

long lResultat = lIpRangEmmascarat ^ lMascara;

System.out.println("iResultat: " + lResultat);

// si el resultat és zero, aleshores està en el rang

return (lResultat == 0);

}

}