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")); // trueconsole.log(cidr.isInCidrRange("192.168.2.1")); // false
// CIDR範囲内の全IPアドレスを取得const ips = cidr.getCidrRange();console.log(ips.length); // 256Points
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.
hsb.horse