14

IP アドレスが特定のサブネットにあるかどうかを確認するにはどうすればよいですか? Apache Commons SubnetUtils ( SubnetUtils.SubnetInfo.isInRange ) を使用してこれを行うことができましたが、まだ IPv6 をサポートしていません。

4

4 に答える 4

8

edazdarevic の CIDRUtilsは、IPv4 と IPv6 の両方をサポートしています。この例では boolean isInRange(String ipAddress) について言及していませんが、実装されています。

別のオプションはjava-ipv6ですが、IPv4 をサポートしておらず、JDK7 が必要です。

于 2013-06-10T13:26:09.137 に答える
6

spring-security-webIpAddressMatcherを使用します。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 を含めたくない場合は、こちらの他の回答をご覧ください。

于 2017-01-04T09:07:19.993 に答える
1

IPAddress Java ライブラリは、ポリモーフィックな方法で 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
于 2016-09-06T17:40:06.820 に答える