【问题标题】:Java check if IPv4 or IPv6 address is in a given subnet [closed]Java检查IPv4或IPv6地址是否在给定子网中[关闭]
【发布时间】:2013-06-10 13:26:09
【问题描述】:

如何检查 IP 地址是否在给定子网中?我可以通过使用 Apache Commons SubnetUtils (SubnetUtils.SubnetInfo.isInRange) 来做到这一点,但它还不支持 IPv6。

【问题讨论】:

标签: java ipv6 ipv4 subnet


【解决方案1】:

edazdarevic's CIDRUtils 支持 IPv4 和 IPv6。例子中没有提到boolean isInRange(String ipAddress),但是实现了!

另一个选项是java-ipv6,但它不支持 IPv4 和requires JDK7。

【讨论】:

    【解决方案2】:

    使用spring-security-web 的IpAddressMatcher。与 Apache Commons Net 不同,它同时支持 ipv4 和 ipv6。

    import org.springframework.security.web.util.matcher.IpAddressMatcher;
    ...
    
    private void checkIpMatch() {
        matches("192.168.2.1", "192.168.2.1"); // true
        matches("192.168.2.1", "192.168.2.0/32"); // false
        matches("192.168.2.5", "192.168.2.0/24"); // true
        matches("92.168.2.1", "fe80:0:0:0:0:0:c0a8:1/120"); // false
        matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/120"); // true
        matches("fe80:0:0:0:0:0:c0a8:11", "fe80:0:0:0:0:0:c0a8:1/128"); // false
        matches("fe80:0:0:0:0:0:c0a8:11", "192.168.2.0/32"); // false
    }
    
    private boolean matches(String ip, String subnet) {
        IpAddressMatcher ipAddressMatcher = new IpAddressMatcher(subnet);
        return ipAddressMatcher.matches(ip);
    }
    

    备注

    如果您不愿意在项目中包含 Spring,请查看我的另一个答案,here。

    【讨论】:

      【解决方案3】:

      commons-ip-math 提供对 IPv4 和 IPv6 地址的支持。以下是检查 IP 地址是否在给定子网中的方法:

      Ipv4Range.parse("192.168.0.0/24").contains(Ipv4.parse("10.0.0.1")) 
      // false
      
      Ipv6Range.parse("2001:db8::/32").contains(Ipv6.parse("2001:db8::4"))
      // true
      

      (免责声明,我是 commons-ip-math 的维护者之一)

      【讨论】:

        【解决方案4】:

        The IPAddress Java library 以多态方式同时支持 IPv4 和 IPv6,并支持子网,包括检查地址或子网是否包含在包含子网中的方法。链接中提供了 javadoc。免责声明:我是该库的项目经理。

        示例代码:

        contains("10.10.20.0/30", "10.10.20.3");
        contains("10.10.20.0/30", "10.10.20.5");
        contains("1::/64", "1::1");
        contains("1::/64", "2::1");
        contains("1::3-4:5-6", "1::4:5");       
        contains("1-2::/64", "2::");
        contains("bla", "foo");
        
        static void contains(String network, String address) {
            IPAddressString one = new IPAddressString(network);
            IPAddressString two = new IPAddressString(address);
            System.out.println(one +  " contains " + two + " " + one.contains(two));
        }
        

        输出:

        10.10.20.0/30 contains 10.10.20.3 true
        10.10.20.0/30 contains 10.10.20.5 false
        1::/64 contains 1::1 true
        1::/64 contains 2::1 false
        1::3-4:5-6 contains 1::4:5 true
        1-2::/64 contains 2:: true
        bla contains foo false
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-09-04
          • 2013-06-11
          • 1970-01-01
          • 2015-01-17
          • 2021-06-20
          • 2017-06-24
          • 1970-01-01
          相关资源
          最近更新 更多