logo hsb.horse
← Retour au blog

Blog

Implémentation de la détermination de l'adresse IP de la plage CIDR avec TypeScript

Pour les environnements dans lesquels des modules externes tels que CloudFront Function ne peuvent pas être utilisés, nous avons implémenté notre propre détermination d'adresse IP dans la plage CIDR. Organisé l'implémentation de la syntaxe de classe à l'aide d'opérations au niveau du bit.

Publié:

Implémentez votre propre détermination d’adresse IP dans la plage CIDR dans des environnements où il est difficile d’utiliser des modules externes tels que CloudFront Function.

mise en œuvre

export class CIDR {
#cidr: string;
#baseIp: number;
#subnet: number;
constructor(cidr: string) {
this.#cidr = cidr;
const [baseIp, mask] = cidr.split("/");
this.#baseIp = this.#ipToLong(baseIp);
this.#subnet = this.#cidrToSubnet(Number.parseInt(mask, 10));
}
get cidr() {
return this.#cidr;
}
isInCidrRange(ip: string): boolean {
const ipLong = this.#ipToLong(ip);
const subnet = this.#subnet;
return (ipLong & subnet) === (this.#baseIp & subnet);
}
getCidrRange(): string[] {
const subnet = this.#subnet;
const startIp = this.#baseIp & subnet;
const endIp = startIp + (~subnet >>> 0);
const ips: string[] = [];
for (let i = startIp; i <= endIp; i++) {
ips.push(this.#longToIp(i));
}
return ips;
}
#ipToLong(ip: string): number {
return (
ip
.split(".")
.reduce((acc, octet) => (acc << 8) + Number.parseInt(octet, 10), 0) >>>
0
);
}
#longToIp(long: number): string {
const max = 255;
return [
(long >>> 24) & max,
(long >>> 16) & max,
(long >>> 8) & max,
long & max,
].join(".");
}
#cidrToSubnet(cidr: number): number {
return (-1 << (32 - cidr)) >>> 0;
}
}

Comment utiliser

const cidr = new CIDR("192.168.1.0/24");
// IPアドレスが範囲内かチェック
console.log(cidr.isInCidrRange("192.168.1.100")); // true
console.log(cidr.isInCidrRange("192.168.2.1")); // false
// CIDR範囲内の全IPアドレスを取得
const ips = cidr.getCidrRange();
console.log(ips.length); // 256

Points

Conversion mutuelle entre l’adresse IP et la valeur longue

Les opérations au niveau du bit sont possibles en convertissant une adresse IP (par exemple 192.168.1.1) en un entier de 32 bits.

Détermination du CIDR

Déterminez si l’adresse IP se trouve dans la plage CIDR en effectuant une opération ET avec le masque de sous-réseau.

(ipLong & subnet) === (baseIp & subnet)

Énumérer toutes les adresses IP à portée

Calculez l’IP de début et l’IP de fin et générez toutes les adresses IP entre elles.

résumé

Même dans les environnements où les bibliothèques externes ne peuvent pas être utilisées, vous pouvez implémenter vous-même la détermination CIDR à l’aide d’opérations au niveau du bit.

Il peut être utilisé pour le contrôle IP dans CloudFront Function et d’autres environnements contraints.