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