WSL2でDNS解決がうまくいかない問題と解決方法

こんにちは!
Windows Subsystem for Linux (WSL2)は、Windows上でLinux環境を利用できる素晴らしい機能ですが、中にはDNS解決に関する問題が発生することがあります。この記事では、その症状と効果的な解決方法を紹介します。
検証環境
この記事で紹介する方法は、以下のバージョンで検証しています
WSL バージョン: 2.4.13.0
カーネル バージョン: 5.15.167.4-1
WSLg バージョン: 1.0.65
MSRDC バージョン: 1.2.5716
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26100.1-240331-1435.ge-release
Windows バージョン: 10.0.22631.3880
症状
以下のようなエラーメッセージが表示される場合、WSL2でのDNS解決に問題が発生している可能性が高いです:
- コマンドラインから接続時:
Could not resolve hostname ...
- Pythonコードから接続時:
[Errno -2] Name or service not known
これらのエラーは、WSL2内でDNSサーバーの設定が正しく行われていないことを示しています。
原因
WSL2は起動時に自動的に /etc/resolv.conf
ファイルを生成し、Windows側のDNS設定を使用しようとします。しかし、この自動生成されるDNS設定が正しく機能しないケースがあります。上記のバージョン情報にあるように、2025年3月時点の最新WSL2(バージョン2.4.13.0)でもこの問題は完全には解決されていません。
解決方法
以下の3ステップで問題を解決できます
STEP1: WSL2が自動生成するDNS設定を無効化
WSL bashで以下のワンライナーを実行して、resolv.conf
が自動生成されるのを防ぎます。
注意:既存のwsl.conf があるばあいはvim等で編集してください。
sudo sh -c 'cat > /etc/wsl.conf << EOF
[network]
generateResolvConf = false
EOF'
このコマンドは、WSL2の設定ファイル /etc/wsl.conf
を作成し、DNS設定の自動生成を無効にします。
STEP2: Windows側でWSLを再起動
Windows PowerShellまたはコマンドプロンプトで以下のコマンドを実行し、WSLを完全に再起動します
wsl --shutdown
STEP3: DNSサーバーを手動で設定
WSLを再度起動し、シェルで以下のコマンドを実行して、GoogleのパブリックDNSサーバーを手動で設定します
sudo sh -c 'cat > /etc/resolv.conf << EOF
nameserver 8.8.8.8
EOF'
これにより、GoogleのDNSサーバー(8.8.8.8と8.8.4.4)を使用するように設定されます。
確認方法
設定が正しく適用されたかを確認するには、以下のコマンドを実行してみてください
ping google.com
または、以下のPythonコードでの接続テスト
import socket
socket.gethostbyname('google.com')
WSLのカーネルバージョンを確認するには、以下のコマンドが使用できます
# カーネルバージョンの簡易表示
uname -r
# カーネルバージョンの詳細表示
cat /proc/version
# システム情報全体の確認(systemdが利用可能な場合)
hostnamectl
また、WindowsコマンドプロンプトまたはPowerShellからWSLのバージョン情報を確認するには
wsl --version
これらが正常に動作すれば、DNS解決の問題は解決されています。
注意点
- この設定はWSLを再起動するたびにリセットされる可能性があります。その場合は、STEP3を再度実行する必要があります。
- WSLのバージョンによっては動作が異なる場合があります。最新の情報については、Microsoftの公式ドキュメントを参照することをお勧めします。
まとめ
WSL2でのDNS解決問題は、自動生成されるDNS設定を無効化し、手動でDNSサーバーを設定することで解決できます。この方法は、最新のWSL2バージョンでも有効です。