WSL2 の DNS 設定を変更するにはどうすればよいですか?

WSL2 の DNS 設定を変更するにはどうすればよいですか?

私が調べた限りでは、Windows 10 上の WSL2 が使用する DNS サーバーを変更するための公式のプロセスは、以下のとおりです。(WSL2 は、Windows 10 上の軽量 VM で実際の Linux カーネルを実行する Windows Subsystem for Linux の新しいリリースです。)

しかし、このプロセスは私の環境では機能しません。結局、システムがタイムアウトしてしまい、アドレスをまったく解決できなくなります。

何が間違っているのでしょうか?

これまでにまとめたプロセスは次のとおりです。

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

そのため、私は 1 つのシェルですべてを自動化するこの小さなプログラムを作成しました。

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

答え3

私はこれを自宅から行う必要があり (コロナウイルス)、最終的には自分のディストリビューション (Debian) を起動するための Powershell 管理者プロンプト スクリプトを記述することになりました。また、これは WSL によって指定されたデフォルトのディストリビューションを起動することに注意してください。そうでない場合は、最後の行を変更する必要があります。\\wsl$\[distro name]お使いのディストリビューションが Debian でない場合は、Windows エクスプローラーのパスの最初の部分を入力するだけで WSL2 に到達できます。つまり、エクスプローラーの上部バーに 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 を起動したときに設定が変更されたため、設定がおかしくなりました。今は再び動作するようになりました。

関連情報