Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get all IP addresses from a given IP address and subnet mask

In Java, I need to get list of all IP Addresses contained by a given IP network.

For e.g. let the netowork be: 192.168.5.0/24 then the output will be (192.168.5.0 ... 192.168.5.255).

I could think of the following way but it looks dirty, is there any elegant way? There is no function for the same in InetAddress class.

  1. Get Network Ip from the input Ip and subnet mask.

    mask = (long)(0xffffffff) << (32-subnetMask);
    Long netIp = getLongfromIp(Inputip)& mask;
    

The function 'getLongfromIp' contains code from - How to convert string (IP numbers) to Integer in Java

  1. get the number of hosts by Subnet Mask

    maxRange = (long)0x1<<(32-subnetMask);

  2. Get address of all hopes by adding i for i in (0 .. maxRange) in the netIp

  3. Convert the ip from above step to octet string.

Ps: I am sure the the IP Addresses will be in IPV4 only.

like image 492
Mangat Rai Modi Avatar asked Nov 04 '14 15:11

Mangat Rai Modi


People also ask

How can I get a list of all IP addresses?

On Windows or macOS type ipconfig or on Linux type ifconfig. Press return. Note down the subnet mask, the default gateway, and your own computer's IPv4 address. Enter the command arp -a to get a list of all other IP addresses active on your network.

Can we find IP address from subnet mask?

You can determine the number and type of IP addresses any given local network requires based on its default subnet mask. An example of Class A IP address and subnet mask would be the Class A default submask of 255.0. 0.0 and an IP address of 10.20. 12.2.

How do I find out how many IP addresses are in a subnet?

We can use the following formula to calculate the total number of IP addresses within a subnet by the known the amount of host bits in the subnet mask. Using the formula 2H, where H represents the host bit, we get the following results: Class A = 224 = 16,777,216 total IPs. Class B = 216 = 65,536 total IPs.

How can I get all IP addresses from a server?

Following are the 3 ways you can check website IP address:Check your Welcome Mail: IP address of the server is typically mentioned in the welcome email by the company. Use Ping Command: You can ping the webserver with the CLI, and find the webserver. Global DNS Checker for IP Lookup: Use Global DNS checker tool online ...


2 Answers

Answering my own question, solution is to use Apache commons.net library

import org.apache.commons.net.util.*;

SubnetUtils utils = new SubnetUtils("192.168.1.0/24");
String[] allIps = utils.getInfo().getAllAddresses();
//appIps will contain all the ip address in the subnet

Read more: Class SubnetUtils.SubnetInfo

like image 157
Mangat Rai Modi Avatar answered Oct 23 '22 03:10

Mangat Rai Modi


The IPAddress Java library supports both IPv4 and IPv6 subnets in a polymorphic manner. Disclaimer: I am the project manager.

Here is sample code to list the addresses for an IPv4 or Ipv6 subnet transparently. Subnets can get quite large, especially with IPv6, and it is not wise to attempt to iterate through a large subnet, so the code for iterateEdges shows how to iterate through just the beginning and ending addresses in the subnet.

show("192.168.10.0/24");
show("2001:db8:abcd:0012::/64");

static void show(String subnet) throws AddressStringException {
    IPAddressString addrString = new IPAddressString(subnet);
    IPAddress addr = addrString.toAddress();
    show(addr);
}

static void show(IPAddress subnet) {
    Integer prefixLength = subnet.getNetworkPrefixLength();
    if(prefixLength == null) {
        prefixLength = subnet.getBitCount();
    }
    IPAddress mask = subnet.getNetwork().getNetworkMask(prefixLength, false);
    BigInteger count = subnet.getCount();
    System.out.println("Subnet of size " + count + " with prefix length " + prefixLength + " and mask " + mask);
    System.out.println("Subnet ranges from " + subnet.getLower() + " to " + subnet.getUpper());
    int edgeCount = 3;
    if(count.compareTo(BigInteger.valueOf(256)) <= 0) {
        iterateAll(subnet, edgeCount);
    } else {
        iterateEdges(subnet, edgeCount);
    }
}

Iterates through entire subnet, use with caution:

static void iterateAll(IPAddress subnet, int edgeCount) {
    BigInteger count = subnet.getCount();
    BigInteger bigEdge = BigInteger.valueOf(edgeCount), currentCount = count;
    int i = 0;
    for(IPAddress addr: subnet.getIterable()) {
        currentCount = currentCount.subtract(BigInteger.ONE);
        if(i < edgeCount) {
            System.out.println(++i + ": " + addr);
        } else if(currentCount.compareTo(bigEdge) < 0) {
            System.out.println(count.subtract(currentCount) + ": " + addr);
        } else if(i == edgeCount) {
            System.out.println("...skipping...");
            i++;
        }
    }
}

Iterates through subnet edges:

static void iterateEdges(IPAddress subnet, int edgeCount) {
    for(int increment = 0; increment < edgeCount; increment++) {
        System.out.println((increment + 1) + ": " + subnet.getLower().increment(increment));
    }
    System.out.println("...skipping...");
    BigInteger count = subnet.getCount();
    for(int decrement = 1 - edgeCount; decrement <= 0; decrement++) {
        System.out.println(count.add(BigInteger.valueOf(decrement)) + ": " + subnet.getUpper().increment(decrement));
    }
}

Here is the output:

Subnet of size 256 with prefix length 24 and mask 255.255.255.0
Subnet ranges from 192.168.5.0/24 to 192.168.5.255/24
1: 192.168.5.0/24
2: 192.168.5.1/24
3: 192.168.5.2/24
...skipping...
254: 192.168.5.253/24
255: 192.168.5.254/24
256: 192.168.5.255/24

Subnet of size 18446744073709551616 with prefix length 64 and mask ffff:ffff:ffff:ffff::
Subnet ranges from 2001:db8:abcd:12::/64 to 2001:db8:abcd:12:ffff:ffff:ffff:ffff/64
1: 2001:db8:abcd:12::/64
2: 2001:db8:abcd:12::1/64
3: 2001:db8:abcd:12::2/64
...skipping...
18446744073709551614: 2001:db8:abcd:12:ffff:ffff:ffff:fffd/64
18446744073709551615: 2001:db8:abcd:12:ffff:ffff:ffff:fffe/64
18446744073709551616: 2001:db8:abcd:12:ffff:ffff:ffff:ffff/64
like image 24
Sean F Avatar answered Oct 23 '22 04:10

Sean F