O Windows usa o escopo incorreto para endereços IPv6 de link local obtidos do DNS

1

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)

    
por Etienne Dechamps 21.05.2017 / 12:31

1 resposta

3

Você não pode usar endereços locais de link no DNS.

O uso desses endereços depende de qual link o cliente está conectado e os clientes podem até estar conectados a vários links ao mesmo tempo (ethernet + wifi, por exemplo). Ou o cliente pode estar em um link completamente diferente do servidor, e o endereço obtido do DNS será completamente sem sentido.

Os registros DNS não contêm o escopo, porque os escopos são locais para cada cliente. O servidor DNS não tem como fornecer um escopo significativo ao cliente, portanto, o protocolo nem inclui o escopo na resposta. Não teria sentido.

Portanto, em suma: o DNS é para endereços de escopo global (que inclui o ULA, se você quiser usar endereços locais)

    
por 21.05.2017 / 13:55