From c06c11c75497d02c95d0d589ced3dc187edbb5db Mon Sep 17 00:00:00 2001 From: HHoflittlefish777 <77738092+HHoflittlefish777@users.noreply.github.com> Date: Tue, 10 Jan 2023 14:44:51 +0800 Subject: [PATCH] update IPv6 annotation and filter invalid IPv6 (#11266) --- .../apache/dubbo/common/utils/NetUtils.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) 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. *