首页 > 解决方案 > 是否有一个 java api 可以将 ipv6 地址 fd00:: 识别为本地/私有?

问题描述

我正在寻找一个能够正确识别给定 IP 地址是私有还是本地的 java api。此代码似乎适用于大多数 ipv4/ipv6 地址:

    boolean isLocalIp = InetAddress.getByName(ipAddr).isSiteLocalAddress() ||
                        InetAddress.getByName(ipAddr).isLinkLocalAddress() ||
                        InetAddress.getByName(ipAddr).isLoopbackAddress() ;

特别是,它将“fec0::”识别为本地/私有类型地址,但它不将例如“fc00::”或“fd00::”识别为本地/私有类型地址。

查看此维基百科链接https://en.wikipedia.org/wiki/Private_network#IPv6

地址块 fc00::/7 由 IANA 保留用于唯一本地地址 (ULA)。[2] 它们是单播地址,但在路由前缀中包含一个 40 位随机数,以防止两个专用网络互连时发生冲突。尽管在使用中本质上是本地的,但唯一本地地址的 IPv6 地址范围是全局的。

定义的第一个块是 fd00::/8,设计用于 /48 路由块,用户可以根据需要在其中创建多个子网。

任何人都可以帮助解释这里是否有一些错误的假设(例如“fc00::”或“fd00::”应该被识别为本地/私有ipv6地址)或者是否有其他一些java api可以正确识别所有本地/私有IP地址?

感谢您的任何反馈/答案!

标签: javaipv6ipv4

解决方案


任何人都可以帮助解释这里是否存在一些错误的假设(例如,“fc00::”或“fd00::”应该被标识为本地/私有 ipv6 地址)

这些块中的地址并不意味着路由到单个管理域之外,但术语“站点本地地址”意味着更具体的东西。现在已弃用的术语专门指块 fec0::/10。

fc00::/7 块中的地址是“唯一的本地地址”,不能保证全局唯一,但它们不是本地链接的,因为它们被允许在不同的广播域之间路由。

或者是否有其他一些 java api 可以正确识别所有本地/私有 IP 地址?

我简要地看了看InetAddress.isAnyLocalAddress(),但它的文档似乎与您尝试做的不匹配。看起来标准库没有这样的方法可用。


推荐阅读