Windows使用从DNS获取的链接本地IPv6地址的错误范围

在Windows上,我有两个networking接口索引1和2(根据route print )。

我想ping一个使用IPv6链路本地地址(例如fe80::42从接口2可达的主机。 这工作:

 > ping fe80::42 Pinging fe80::42 with 32 bytes of data: Reply from fe80::42: time<1ms > ping fe80::42%2 Pinging fe80::42%2 with 32 bytes of data: Reply from fe80::42%2: time<1ms 

到现在为止还挺好。

现在,我们假设这个接口2configuration了DNS后缀bar和一个DNS服务器,该服务器有一个返回fe80::42 foo.bar条目。 我期望看到这样的事情:

 > ping /6 foo.bar Pinging foo.bar [fe80::42%2] with 32 bytes of data: Reply from fe80::42%2: time<1ms 

但是,我惊讶地发现Windows似乎正在解决一个错误的范围:

 > ping /6 foo.bar Pinging foo.bar [fe80::42%1] with 32 bytes of data: Destination host unreachable. 

为什么? 我该如何解决这个问题,以便Windows将foo.barparsing为fe80::42%2 ,而不是fe80::42%1

附加信息

Windows版本是10.0.15063。

我已经validation使用networking嗅探器,parsingfoo.bar的DNS数据包通过接口2发送到正确的DNS服务器,就像configuration一样。

route print显示的最具体的IPv6路由明确指出,去fe80::42数据包应该通过接口2.基本上我已经手动添加一个如下所示的路由:

  If Metric Network Destination Gateway 2 4242 fe80::42/128 On-link 

我可以看到Windows为什么select与foo.barfe80::42相关的接口1是完全没有理由的。

我已经独立validation了getaddrinfo()的输出是通过构build和运行MSDN示例程序(稍作修改)的罪魁祸首:

 Calling getaddrinfo with following parameters: nodename = foo.bar servname (or port) = 0 getaddrinfo returned success getaddrinfo response 1 Flags: 0x0 Family: AF_INET6 (IPv6) IPv6 address fe80::42%1 Scope information: Zone 1 Level 0 Socket type: SOCK_STREAM (stream) Protocol: IPPROTO_TCP (TCP) Length of this sockaddr: 28 Canonical name: (null) 

(注意输出中的%1Zone 1

您不能在DNS中使用链接本地地址。

这些地址的使用取决于客户端连接到哪个链路,客户端甚至可以同时连接到多个链路(例如,以太网+ wifi)。 或者客户端可能与服务器完全不同,并且从DNS获得的地址将是完全没有意义的。

DNSlogging不包含范围,因为范围对每个客户端都是本地的。 DNS服务器没有办法给客户端一个有意义的范围,所以协议甚至不包括响应中的范围。 这将是没有意义的。

所以简而言之:DNS是全球范围内的地址(包括ULA,如果你想使用本地地址)