3

Possible Duplicate:
How to check a input IP fall in a specific IP range

I would like to check if a Ip address is in range of private Ip addresses. I do not find any method in .NET and I am not sure how to build it by myself?

For example CheckIsIpPublic("192.168.0.1", upperIp, lowerIp) //should return false

For example CheckIsIpPublic("78.60.143.29", upperIp, lowerIp) //should return true

var upperIp = new List<IPAddress>
             {
               IPAddress.Parse("192.168.0.0"),
               IPAddress.Parse("10.0.0.0"),
               IPAddress.Parse("172.16.0.0"),
               IPAddress.Parse("224.0.0.0")
             };

var lowerIp = new List<IPAddress>
             {
               IPAddress.Parse("192.168.255.255"), 
               IPAddress.Parse("10.255.255.255"), 
               IPAddress.Parse("172.31.255.255"), 
               IPAddress.Parse("255.255.255.255")
             };
Community
  • 1
  • 1
Tomas
  • 17,551
  • 43
  • 152
  • 257
  • [c#: How to check a input IP fall in a specific IP range](http://stackoverflow.com/questions/2138706/c-how-to-check-a-input-ip-fall-in-a-specific-ip-range) – opewix Sep 17 '12 at 12:30
  • @JesseJames The solution do not work in that answer, I do not know why it is accepted as correct! – Tomas Sep 17 '12 at 12:31
  • Slightly unrelated: You also want to check for IPs starting 169. for private addresses. – PhonicUK Sep 17 '12 at 12:38
  • @PhonicUK 169.254.0.0-169.254.255.255 will be added. Thank you! – Tomas Sep 17 '12 at 12:41

3 Answers3

7

Using the IPNetwork class from Codeplex, you can do the following:

//see http://en.wikipedia.org/wiki/Reserved_IP_addresses#Reserved_IPv4_addresses
ReadOnlyCollection<IPNetwork> reservedNetworks =
    new ReadOnlyCollection<IPNetwork>(new[]
        {
            IPNetwork.Parse("0.0.0.0/8"),
            IPNetwork.Parse("10.0.0.0/8"),
            IPNetwork.Parse("127.0.0.0/8"),
            IPNetwork.Parse("169.254.0.0/16"),
            IPNetwork.Parse("172.16.0.0/12"),
            IPNetwork.Parse("192.0.2.0/24"),
            IPNetwork.Parse("192.88.99.0/24"),
            IPNetwork.Parse("192.168.0.0/16"),
            IPNetwork.Parse("198.18.0.0/15"),
            IPNetwork.Parse("198.51.100.0/24"),
            IPNetwork.Parse("203.0.113.0/24"),
            IPNetwork.Parse("224.0.0.0/4"),
            IPNetwork.Parse("240.0.0.0/4")
        });

var isInRange = 
  !reservedNetworks.Any(n => IPNetwork.Contains(n, suspiciousIpAddress));
spender
  • 117,338
  • 33
  • 229
  • 351
1
public struct IpRange
{
    public IPAddress LowerIP;
    public IPAddress UpperIP;

    public IpRange(IPAddress lowerIP, IPAddress upperIP)
    {
        LowerIP = lowerIP;
        UpperIP = upperIP;
    }
}
    public bool CheckIsIpPublic(string adress, List<IpRange> rangeList)
    {
        foreach (var range in rangeList)
        {
            List<int> adressInt = adress.Split('.').Select(str => int.Parse(str)).ToList();
            List<int> lowerInt = range.LowerIP.ToString().Split('.').Select(str => int.Parse(str)).ToList();
            List<int> upperInt = range.UpperIP.ToString().Split('.').Select(str => int.Parse(str)).ToList();

            if (adressInt[0] >= lowerInt[0] && adressInt[0] < upperInt[0])
            {
                return true;
            }
            else if (adressInt[0] >= lowerInt[0] && adressInt[0] == upperInt[0])
            {
                if (adressInt[1] >= lowerInt[1] && adressInt[1] < upperInt[1])
                {
                    return true;
                }
                else if (adressInt[1] >= lowerInt[1] && adressInt[1] == upperInt[1])
                {
                    if (adressInt[2] >= lowerInt[2] && adressInt[2] < upperInt[2])
                    {
                        return true;
                    }
                    else if (adressInt[2] >= lowerInt[2] && adressInt[2] == upperInt[2])
                    {
                        if (adressInt[3] >= lowerInt[3] && adressInt[3] <= upperInt[3])
                        {
                            return true;
                        }
                    }

                }

            }
        }
        return false;
    }

and to run this thing you should use

var rangeList = new List<IpRange>();
rangeList.Add(new IpRange(IPAddress.Parse("192.168.0.0"),IPAddress.Parse("192.168.255.255")));
rangeList.Add(new IpRange(IPAddress.Parse("10.0.0.0"),IPAddress.Parse("10.255.255.255")));
rangeList.Add(new IpRange(IPAddress.Parse("172.16.0.0"),IPAddress.Parse("172.31.255.255")));
rangeList.Add(new IpRange(IPAddress.Parse("224.0.0.0"),IPAddress.Parse("255.255.255.255")));
bool result = CheckIsIpPublic("78.60.143.29", rangeList);
Dmitrii Dovgopolyi
  • 6,231
  • 2
  • 27
  • 44
0

Something like the following would work (not compiled):

public bool IsPrivateIp(string ipAddress)
{
    return (ipAddress.StartsWith("192.168") || ipaddress.Equals("127.0.0.1") || ipAddress.StartsWith("10.0")) ;
}

It works best if you set aside a whole range for internal IP Addresses (10.0.0.0 - 10.0.255.255).

George Stocker
  • 57,289
  • 29
  • 176
  • 237