Библиотека Java, чтобы проверить, находится ли адрес IPv4 или IPv6 в данной подсети

Какую библиотеку я могу использовать, чтобы проверить, находится ли IP-адрес в данной подсети? Я мог найти библиотеки, такие как Apache Commons SubnetUtils (SubnetUtils.SubnetInfo.isInRange), но многие еще не поддерживают IPv6.

Ответ 1

edazdarevic CIDRUtils поддерживает как IPv4, так и IPv6. В примере не упоминается boolean isInRange (String ipAddress), но он реализован!

Другой вариант java-ipv6, но он не поддерживает IPv4 и требует JDK7.

Ответ 2

Используйте Spring 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 в свой проект, посмотрите мой другой ответ здесь.

Ответ 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

(отказ от ответственности, я являюсь одним из тех, кто поддерживает общедоступность - ip-math)

Ответ 4

Java-библиотека IPAddress поддерживает как 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