WSL2의 DNS 설정을 어떻게 변경합니까?

WSL2의 DNS 설정을 어떻게 변경합니까?

제가 알아낸 한, Windows 10의 WSL2에서 사용되는 DNS 서버를 변경하는 공식 프로세스는 다음과 같습니다. (WSL2는 Windows 10의 경량 VM에서 실제 Linux 커널을 실행하는 Linux용 Windows 하위 시스템의 새로운 릴리스입니다.)

그러나 이 프로세스는 나에게 적합하지 않습니다. 결국 시간 초과가 발생하고 어떤 주소도 확인할 수 없는 시스템이 됩니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?

지금까지 제가 정리한 과정은 다음과 같습니다.

1. 생성을 끄십시오/etc/resolv.conf

Linux 프롬프트를 사용하여(저는 Ubuntu를 사용하고 있습니다) 다음 내용으로 /etc/wsl.conf를 수정(또는 생성)합니다.

[network]
generateResolvConf = false

(분명히 현재 릴리스에는 이 줄의 후행 공백으로 인해 문제가 발생하는 버그가 있습니다.)

2. WSL2 가상 머신을 다시 시작합니다.

모든 Linux 프롬프트를 종료하고 다음 Powershell 명령을 실행합니다.

wsl --shutdown

3. 사용자 정의 만들기/etc/resolv.conf

새 Linux 프롬프트를 열고 CD를 사용하여/etc

다른 파일에 소프트 링크된 경우 resolv.conf다음을 사용하여 링크를 제거하십시오.

rm resolv.conf

resolv.conf다음 내용으로 새 항목을 만듭니다 .

nameserver 1.1.1.1

4. WSL2 가상 머신을 다시 시작합니다.

2단계와 동일

5. 새 Linux 프롬프트를 시작합니다.

이익!

2020년 3월 18일 업데이트

/etc/hosts파일에는 다음이 포함되어 있습니다.

# 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

파일이 /etc/switch.conf존재하지 않습니다.

도구가 resolvectl내 경로에 없습니다. 에는 존재하지 않습니다 /usr/bin/resolvectl.

마찬가지로 systemd-resolve내 길에 있지 않습니다. 에는 존재하지 않습니다 /usr/bin/systemd-resolve.

답변1

위에 문서화된 프로세스는 정확합니다.~이다WSL2에서 DNS 설정을 변경하는 방법.

내 실수는 테스트 목적으로 잘 알려진 CloudFlare(1.1.1.1) 및 Google(8.8.8.8 및 8.8.4.4)용 공용 DNS 서버를 사용한 것입니다. 내 로컬 네트워크가 공용 DNS 사용을 차단하는 것으로 나타났습니다.

올바른 내부 DNS 서버 IP 주소로 위 프로세스를 테스트했을 때 모든 것이 제대로 작동했습니다.

답변2

여기에 다른 답변을 추가하면또한불변 으로 설정하고 싶습니다 resolv.conf.

sudo chattr +i /etc/resolv.conf

제 경우에는 부팅할 때마다 삭제되었습니다 wsl.conf.

그러한 이유로 나는 하나의 셸로 모든 것을 자동화하는 다음과 같은 작은 프로그램을 만들었습니다.

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

답변3

나는 집(코로나바이러스)에서 이 작업을 수행해야 했고 결국 내 배포판(debian)을 시작하기 위해 Powershell 관리자 프롬프트 스크립트를 작성하게 되었습니다. 또한 이렇게 하면 WSL에서 지정한 기본 배포판이 시작됩니다. 그렇지 않은 경우 마지막 줄을 변경해야 합니다. \\wsl$\[distro name]귀하의 이름이 Debian이 아닌 경우 WSL2에 도달하기 위한 Windows 탐색기 경로의 첫 번째 부분을 입력하십시오. 즉, 탐색기 상단 표시줄에 Enter를 입력하면 배포판이 나열 \\wsl$\됩니다.

그러면 Windows 호스트에서 DNS 서버를 가져와서 새 resolv.conf를 생성하고 이를 Unix 형식으로 WSL2 인스턴스에 씁니다. 따라서 /etc/wsl.conf를 편집하여 다음을 수행해야 합니다.

[network]
generateResolvConf = false

그래서 슈퍼유저가 이를 resolv.config로 변경하려고 했습니다. 다른 Linux 배포판을 사용하고 있기 때문에 해당 파일이 존재한다면 그 파일이 대신 원하는 파일이라고 가정합니다. 따라서 그에 따라 수정하십시오. 어떤 문서에서도 해당 파일을 본 적이 없으며 내 게시물의 편집이 올바른지 확신할 수 없습니다.

그런 다음 PowerShell 관리 프롬프트를 시작하고 ./debian.ps1처럼 실행합니다(파일 이름을 지정한 경우).

# 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

이는 Debian Buster 및 Zscaler(기업) VPN에서 테스트되었습니다. 이것은 좋은 출발점입니다. 회사 PC의 WSL2 인스턴스에서 DNS 액세스를 얻는 데 직면했던 골치 아픈 일을 누군가가 덜어주기를 바랍니다!

답변4

변경에 대한 매우 자세한 답변입니다. 나는 단지 기본값을 사용하고 계속 진행하고 싶었습니다. 첫 번째 답변과 같은 몇 가지 가이드를 따랐지만 나에게 적합하지 않았습니다. 방금 변경했는데 /etc/wsl.conf다시 작동합니다.

sudo nano /etc/wsl.conf

이 파일에 삽입하거나 변경하십시오.

[network]
generateResolvConf = true

Powershell/CMD에 삽입:

wsl --shutdown

또는:

wsl --terminate <<Linux distro>>

완료되었습니다. 이것이 당신에게 도움이 되었는지 알려주세요.

Tailscale을 시작할 때 설정이 변경되었기 때문에 설정이 엉망이 되었습니다. 이제 다시 작동합니다.

관련 정보