JavaScript: Is IP In One Of These Subnets?
The best approach is IMO making use of bitwise operators. For example, 123.123.48.0/22
represents (123<<24)+(123<<16)+(48<<8)+0
(=2071670784; this might be a negative number) as a 32 bit numeric IP address, and -1<<(32-22)
= -1024 as a mask. With this, and likewise, your test IP address converted to a number, you can do:
(inputIP & testMask) == testIP
For example, 123.123.49.123 is in that range, as 2071671163 & -1024
is 2071670784
So, here are some tool functions:
function IPnumber(IPaddress) { var ip = IPaddress.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/); if(ip) { return (+ip[1]<<24) + (+ip[2]<<16) + (+ip[3]<<8) + (+ip[4]); } // else ... ? return null;}function IPmask(maskSize) { return -1<<(32-maskSize)}
test:
(IPnumber('123.123.49.123') & IPmask('22')) == IPnumber('123.123.48.0')
yields true
.
In case your mask is in the format '255.255.252.0', then you can use the IPnumber function for the mask, too.
Try this:
var ip2long = function(ip){ var components; if(components = ip.match(/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/)) { var iplong = 0; var power = 1; for(var i=4; i>=1; i-=1) { iplong += power * parseInt(components[i]); power *= 256; } return iplong; } else return -1;};var inSubNet = function(ip, subnet){ var mask, base_ip, long_ip = ip2long(ip); if( (mask = subnet.match(/^(.*?)\/(\d{1,2})$/)) && ((base_ip=ip2long(mask[1])) >= 0) ) { var freedom = Math.pow(2, 32 - parseInt(mask[2])); return (long_ip > base_ip) && (long_ip < base_ip + freedom - 1); } else return false;};
Usage:
inSubNet('192.30.252.63', '192.30.252.0/22') => trueinSubNet('192.31.252.63', '192.30.252.0/22') => false
I managed to solve this by using the node netmask module.You can check if an IP belongs to a subnet by making something like this:
import { Netmask } from 'netmask'const block = new Netmask('123.123.208.0/20')const ip = '123.123.208.0'console.log(block.contains(ip))
Will here print true
.
You can install it by using:
npm i --save netmask