privateAddress
uses node:net
Whether an IP address is one only this machine or its own network reaches: unspecified, loopback, private, link-local, carrier-grade NAT, benchmarking, multicast or reserved, unique-local, or an IPv4 address mapped into IPv6 that is one.
import { isIP } from "node:net"; export function privateAddress(ip: string): boolean { const v4 = isIP(ip) === 4 ? ip : /^::ffff:(\d+\.\d+\.\d+\.\d+)$/i.exec(ip)?.[1]; if (v4) { const [a, b] = v4.split(".").map(Number) as [number, number, number, number]; return ( a === 0 || a === 10 || a === 127 || (a === 100 && b >= 64 && b < 128) || (a === 169 && b === 254) || (a === 172 && b >= 16 && b < 32) || (a === 192 && b === 168) || (a === 192 && b === 0) || (a === 198 && (b === 18 || b === 19)) || a >= 224 ); } const v6 = ip.toLowerCase(); return ( v6 === "::" || v6 === "::1" || /^f[cd]/.test(v6) || /^fe[89ab]/.test(v6) || v6.startsWith("ff") || v6.startsWith("::ffff:") || v6.startsWith("64:ff9b:") || v6.startsWith("2001:db8") ); }