diff --git a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java index 43656f05b0..28c4fb9f4e 100644 --- a/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java +++ b/dubbo-common/src/main/java/org/apache/dubbo/common/utils/NetUtils.java @@ -412,9 +412,11 @@ public final class NetUtils { while (addresses.hasMoreElements()) { InetAddress address = addresses.nextElement(); if (address instanceof Inet6Address) { - if (!address.isLoopbackAddress() //filter 127.x.x.x - && !address.isAnyLocalAddress() // filter 0.0.0.0 - && !address.isLinkLocalAddress() //filter 169.254.0.0/16 + if (!address.isLoopbackAddress() //filter ::1 + && !address.isAnyLocalAddress() // filter ::/128 + && !address.isLinkLocalAddress() //filter fe80::/10 + && !address.isSiteLocalAddress()// filter fec0::/10 + && !isUniqueLocalAddress(address) //filter fd00::/8 && address.getHostAddress().contains(":")) {//filter IPv6 return (Inet6Address) address; } @@ -427,6 +429,17 @@ public final class NetUtils { return null; } + /** + * If the address is Unique Local Address. + * + * @param address {@link InetAddress} + * @return {@code true} if the address is Unique Local Address,otherwise {@code false} + */ + private static boolean isUniqueLocalAddress(InetAddress address) { + byte[] ip = address.getAddress(); + return (ip[0] & 0xff) == 0xfd; + } + /** * Returns {@code true} if the specified {@link NetworkInterface} should be ignored with the given conditions. *