Como altero as configurações de DNS para WSL2?

Como altero as configurações de DNS para WSL2?

Pelo que consegui descobrir, o processo oficial para alterar qual servidor DNS é usado pelo WSL2 no Windows 10 é detalhado abaixo. (WSL2 é a nova versão do subsistema Windows para Linux, que executa um kernel Linux real em uma VM leve no Windows 10.)

No entanto, esse processo não funciona para mim - acabo com um sistema que simplesmente expira e não consegue resolver nenhum endereço.

O que estou fazendo de errado?

Aqui está o processo que eu juntei até agora:

1. Desligue a geração de/etc/resolv.conf

Usando o prompt do Linux (estou usando o Ubuntu), modifique (ou crie) /etc/wsl.conf com o seguinte conteúdo

[network]
generateResolvConf = false

(Aparentemente, há um bug na versão atual em que qualquer espaço em branco nessas linhas atrapalhará as coisas.)

2. Reinicie a máquina virtual WSL2

Saia de todos os prompts do Linux e execute o seguinte comando Powershell

wsl --shutdown

3. Crie um personalizado/etc/resolv.conf

Abra um novo prompt do Linux e faça cd para/etc

Se resolv.confestiver vinculado a outro arquivo, remova o link com

rm resolv.conf

Crie um novo resolv.confcom o seguinte conteúdo

nameserver 1.1.1.1

4. Reinicie a máquina virtual WSL2

Igual ao passo 2

5. Inicie um novo prompt do Linux.

Lucro!

Atualização em 18 de março de 2020

Meu /etc/hostsarquivo contém isto:

# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateHosts = false
127.0.0.1       localhost
127.0.1.1       [redacted]  bearps-desktop

10.168.244.140  host.docker.internal
10.168.244.140  gateway.docker.internal
127.0.0.1       kubernetes.docker.internal

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

O arquivo /etc/switch.confnão existe.

A ferramenta resolvectlnão está no meu caminho; não existe em /usr/bin/resolvectl.

Da mesma forma systemd-resolvenão está no meu caminho; não existe em /usr/bin/systemd-resolve.

Responder1

O processo que documentei acima está correto - esteécomo você altera as configurações de DNS no WSL2.

Meu erro foi usar os conhecidos servidores DNS públicos para CloudFlare (1.1.1.1) e Google (8.8.8.8 e 8.8.4.4) para fins de teste. Acontece que minha rede local me impede de usar DNS público.

Quando testei o processo acima com o endereço IP do servidor DNS interno correto, tudo funcionou corretamente.

Responder2

Adicionando a outras respostas aqui vocêtambémdeseja definir resolv.confimutável.

sudo chattr +i /etc/resolv.conf

No meu caso, ele estava sendo excluído a cada inicialização, mesmo com arquivos wsl.conf.

Por isso criei este pequeno programa que automatiza tudo com um único shell:

https://github.com/epomatti/wsl2-dns-fix-config

Responder3

Tive que fazer isso em casa (coronavírus) e acabei escrevendo um script Powershell Admininstrator Prompt para iniciar minha distro (debian). Observe também que isso inicia a distribuição padrão especificada pelo WSL; você precisará alterar a última linha se não for o caso. Procure \\wsl$\[distro name]se o seu também não se chama Debian, basta digitar a primeira parte em um caminho do Windows Explorer para chegar ao WSL2, ou seja, na barra superior do explorer, digite \\wsl$\e ele listará suas distribuições.

Isso extrairá o servidor DNS do host Windows, criará um novo resolv.conf e o gravará em formato Unix na instância WSL2. Então você precisa editar /etc/wsl.conf para:

[network]
generateResolvConf = false

Então, um superusuário tentou mudar isso para resolv.config; se esse arquivo existir porque você está usando uma distribuição Linux diferente, suponho que seja o arquivo que você deseja. Portanto, modifique de acordo. Embora eu nunca tenha visto esse arquivo em nenhuma documentação e não tenha certeza se a edição da minha postagem estava correta.

Em seguida, inicie o prompt de administração do PowerShell e execute como ./debian.ps1 (se for esse o nome do arquivo):

# Filename: debian.ps1
# 
# Get the DNS server of the Windows machine, save into variable nameserver
$nameserver = Get-WmiObject -Namespace root\cimv2 -Query "Select dnsserversearchorder from win32_networkadapterconfiguration" | where {$_.DNSServerSEarchOrder -ne $null} | select -ExpandProperty DNSServerSearchOrder
# Convert nameserver object into a string
$nameserver = Out-String -InputObject $nameserver
# Run Set-Contents (sc) to write the resolv.conf file in a public location as it has DOS formatted line endings written by PowerShell, not readable by Linux
sc -Path 'c:\Users\Public\Documents\resolv.conf' -Value ('nameserver ' + $nameserver) -Encoding utf8
# Convert the DOS formatted file into UNIX format for WSL2 and write it in the proper place (\etc\resolv.conf, its primary location is \\wsl$\[distro_name] from Windows)
[string]::Join( "`n", (gc 'c:\Users\Public\Documents\resolv.conf')) | sc '\\wsl$\debian\etc\resolv.conf'
# Launch the default WSL2 distribution - if you want to use another one, specify in the line below
wsl.exe

Isso foi testado no Debian Buster e em uma VPN Zscaler (corporativa). É um bom ponto de partida, espero que poupe a alguém as dores de cabeça que encontrei ao obter acesso DNS na instância WSL2 do meu PC corporativo!

Responder4

Respostas muito detalhadas sobre como alterá-lo. Eu só queria usar o padrão e seguir em frente. Segui alguns guias como a primeira resposta, não funcionou para mim. Só mudei /etc/wsl.confe voltou a funcionar.

sudo nano /etc/wsl.conf

Insira ou altere neste arquivo:

[network]
generateResolvConf = true

Insira no Powershell/CMD:

wsl --shutdown

ou:

wsl --terminate <<Linux distro>>

Feito e feito. Deixe-me saber se isso funcionou para você.

Minha configuração estava bagunçada porque o Tailscale mudou quando eu comecei. Agora está funcionando novamente.

informação relacionada