hack のためのネタ帳, etc,,,

状況

昨日重い腰を上げて、Windows 10 で VirtualBox を使ってる環境の WSL1 を WSL2 に update してみたところ、
なぜか名前の解決が出来なくなってしまった。
今まで、別の PC で WSL2 使ってる分には、特に問題は生じてなかったのに、なぜ?

例えば apt update とかだと
'example.com' が一時的に解決できません
みたいな感じで DNS による名前解決にしっぱりする。

Windows 本体側は
> ipconfig /all
...
イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   説明. . . . . . . . . . . . . . . . .: Hyper-V Virtual Ethernet Adapter
   物理アドレス. . . . . . . . . . . . .: 00-15-5D-C3-6F-E1
   DHCP 有効 . . . . . . . . . . . . . .: いいえ
   自動構成有効. . . . . . . . . . . . .: はい
   リンクローカル IPv6 アドレス. . . . .: fe80::6f59:f1ae:d1a:db09%45(優先)
   IPv4 アドレス . . . . . . . . . . . .: 172.20.224.1(優先)
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .:
   DHCPv6 IAID . . . . . . . . . . . . .: 754980189
   DHCPv6 クライアント DUID. . . . . . .: 00-01-00-01-25-E2-F5-4D-D8-CB-8A-9B-A9-76
   DNS サーバー. . . . . . . . . . . . .: fec0:0:0:ffff::1%1
                                          fec0:0:0:ffff::2%1
                                          fec0:0:0:ffff::3%1
   NetBIOS over TCP/IP . . . . . . . . .: 有効
> nslookup google.com 172.20.224.1
サーバー:  mypc.mshome.net
Address:  172.20.224.1

権限のない回答:
名前:    google.com
Addresses:  2404:6800:400a:813::200e
          216.239.32.10
          2001:4860:4802:32::a
          216.239.34.10
          2001:4860:4802:34::a
          216.239.36.10
          2001:4860:4802:36::a
          216.239.38.10
          2001:4860:4802:38::a
          142.250.206.206
          216.239.32.10
          2001:4860:4802:32::a
          216.239.34.10
          2001:4860:4802:34::a
          216.239.36.10
          2001:4860:4802:36::a
          216.239.38.10
          2001:4860:4802:38::a
みたいに名前解決できるんだけど、
WSL2 側は
$ ip r
default via 172.20.224.1 dev eth0 proto kernel
172.20.224.0/20 dev eth0 proto kernel scope link src 172.20.235.221
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.20.224.1
$ nslookup google.com
;; connection timed out; no servers could be reached
$ dig google.com

; <<>> DiG 9.16.1-Ubuntu <<>> google.com
;; global options: +cmd
;; connection timed out; no servers could be reached
みたいな感じで、Windows 本体から vEthernet (WSL) へは疎通するのに、WSL2 からだとなぜか疎通しなくて resolver 引けない状態。

更に上流の 192.168.1.1 とかへはちゃんと ping が通るし、
/ets/resolv.conf の nameserver を上流の DNS サーバーに変更すれば、問題は解決する。
172.20.224.1 に ping が通らないのは、他の正常な環境も同様と言った感じ。

Windows Firewall を切っても解消しないので、Windows Firewall のせいではない模様。

%USERPROFILE%/.wslconfig に
[wsl2]
dnsTunneling=true
追加しておけばよいという記述をちらほら見かけるが、
wsl: DNS トンネリングはサポートされていません
って言われるので、どうも Windows 11 限定で Windows 10 では使えん機能っぽい。

その他 WSL から distro unregister して再 install してみたりとか、八方手を尽くしてみたつもりだが、埒が明かずといった感じ。

以下、環境の詳細。
> wsl --version
WSL バージョン: 2.2.4.0
カーネル バージョン: 5.15.153.1-2
WSLg バージョン: 1.0.61
MSRDC バージョン: 1.2.5326
Direct3D バージョン: 1.611.1-81528511
DXCore バージョン: 10.0.26091.1-240325-1447.ge-release
Windows バージョン: 10.0.19045.4780

解法

上流の有効な DNS サーバーで /etc/resolv.conf を上書きする方法は有効だったので、これで泥臭く対応することでお茶を濁した。

設定としては以下の2ファイル。

/usr/local/bin/updateresolv.sh

#!/usr/bin/env bash
# updateresolv.sh - Workaround for WSL2 DNS problem
# Copyright (c) 2024 Koichi OKADA. All right reserved.
# This script is distributed under the MIT license.
#
# This script resolves the problem
# that default gw does not response to request from WSL2 for fort 53.
# It rewrite namesevers in resolv.conf
# with the name servers referenced by nslookup.exe.
#

PWD0="$PWD"

readarray -t nss < <(
  /mnt/c/WINDOWS/system32/nslookup.exe google.com 2>/dev/null \
  | grep Address: \
  | tr -d $'\r' \
  | sed -E 's/\s+/\n/g' \
  | tail -n+2
)

sudo sed -i,$(date -r /etc/resolv.conf +%Y%m%d_%H%M%S) -E '/^nameserver/d' /etc/resolv.conf
for ns in "${nss[@]}"; do
  echo "nameserver $ns"
done | tee -a /etc/resolv.conf

/etc/wsl.conf

[boot]
command=updateresolv.sh

参考

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます