No Windows, tenho duas interfaces de rede com índices 1 e 2 (de acordo com route print
).
Desejo fazer ping de um host a partir da interface 2 usando um endereço local de link IPv6, digamos, fe80::42
. Isso funciona:
> 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
Até aí tudo bem.
Agora, digamos que essa interface 2 esteja configurada com o sufixo DNS bar
e com um servidor DNS que tenha uma entrada para foo.bar
que retorne fe80::42
. Eu esperaria ver algo assim:
> ping /6 foo.bar
Pinging foo.bar [fe80::42%2] with 32 bytes of data:
Reply from fe80::42%2: time<1ms
Mas, em vez disso, fiquei surpreso ao descobrir que o Windows parece estar resolvendo o escopo errado:
> ping /6 foo.bar
Pinging foo.bar [fe80::42%1] with 32 bytes of data:
Destination host unreachable.
Por quê? Como posso corrigir isso para que o Windows resolva foo.bar
a fe80::42%2
, não fe80::42%1
?
Informações adicionais
A versão do Windows é 10.0.15063.
Eu verifiquei usando um sniffer de rede que os pacotes DNS para resolver foo.bar
são enviados para o servidor DNS correto por meio da interface 2, exatamente como configurado.
A rota IPv6 mais específica mostrada em route print
indica claramente que os pacotes que vão para fe80::42
devem passar pela interface 2. Basicamente, eu adicionei manualmente uma rota que se parece com isso:
If Metric Network Destination Gateway
2 4242 fe80::42/128 On-link
Não vejo absolutamente nenhum motivo para o Windows escolher a interface 1 para nada relacionado a foo.bar
ou fe80::42
.
Verifiquei, de forma independente, que a saída de getaddrinfo()
é o culpado, criando e executando o programa de exemplo de MSDN (ligeiramente modificado):
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)
(Observe o %1
e Zone 1
na saída)