paloma blog

NWエンジニアやってます。主に自宅環境のお遊びを書きます。Pythonもちょっと。タイトルは好きなカクテルから。

wsl2が名前解決できなくなったので対処

前回wsl2上のdockerにプロキシサーバーを立てたのですが、昨日Windows Updateをしたらプロキシが動かなくなってしまいました。

調査

ホスト

念のためホストの状況を確認してみます。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ curl -X GET -I -x localhost:8118 https://www.google.co.jp
HTTP/1.1 404 No such domain
Content-Length: 6589
Content-Type: text/html
Cache-Control: no-cache
Date: Fri, 14 Jan 2022 07:00:44 GMT
Last-Modified: Wed, 08 Jun 1955 12:00:00 GMT
Expires: Sat, 17 Jun 2000 12:00:00 GMT
Pragma: no-cache
Connection: close

404になってますね。

コンテナのログ

抜粋版です。

2022-01-14 06:58:46.630 7fdb3902c180 Info: Privoxy version 3.0.28,
2022-01-14 06:58:46.630 7fdb3902c180 Info: Program name: /usr/sbin/privoxy,
2022-01-14 06:58:46.631 7fdb3902c180 Info: Loading filter file: /etc/privoxy/default.filter,
2022-01-14 06:58:46.632 7fdb3902c180 Info: Loading filter file: /etc/privoxy/user.filter,
2022-01-14 06:58:46.632 7fdb3902c180 Info: Loading actions file: /etc/privoxy/match-all.action,
2022-01-14 06:58:46.632 7fdb3902c180 Info: Loading actions file: /etc/privoxy/default.action,
2022-01-14 06:58:46.634 7fdb3902c180 Info: Loading actions file: /etc/privoxy/easylistgermany.script.action,
2022-01-14 06:58:46.637 7fdb3902c180 Error: Missing content filter 'easylistgermany',
2022-01-14 06:58:46.637 7fdb3902c180 Error: Invalid action section in file '/etc/privoxy/easylistgermany.script.action', starting at line 1300: { +filter{easylistgermany} },
2022-01-14 06:58:46.637 7fdb3902c180 Info: Loading actions file: /etc/privoxy/user.action,
2022-01-14 06:58:46.637 7fdb3902c180 Info: Listening on port 8118 on IP address 0.0.0.0,
2022-01-14 06:58:54.000 7fdb3902a700 Request: www.google.co.jp:443/,
2022-01-14 06:59:00.266 7fdb3902a700 Info: Can not resolve www.google.co.jp: Temporary failure in name resolution,
2022-01-14 06:59:00.267 7fdb3902a700 Crunch: DNS failure: www.google.co.jp:443,
172.17.0.1 - - [14/Jan/2022:06:59:00 +0000] "CONNECT www.google.co.jp:443 HTTP/1.1" 404 6589,
2022-01-14 06:59:14.543 7fdb3902a700 Request: www.google.co.jp:443/,
2022-01-14 06:59:20.746 7fdb3902a700 Info: Can not resolve www.google.co.jp: Temporary failure in name resolution,
2022-01-14 06:59:20.747 7fdb3902a700 Crunch: DNS failure: www.google.co.jp:443,
172.17.0.1 - - [14/Jan/2022:06:59:20 +0000] "CONNECT www.google.co.jp:443 HTTP/1.1" 404 6589,
2022-01-14 07:00:37.824 7fdb3902a700 Request: www.google.co.jp:443/,
2022-01-14 07:00:44.026 7fdb3902a700 Info: Can not resolve www.google.co.jp: Temporary failure in name resolution,
2022-01-14 07:00:44.027 7fdb3902a700 Crunch: DNS failure: www.google.co.jp:443,
172.17.0.1 - - [14/Jan/2022:07:00:44 +0000] "CONNECT www.google.co.jp:443 HTTP/1.1" 404 6589

curlのヘッダでもわかりますが、privoxyのログを見るとDNSが失敗しているようです。

名前引き

でもdig引けるし、何なんだ…

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig www.google.co.jp

; <<>> DiG 9.16.1-Ubuntu <<>> www.google.co.jp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42409
;; flags: qr rd ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       0       IN      A       172.217.161.67

