Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if a given ip falls between a given ip range using node js

Please pardon for this trival question

Given a set of Ip the set is quite large and might increase https://github.com/client9/ipcat/blob/master/datacenters.csv#L4

Small example set - first column start ip second - end ip range

enter image description here

I will get the user ip from the request . I need to check if the ip falls in these set of ranges . How do i accomplish this.

I have looked into ip_range_check and range_check.

But they donot check for a ip given given range . How is thhis possible in node js with utmost performance. I dont want to go for a exhaustive search as performance is a hight priority.

Please help something new and quite challenging so far to me.

like image 512
INFOSYS Avatar asked Sep 13 '17 14:09

INFOSYS


People also ask

How do I know if my IP is in the CIDR range?

IP Address In CIDR Range Check Please enter a valid IP Address in IPv4 format and CIDR notation range to check if it belongs to it. For example: enter IP address 192.168. 0.1 and for CIDR range 192.168. 0.0/24 to test it.

How do you express a range of IP addresses?

CIDR notation is written as the IP address, a slash, and the CIDR suffix (for example, the IPv4 " 10.2. 3.41/24 " or IPv6 " a3:bc00::/24 "). The CIDR suffix is the number of starting digits every IP address in the range have in common when written in binary. For example: " 10.10.

What is the range of the IP addresses if there is any?

An IP address is a string of numbers separated by periods. IP addresses are expressed as a set of four numbers — an example address might be 192.158.1.38. Each number in the set can range from 0 to 255. So, the full IP addressing range goes from 0.0.0.0 to 255.255.255.255.


2 Answers

This is quite easy if we convert the ips to simple numbers:

function IPtoNum(ip){
  return Number(
    ip.split(".")
      .map(d => ("000"+d).substr(-3) )
      .join("")
  );
}

Then we can check a certain range as:

 if( IPtoNum(min) < IPtoNum(val) &&    IPtoNum(max) > IPtoNum(val) ) alert("in range");

That can also be applied to a table:

const ranges = [
  ["..41", "192.168.45"],
  ["123.124.125"," 126.124.123"]
];

const ip = "125.12.125";
const inRange = ranges.some(
  ([min,max]) => IPtoNum(min) < IPtoNum(ip) &&   IPtoNum(max) > IPtoNum(ip)
);
like image 87
Jonas Wilms Avatar answered Oct 11 '22 14:10

Jonas Wilms


//Use getCIDR from rangecalc
getCIDR("5.9.0.0", "5.9.255.255")
//This return 5.9.0.0/16

//You can then use ipRangeCheck from ip_range_check
ipRangeCheck("IP TO BE CHECKED", "5.9.0.0/16")
//returns true or false

Pretty sure there's other way to do this.

like image 26
Deja Avatar answered Oct 11 '22 13:10

Deja