在 Windows 上,我有两个网络接口,索引分别为 1 和 2(根据route print
)。
我想使用 IPv6 链路本地地址 ping 可从接口 2 访问的主机,例如 。fe80::42
这可行:
> 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
到目前为止,一切都很好。
现在,假设此接口 2 配置了 DNS 后缀,并且 DNS 服务器具有返回bar
的条目。我希望看到类似以下内容:foo.bar
fe80::42
> 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.bar
为fe80::42%2
,而不是fe80::42%1
?
附加信息
Windows 版本是 10.0.15063。
我已经使用网络嗅探器进行了验证,用于解析的 DNS 数据包foo.bar
已通过接口 2 发送到正确的 DNS 服务器,正如配置的那样。
显示的最具体的 IPv6 路由route print
明确指出,发往的数据包fe80::42
应通过接口 2。基本上,我手动添加了一条如下所示的路由:
If Metric Network Destination Gateway
2 4242 fe80::42/128 On-link
我完全看不出 Windows 为何会选择接口 1 来处理与foo.bar
或相关的任何事情fe80::42
。
我已经通过构建和运行示例程序独立验证了 的输出getaddrinfo()
是罪魁祸首微软(略有修改):
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
答案1
您不能在 DNS 中使用链路本地地址。
这些地址的使用取决于客户端连接到哪个链接,客户端甚至可能同时连接到多个链接(例如以太网 + wifi)。或者客户端可能与服务器处于完全不同的链接上,并且它从 DNS 获得的地址将完全没有意义。
DNS 记录不包含范围,因为范围对于每个客户端而言都是本地的。DNS 服务器无法为客户端提供有意义的范围,因此协议甚至不会在响应中包含范围。这毫无意义。
简而言之:DNS 用于全局范围地址(如果您想使用本地地址,则包括 ULA)