スクエニ ITエンジニア ブログ

WSLのDNS設定をカスタムしたい(202203現在)

はじめに

Windows Subsystem for Linux (WSL) はWindows環境で気軽にLinux環境を実現でき、便利なものです。
Linuxのコマンドを気軽に実行できたり、Hyper-V同様にDocker Desktop for Windowsのバックエンドに指定できたりと便利な一方、WSLを使っているからこそ直面する問題もあります。

本稿では、私が直面した問題についてまとめました。

※ WSLは厳密にはWSL2とWSL1の2世代ありますが、ここではWSL2を対象にしています。

DNS設定をカスタマイズしたい

WSLのデフォルト設定では、WSL用に作成された仮想インタフェースがDNSサーバに設定されています。

以下、PowerShell上の操作は PS > から、WSL上のシェルの操作は $ から記載することとします。 また、WSL上で扱うディストリビューションはUbuntuを例にしています。

# Windows上
PS> ipconfig /all # より抜粋
イーサネット アダプター vEthernet (WSL):

   接続固有の DNS サフィックス . . . . .:
   説明. . . . . . . . . . . . . . . . .: Hyper-V Virtual Ethernet Adapter

   IPv4 アドレス . . . . . . . . . . . .: 172.18.240.1(優先)
   サブネット マスク . . . . . . . . . .: 255.255.240.0
   デフォルト ゲートウェイ . . . . . . .:
# WSL上
$ 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.18.240.1

基本的にはこのインタフェースを通してホストOSと同様の名前解決が行われるのですが、例えば以下の場合には個別に設定する必要があります。

  • WSLのみ別のDNSサーバを使いたい
  • 固有のサフィックスを付与したい場合
    • Windows上の DNS設定のすべてが継承されるわけではない ようなので、個別に設定する必要があると思われる

しかし、WSLではDNS設定である /etc/resolv.conf の生成が通常のLinux環境とは異なっているため、注意が必要です。

結論としてはこの /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:

WSLのドキュメント(ネットワーク設定) のとおり /etc/resolv.conf は自動生成されるため、WSL再起動後にも変更した設定を維持したい場合は /etc/wsl.conf を編集したうえで、/etc/resolv.conf を個別に編集する必要があります。

ただし、WSLでは /etc/resolv.conf はシンボリックリンクとなっており、generateResolvConf = false 設定後に /etc/resolv.conf を直接編集した上でWSLを再起動すると既存のファイルも削除され、/etc/resolv.conf編集の有無によらず破棄されてしまう ようです。

そこで、

  1. generateResolvConf = false 設定
  2. WSLの(操作している)ディストリビューションを再起動
  3. /etc/resolv.conf 編集

という手順を踏みます。

まず、DNS設定が自動生成されないようにします。

$ sudo tee /etc/wsl.conf <<EOF
[network]
generateResolvConf = false
EOF
$ 

次に、以下のようにディストリビューションを再起動します。

PS > wsl -t <ディストリビューション名>

(ここで、再起動前に /etc/resolv.conf を直接編集すると以下のように再起動後に反映されないどころか元の設定内容すら得られなくなります)

$ sudo tee /etc/wsl.conf <<EOF
> [network]
> generateResolvConf = false
> EOF
[network]
generateResolvConf = false
$ cat /etc/resolv.conf
nameserver xxx.xxx.xxx.xxx # 所望のDNSサーバのIPアドレス
# 再起動後
$ ls -l /etc/resolv.conf
lrwxrwxrwx 1 root root 29 Mar 17 15:51 /etc/resolv.conf -> ../run/resolvconf/resolv.conf
$ ls /run/resolvconf/resolv.conf
ls: cannot access '/run/resolvconf/resolv.conf': No such file or directory
$ nslookup www.square-enix.com # resolv.confがないため、名前解決ができない
;; connection timed out; no servers could be reached

再起動後、最後に以下のように設定を行うことで改めて名前解決が可能になります。

# 例
$ sudo tee /etc/resolv.conf <<EOF
> nameserver <所望のDNSサーバ>
> # search <必要なサフィックス>
> EOF

DNS設定を自動生成に戻す場合

/etc/wsl.confgenerateResolvConf = true とすれば再度自動生成されます。 ただし、この状態で再起動した場合は シンボリックリンクの構造はもとに戻らない ことに注意が必要です。

$ 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.18.240.1
$ ls -l  /etc/resolv.conf # 元のsymlinkではない
-rw-r--r-- 1 root root 198 Mar 17 18:07 /etc/resolv.conf
$ 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.18.240.1

シンボリックリンクを維持する場合は、WSLのFAQ(公式) でも言及されているように、あらかじめシンボリックリンクを作成した上で generateResolvConf = true とする必要があります。

$ sudo ln -s ../run/resolvconf/resolv.conf resolv.conf

この記事を書いた人

記事一覧
SQUARE ENIXでは一緒に働く仲間を募集しています!
興味をお持ちいただけたら、ぜひ採用情報ページもご覧下さい!