;; Query time: 20 msec
;; SERVER: 172.17.192.1#53(172.17.192.1)
;; WHEN: Fri Jan 14 16:09:15 JST 2022
;; MSG SIZE  rcvd: 66

Windows Updateが問題か?と調べてみるとwslのresolverが悪さする事例があるようです。

WSL2 DNS stops working · Issue #4285 · microsoft/WSL · GitHubgithub.com

確かにtcpの方だと失敗していますね。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig www.google.co.jp +tcp
;; Connection to 172.17.192.1#53(172.17.192.1) for www.google.co.jp failed: timed out.
;; Connection to 172.17.192.1#53(172.17.192.1) for www.google.co.jp failed: timed out.

; <<>> DiG 9.16.1-Ubuntu <<>> www.google.co.jp +tcp
;; global options: +cmd
;; connection timed out; no servers could be reached

;; Connection to 172.17.192.1#53(172.17.192.1) for www.google.co.jp failed: timed out.

ほかのDNSサーバだとOKです。
原因はwslのresolverで確定ですね。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig www.google.co.jp +tcp @1.1.1.1

; <<>> DiG 9.16.1-Ubuntu <<>> www.google.co.jp +tcp @1.1.1.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11504
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       234     IN      A       142.250.207.35

;; Query time: 20 msec
;; SERVER: 1.1.1.1#53(1.1.1.1)
;; WHEN: Fri Jan 14 16:21:09 JST 2022
;; MSG SIZE  rcvd: 61

修正

wslのresolv.confを書き換えれば解決するようですが、これはシステムで自動で作られるファイルの様です。
なのでissueの手順に沿って書き換えます。

wsl.confを作成

これでresolv.confがシステムから上書きされなくなります。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ cat /etc/wsl.conf
[network]
generateResolvConf = false

ホスト停止、再起動

いったん再起動しないといけない様です。

PS C:\Users\masashi> wsl --list --running
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu (既定)
PS C:\Users\masashi> wsl --shutdown

手順は割愛しますが再起動完了。

resolv.conf修正

wslではresolv.confはシンボリックリンクが張られているので外して上書きします。
私はプロバイダのDNSサーバを書いてます。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 Oct  2 13:39 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo unlink /etc/resolv.conf
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo ls -l /etc/resolv.conf
ls: cannot access '/etc/resolv.conf': No such file or directory
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$
masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo vim /etc/resolv.conf

名前引き(tcp)

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ dig -q www.google.co.jp +tcp

; <<>> DiG 9.16.1-Ubuntu <<>> -q www.google.co.jp +tcp
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20808
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;www.google.co.jp.              IN      A

;; ANSWER SECTION:
www.google.co.jp.       22      IN      A       142.250.196.131

;; Query time: 10 msec
;; SERVER: (略)
;; WHEN: Fri Jan 14 16:30:52 JST 2022
;; MSG SIZE  rcvd: 61

OK。
引けるようになりましたので多分大丈夫でしょう。

コンテナ起動

コンテナ起動します。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ sudo docker run -d -p 8118:8118 privoxy
dccc24b68092c11a48e268cbc7cf16af690afc7122355435ad151f7d1d724c20

再度プロキシの疎通。

masashi@DESKTOP-HBP3520:/mnt/c/Users/masashi$ curl -X GET -I -x localhost:8118 https://www.google.co.jp
HTTP/1.1 200 Connection established

HTTP/2 200
()

OKですね。
これで直りました。

ブラウザからもOKになりました。

まとめ

作った矢先に疎通できなくなったのでwslやコンテナの起動方法、Windows Updateなど被疑箇所がたくさんありましたが、ログから調査したら割と早く解決できました。

issueはudpも通らないケースもありましたが、私はtcpのみNGだったのでresolv.confに辿り着くまで少しかかりました。

最近は便利な機能がたくさんありますが、レイヤが増える分切り分け方法を確立しておかないといけませんね。
見つけてくれる先人たちに感謝です。(自分もそうなりたい)

参考サイト

WSL2 で dns の名前解決ができなくなって ネット接続できなくなった場合の対処方法 - Qiita

WSL2 で名前解決出来ない問題 | 変なヤバいもんログ