首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InetAddress.getAllByName()即使使用-Djava.net.preferIPv6Addresses=true也不返回-Djava.net.preferIPv6Addresses=true地址

InetAddress.getAllByName()即使使用-Djava.net.preferIPv6Addresses=true也不返回-Djava.net.preferIPv6Addresses=true地址
EN

Stack Overflow用户
提问于 2022-04-29 15:43:52
回答 1查看 288关注 0票数 2

我的DNS包含两个用于ServerA的记录:

A记录及其10.25.46.130

  • an地址: fda8:6c3:ce53:a890::55

记录及其IPv6地址

我无法让我的SimpleClient.java程序(本文末尾的源代码)在IPv6服务器上列出使用InetAddress.getAllByName()的ServerA的IPv6地址,即使在用-Djava.net.preferIPv6Addresses=true配置JVM时也是如此。

在启用IPv6的Linux服务器上运行的相同测试也是成功的。

配置详细信息:

(10.0.17763)

  • Java:
  • Windows: Server 2019标准OpenJDK 11.0.5+

Windows服务器上的ipconfig输出显示,IPv6似乎已启用:

代码语言:javascript
复制
> ipconfig
Windows IP Configuration

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . :
   IPv4 Address. . . . . . . . . . . : 10.25.0.214
   Subnet Mask . . . . . . . . . . . : X.X.X.X
   Default Gateway . . . . . . . . . : X.X.X.X

Ethernet adapter Ethernet 2:

   Connection-specific DNS Suffix  . : fr.company.com
   IPv6 Address. . . . . . . . . . . : fda8:6c3:ce53:a890::3
   Link-local IPv6 Address . . . . . : X.X.X.X::X
   Default Gateway . . . . . . . . . : X.X.X.X::X

来自Windows的nslookup输出是预期的输出:

代码语言:javascript
复制
> nslookup ServerA
Server:  dns.fr.company.com
Address:  X.X.X.X

Non-authoritative answer:
Name:    ServerA.fr.company.com
Addresses:  fda8:6c3:ce53:a890::55
          10.25.46.130

我能够在Windows服务器上成功地运行ping -6 ServerA

代码语言:javascript
复制
> ping -6 ServerA
Pinging ServerA.fr.company.com [fda8:6c3:ce53:a890::55] with 32 bytes of data:
Reply from fda8:6c3:ce53:a890::55: time<1ms
Reply from fda8:6c3:ce53:a890::55: time<1ms

下面是从启用了的IPv6服务器运行的IPv6预期输出

代码语言:javascript
复制
# IPv4 (default)
$ java SimpleClient.java ServerA 12345
preferIPv6Addresses: null
InetAddress.getByName()
ServerA/10.25.46.130
InetAddress.getAllByName()
ServerA/10.25.46.130
ServerA/fda8:6c3:ce53:a890:0:0:0:55

# IPv6
$ java -Djava.net.preferIPv6Addresses=true SimpleClient.java ServerA 12345
preferIPv6Addresses: true
InetAddress.getByName()
ServerA/fda8:6c3:ce53:a890:0:0:0:55
InetAddress.getAllByName()
ServerA/fda8:6c3:ce53:a890:0:0:0:55
ServerA/10.25.46.130

Windows服务器上的相同测试失败:

代码语言:javascript
复制
# IPv4 (default)
> java SimpleClient.java ServerA 12345
preferIPv6Addresses: null
InetAddress.getByName()
ServerA/10.25.46.130
InetAddress.getAllByName()
ServerA/10.25.46.130

# IPv6
> java -Djava.net.preferIPv6Addresses=true SimpleClient.java ServerA 12345
preferIPv6Addresses: true
InetAddress.getByName()
ServerA/10.25.46.130
InetAddress.getAllByName()
ServerA/10.25.46.130

在Windows上,对InetAddress.getAllByName()的调用只返回一个IPv4地址,而不是像在Linux启用服务器上所期望的那样,返回一个IPv4和IPv6地址。

我可以在禁用IPv6的Linux服务器上再现相同的行为(grub和内核设置):

代码语言:javascript
复制
# IPv4 (default)
$ java SimpleClient.java ServerA 12345
preferIPv6Addresses: null
InetAddress.getByName()
ServerA/10.25.46.130
InetAddress.getAllByName()
ServerA/10.25.46.130

# IPv6
$ java -Djava.net.preferIPv6Addresses=true SimpleClient.java ServerA 12345
preferIPv6Addresses: true
InetAddress.getByName()
ServerA/10.25.46.130
InetAddress.getAllByName()
ServerA/10.25.46.130

通过这些测试,我得出结论,在Windows的IPv6配置中有些地方出了问题,但我不知道是怎么回事。

一些我试过的笔记和东西:

在C:\\System32 32\ IPv6 \

  • 中手动添加ServerA的IPv6地址将导致程序列出IPv6地址,但只有这个。

下面是SampleClient.java的代码

代码语言:javascript
复制
import java.net.Socket;
import java.net.UnknownHostException;
import java.net.InetAddress;
import java.io.InputStreamReader;
import java.io.InputStream;
import java.io.BufferedReader;
import java.io.IOException;

public class SimpleClient {
    public static void main(String[] args) {
        if (args.length < 2) return;
        String hostname = args[0];
        System.out.println("preferIPv6Addresses: " + System.getProperty("java.net.preferIPv6Addresses"));
        try {
          System.out.println("InetAddress.getByName()");
          System.out.println(InetAddress.getByName(hostname));
          InetAddress[] addresses = InetAddress.getAllByName(hostname);
          System.out.println("InetAddress.getAllByName()");
          for (InetAddress address : addresses) {
            System.out.println(address);
          }
        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        }
        int port = Integer.parseInt(args[1]);
        try (Socket socket = new Socket(hostname, port)) {
            InputStream input = socket.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(input));
            System.out.println(reader.readLine());
        } catch (UnknownHostException ex) {
            System.out.println("Server not found: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("I/O error: " + ex.getMessage());
        }
    }
}

有人能提示一下Windows服务器配置中可能出现的错误吗?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-05-03 15:22:17

该问题发生在Windows服务器的网络配置中。

服务器配置了两个网络接口来隔离IPv4和IPv6,每个接口都被配置为支持单个网络堆栈。

保持单个网络接口并在此接口上配置(、IPv4和IPv6 )解决了问题。

关于SuperUser问题的更多细节:https://superuser.com/questions/1719174/jvm-on-windows-not-returning-any-ipv6-address-in-dns-lookup

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72060475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档