問題・エラー
Cisco AnyConnectでVPN接続して、Windowsでwsl2からsshで外部サーバーにアクセスすると
Temporary failure in name resolutionなどと、名前解決エラーが出てアクセスできない問題
解決策 (ここではwsl2はUbuntuを例とする)
VPN接続した状態で操作1と2をPower shellで(管理者として)実行する
[操作1] Cisco Anyconectの優先度を6000に変更
→値を十分に大きく(6000)にすることで、接続の優先度を落とす
Get-NetAdapter | Where-Object {$_.InterfaceDescription -Match "Cisco AnyConnect"} | Set-NetIPInterface -InterfaceMetric 6000
[操作2] resov.confに、DNSアドレスを書き込む
Get-DnsClientServerAddress -AddressFamily ipv4 | Select-Object -ExpandProperty ServerAddresses | % { "nameserver " + $_ } | wsl -d Ubuntu --user root -- tee /etc/resolv.conf
※Ubuntu 22.04.3 LTSの場合は[操作2]を、以下に変えて実行する
(つまり、wsl -d と --userの間を、使用するwsl2のものに適宜変更すればよい。)
Get-DnsClientServerAddress -AddressFamily ipv4 | Select-Object -ExpandProperty ServerAddresses | % { "nameserver " + $_ } | wsl -d Ubuntu-22.04 --user root -- tee /etc/resolv.conf
問題の原因 (詳細は、参考文献[3]を参照)
外部サーバーにアクセスする際、wsl2がホストに接続先外部サーバーのIPアドレスの問い合わせを行うが、
Cisco AnyConnectが、ホスト→wsl2方向の経路を断ってしまうため、
問い合わせの返信がwsl2に届かず、wsl2側が名前解決(Name resolution)できなくなり、
その結果、名前解決エラー(Temporary failure in name resolution)が発生しているらしい。
本解決策の位置づけ&他のアプローチ
主なアプローチは2つ。
1. 手軽なアプローチ(ただし、接続先を複数切り替えたい場合は破綻する、暫定的対応)
wsl2側がIPアドレスをあらかじめ参照できるようにresolv.confに格納し (→本手法[操作2])、
かつ、
VPN側に接続が行かないように、Cisco AnyConnect側のインターフェースメトリックス値を6000にすることで、接続優先度を下げる (→本手法[操作1])
なお、本記事で紹介している方法は、参考文献[1]の方法とほぼ同じであるが、
より動きやすいように修正及び補足説明を加えたものである。
2.少し複雑なアプローチ(接続先を複数切り替えたい場合でも対応できる、恒久的対応)
wsl-vpnkitを導入することで、wsl2側がホストとやり取りできる道を構築する
→基本的には参考文献[2]のサイト参照
ただし、ゲストOS側の2の2行目のコマンド:
sudo cp ./wsl-vpnkit.service /etc/systemd/system/
の部分は、
sudo cp /etc/systemd/system/wsl-vpnkit.service .
に変更する必要がある(でないと私の環境では動かなかった。)
本記事では1のアプローチを詳細に取り上げたが、
接続先サーバーが複数ある場合などは、複雑ではあるものの、
基本的には2(wsl-vpnkitを用いる方法)のアプローチをとることを推奨する。
参考文献(2024年4月13日時点、すべて閲覧可能)
[1. 本手法の元] https://zenn.dev/dozo/articles/21630720e6476b
[2. 少し複雑な別のアプローチ] https://zenn.dev/xeres/articles/2023-10-05-install-wsl-vpnkit
[3. 問題の原因の詳細説明など] https://aquasoftware.net/blog/?p=1472