![Como altero as configurações de DNS para WSL2?](https://rvso.com/image/1618338/Como%20altero%20as%20configura%C3%A7%C3%B5es%20de%20DNS%20para%20WSL2%3F.png)
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.conf
estiver vinculado a outro arquivo, remova o link com
rm resolv.conf
Crie um novo resolv.conf
com 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/hosts
arquivo 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.conf
não existe.
A ferramenta resolvectl
não está no meu caminho; não existe em /usr/bin/resolvectl
.
Da mesma forma systemd-resolve
nã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.conf
imutá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:
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.conf
e 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.