在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.bar或fe80::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)
(注意输出中的%1和Zone 1 )
您不能在DNS中使用链接本地地址。
这些地址的使用取决于客户端连接到哪个链路,客户端甚至可以同时连接到多个链路(例如,以太网+ wifi)。 或者客户端可能与服务器完全不同,并且从DNS获得的地址将是完全没有意义的。
DNSlogging不包含范围,因为范围对每个客户端都是本地的。 DNS服务器没有办法给客户端一个有意义的范围,所以协议甚至不包括响应中的范围。 这将是没有意义的。
所以简而言之:DNS是全球范围内的地址(包括ULA,如果你想使用本地地址)