Implementieren Sie Ihre eigene IP-Adressermittlung innerhalb des CIDR-Bereichs in Umgebungen, in denen es schwierig ist, externe Module wie CloudFront Function zu verwenden.
Implementierung
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; }}Wie man es benutzt
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); // 256Punkte
Gegenseitige Konvertierung zwischen IP-Adresse und Langwert
Bitweise Operationen sind möglich, indem eine IP-Adresse (z. B. 192.168.1.1) in eine 32-Bit-Ganzzahl umgewandelt wird.
CIDR-Bestimmung
Bestimmen Sie, ob die IP-Adresse innerhalb des CIDR-Bereichs liegt, indem Sie eine UND-Verknüpfung mit der Subnetzmaske durchführen.
(ipLong & subnet) === (baseIp & subnet)Alle IPs innerhalb des Bereichs auflisten
Berechnen Sie die Start-IP und End-IP und generieren Sie alle IP-Adressen dazwischen.
Zusammenfassung
Selbst in Umgebungen, in denen externe Bibliotheken nicht verwendet werden können, können Sie die CIDR-Bestimmung selbst implementieren, indem Sie bitweise Operationen verwenden.
Es kann zur IP-Steuerung in CloudFront Function und anderen eingeschränkten Umgebungen verwendet werden.
hsb.horse