logo hsb.horse
← Zur Blog-Übersicht

Blog

Implementierung der CIDR-Bereichs-IP-Adressbestimmung mit TypeScript

Für Umgebungen, in denen externe Module wie CloudFront Function nicht verwendet werden können, haben wir unsere eigene IP-Adressermittlung innerhalb des CIDR-Bereichs implementiert. Organisierte die Implementierung der Klassensyntax mithilfe bitweiser Operationen.

Veröffentlicht:

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

Punkte

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.