我的DNS包含两个用于ServerA的记录:
A记录及其10.25.46.130
记录及其IPv6地址
我无法让我的SimpleClient.java程序(本文末尾的源代码)在IPv6服务器上列出使用InetAddress.getAllByName()的ServerA的IPv6地址,即使在用-Djava.net.preferIPv6Addresses=true配置JVM时也是如此。
在启用IPv6的Linux服务器上运行的相同测试也是成功的。
配置详细信息:
(10.0.17763)
Windows服务器上的ipconfig输出显示,IPv6似乎已启用:
> 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输出是预期的输出:
> 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:
> 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预期输出:
# 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.130Windows服务器上的相同测试失败:
# 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和内核设置):
# 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 \
下面是SampleClient.java的代码
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服务器配置中可能出现的错误吗?
谢谢。
发布于 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
https://stackoverflow.com/questions/72060475
复制相似问题