2013-06-10 2 views
10

IP 주소가 지정된 서브넷에 있는지 확인하기 위해 어떤 라이브러리를 사용할 수 있습니까? Apache Commons SubnetUtils (SubnetUtils.SubnetInfo.isInRange)와 같은 라이브러리를 찾을 수 있지만 아직 많은 사람들이 IPv6을 지원하지 않습니다.IPv4 또는 IPv6 주소가 지정된 서브넷에 있는지 확인하는 Java 라이브러리

+1

커먼즈 인터넷 기능 요청 vote for : https://issues.apache.org/jira/browse/NET-405 – Vadzim

답변

8

edazdarevic's CIDRUtils은 IPv4와 IPv6을 모두 지원합니다. 이 예제는 boolean isInRange (String ipAddress)를 언급하지 않지만 구현되었습니다!

다른 옵션은 java-ipv6이지만 IPv4는 지원하지 않으며 requires JDK7입니다.

1

The IPAddress Java library은 다형성 방식으로 IPv4와 IPv6을 모두 지원하며 서브넷에서 주소 또는 서브넷을 포함하는지 확인하는 방법을 포함하여 서브넷을 지원합니다. javadoc는 링크에서 사용할 수 있습니다.

다음은 sample code으로, 문제는 IPv4 또는 IPv6과 동일하게 작동합니다.

1

봄의 IpAddressMatcher을 사용하십시오. Apache Commons Net과 달리 ipv4와 ipv6을 모두 지원합니다.

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); 
} 

힌트 : 당신은 스프링을 사용하지 않는 및 짧은 경량 솔루션을 필요로하더라도, 여전히 source code에 (인터페이스 제거) 약간의 수정이 클래스를 사용할 수 있습니다. (이 접근 및/또는 위반하는 경우 심각한 프로젝트를 사용하지 않는 것이 좋습니다 있지만 자신의 license!)

1

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 

(면책, 나는 평민-IP-수학의 관리자들 중 하나 있어요)

관련 문제