WSLパッケージの2.0.0にて追加された機能の一つにdnsTunnelingがあります。DNSもWSLの中でトラブルの多い機能の一つでしたからこの機能に救われる方は多いと思います。
dnsTunneling
公式案内に詳しく説明されていますが、これまでのDNS参照にあった課題を解決するためにWindows自身のDNS参照機能に結果を教えてもらう手法が導入されました。まだ使い込めてはいませんが良好に機能しているように思えます。
使用するには .wslconfig に以下の記述を追加します。
[experimental]
dnsTunneling=true
これまでの問題点
WSL2でのトラブルとしてネットワークに繋がらないは比較的多く報告されています。もちろん、トラブルには様々なパターンがあるのですが、比較的多いのがDNS名前参照に失敗するケースです。
case1. DNS通信がブロックされる
Windowsのファイヤーウオールや経路の混乱(IPアドレスの重複等)によりDNSサーバーとやり取りできないことがありました。dnsTunnelingを使うと、非IP通信でWindowsから情報を貰うのでこの種のトラブルは発生しづらくなります。
case2. DNSサーバーが貧弱
WSL2では仮想ネットワーク上にDNS中継サーバーが提供されます。しかし、このサーバーは簡易的なものでTCPフォールバックやEDSN0という大きなレスポ ンスを処理する仕組みがありません。この為、DNS問い合わせによって失敗するパターンがありました。dnsTunnelingを使うと、Windowsが参照した情報を貰えるのでこの種のトラブルは発生しづらくなります。
dnsTunnelingの仕組み
では、どういう仕組みでどの程度の互換性が向上するのか眺めてみた範囲で考察します。
/etc/resolv.confは標準状態と同様に自動作成されます。
ただし、DNSサーバーは127.0.0.42
を指します。DNSサーバーですからUDP及びTCPのport53でサービスが提供されているのですが、おそらく /init からハイパーバイザーを介してWindowsのDNSレゾルバを参照します。
この利点はWindowsのルールに従って名前解決を行えることです。具体的には、VPN接続するとVPNで使われるDNSサーバーへの問い合わせがWindows同様に行えます。他にもWindowsにDNSサーバーへの参照ルールが設定されている場合にはそのルールに従って適切なサーバーへ問い合わせることが可能となります。
ただし、微妙に挙動が異なるのはWindowsだと最優先のDNSサーバーにアクセスできなくても別のサーバーから情報を取得してくるのですが、この機能ではタイムアウトまで待ってエラーとなります。こうした挙動は異常時のみなので特に気にはならないはずですが、全く同じというわけでもないようです。
特にNATネットワークでの課題を解決してくれる
この機能で一番メリットがあるのは標準のNATモードで利用しているケースです。これまで提供されていたDNS中継サーバーでは何かと発生していたトラブルが解消しますので大いに期待できます。ミラーモードでもVPN接続時の追従など利便性が高いので用途に応じて使用するとよさそうです。ブリッジモードの場合は、Windowsを参照する意義はあまりないでしょうからDHCPで配布されたDNSサーバーを使うのがよさそうですね。