附加信息

附加信息

在 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.barfe80::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.barfe80::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)

相关内容