检查ipAddress是否在私有范围内

时间:2012-03-15 22:51:07

标签: java

我如何检查IP地址是否属于私人类别?

if(isPrivateIPAddress(ipAddress)) {
    //do something
}

任何建议都将受到赞赏。

更新的答案

private static boolean isPrivateIPAddress(String ipAddress) {

        InetAddress ia = null;

        try {
            InetAddress ad = InetAddress.getByName(ipAddress);
            byte[] ip = ad.getAddress();
            ia = InetAddress.getByAddress(ip);
        } catch (UnknownHostException e) {

            e.printStackTrace();
        }

        return ia.isSiteLocalAddress();
    }

我写了这个方法,它对我来说很好。但有没有这种方法不起作用的情况?我只是想确保它适用于每一个案例。

4 个答案:

答案 0 :(得分:17)

修改:正确的方法是InetAddress.isSiteLocalAddress()

  

检查InetAddress是否是站点本地地址的实用程序例程。

     

返回:一个布尔值,指示InetAddress是否是本地站点   地址;如果地址不是站点本地单播地址,则返回false。

请参阅讨论的评论。

答案 1 :(得分:4)

首先,专用网络可以在以下范围内的任何地方使用IPv4地址:

  • a)192.168.0.0 - 192.168.255.255(65,536 IP地址)
  • b)172.16.0.0 - 172.31.255.255(1,048,576 IP地址)
  • c)10.0.0.0 - 10.255.255.255(16,777,216 IP地址)

我们可以从Inet4Address.java中的方法isSiteLocalAddress看到:

 public boolean isSiteLocalAddress() {
    // refer to RFC 1918
    // 10/8 prefix
    // 172.16/12 prefix
    // 192.168/16 prefix
    int address = holder().getAddress();
    return (((address >>> 24) & 0xFF) == 10)
        || ((((address >>> 24) & 0xFF) == 172)
            && (((address >>> 16) & 0xF0) == 16))
        || ((((address >>> 24) & 0xFF) == 192)
            && (((address >>> 16) & 0xFF) == 168));
}

情况b)172.16.0.0 - 172.31.255.255(1,048,576个IP地址)不满足。但你可以很容易地写出你自己的版本,告诉你地址是否是私人地址。这是我的版本:

import com.google.common.net.InetAddresses;

private static boolean isPrivateV4Address(String ip) {
    int address = InetAddresses.coerceToInteger(InetAddresses.forString(ip));
    return (((address >>> 24) & 0xFF) == 10)
            || ((((address >>> 24) & 0xFF) == 172) 
              && ((address >>> 16) & 0xFF) >= 16 
              && ((address >>> 16) & 0xFF) <= 31)
            || ((((address >>> 24) & 0xFF) == 192) 
              && (((address >>> 16) & 0xFF) == 168));
}

答案 2 :(得分:3)

这是我为测试自己的地址而生成的快速黑客攻击。

import java.net.InetAddress;
import java.net.UnknownHostException;

public class LocalAddress {

    public static void main(String[] args) {
        InetAddress address = null;
        try {
            address = InetAddress.getLocalHost();
        } catch (UnknownHostException e) {
             e.printStackTrace();
        }
        if (address.isSiteLocalAddress()) {
            System.out.println("Site Local Address: " + address.getHostAddress());
        } else {
            System.out.println("Routeable Address: " + address.getHostAddress());
        }
    }

}

编辑:此代码尚未针对链接本地地址,localhost或为文档保留的地址块进行测试。前两种情况有返回它们的方法。最后一个未在类的文档中引用。

答案 3 :(得分:0)

我用这个:

public boolean isPrivateIP(String ipAddress) {
        boolean isValid = false;

        if (ipAddress != null && !ipAddress.isEmpty()) {
            String[] ip = ipAddress.split("\\.");
            short[] ipNumber = new short[] { 
                    Short.parseShort(ip[0]), 
                    Short.parseShort(ip[1]), 
                    Short.parseShort(ip[2]),
                    Short.parseShort(ip[3])
                };

            if (ipNumber[0] == 10) { // Class A
                isValid = true;
            } else if (ipNumber[0] == 172 && (ipNumber[1] >= 16 && ipNumber[1] <= 31)) { // Class B
                isValid = true;
            } else if (ipNumber[0] == 192 && ipNumber[1] == 168) { // Class C
                isValid = true;
            }
        }

        return isValid;
    }