logo hsb.horse
← Voltar para o índice do blog

Blog

Implementando a determinação de endereços IP do intervalo CIDR com TypeScript

Para ambientes onde módulos externos, como o CloudFront Function, não podem ser usados, implementamos nossa própria determinação de endereço IP dentro do intervalo CIDR. Organizou a implementação da sintaxe da classe usando operações bit a bit.

Publicado:

Implemente sua própria determinação de endereço IP dentro da faixa CIDR em ambientes onde é difícil usar módulos externos, como o CloudFront Function.

implementação

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;
}
}

##Como usar

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

Pontos

Conversão mútua entre endereço IP e valor longo

As operações bit a bit são possíveis convertendo um endereço IP (por exemplo, 192.168.1.1) em um número inteiro de 32 bits.

Determinação CIDR

Determine se o endereço IP está dentro do intervalo CIDR executando uma operação AND com a máscara de sub-rede.

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

Enumere todos os IPs dentro do alcance

Calcule o IP inicial e o IP final e gere todos os endereços IP entre eles.

resumo

Mesmo em ambientes onde bibliotecas externas não podem ser usadas, você mesmo pode implementar a determinação CIDR usando operações bit a bit.

Ele pode ser usado para controle de IP no CloudFront Function e em outros ambientes restritos.