最近仕事でPulse SecureでVPNに接続した状態で作業することが多いのだけど、VPNに繋いだらWSL2のUbuntuがインターネットに繋がらなくなることに気がついた。
$ curl example.com
curl: (6) Could not resolve host: example.com
VPNに繋ぐとインターネットに繋がらなくなる問題はどうも自分だけじゃないようで、GitHubのissueでも沢山報告されていた。
解決方法
根本的な解決ではないかもしれないが、とりあえずこのツールが役に立った。調べるとホスト側とディストリビューション側で長いスクリプトを実行する…とか、ホスト側にツールをインストールしてトンネルする…とかあったが、これはWSL2でAlpineを立ち上げるだけで良い。
sakai135/wsl-vpnkit: Provides network connectivity to WSL 2 when blocked by VPN (github.com)
使い方はREADME.mdに書いている通りで、まずは リリースページ から wsl-vpnkit.tar.gz をダウンロードしてPowershellなどからWSL2にインポートする。
\> wsl --import wsl-vpnkit --version 2 $env:USERPROFILE\\wsl-vpnkit wsl-vpnkit.tar.gz
インポート後、インターネットに繋ぎたいディストリビューション内から起動コマンドを実行する。(この起動コマンドはWSL2を起動するたびに実行する必要がある。)
$ wsl.exe -d wsl-vpnkit --cd /app service wsl-vpnkit start
自分の場合はこれに加えてnameserverの変更が必要だった。アドレスをGoogle Public DNSなど適当なIPアドレスに変更する。
$ sudo vi /etc/resolv.conf
nameserver 8.8.8.8
resolv.confはディストリビューションを立ち上げるたび新しいものに更新されてしまうので、更新されないようWSL2の設定ファイルで自動生成をオフにする。
$ sudo vi /etc/wsl.conf
\[network\]
generateResolvConf = false
resolv.confは(おそらく)ディストリビューションを終了した時に削除され、自動生成がオフだと立ち上げ時に作成されず、存在しない状態になってしまうので、chattrで変更を禁止して消せないファイルに変更しておく。
$ sudo chattr +i /etc/resolv.conf
これでディストリビューションがインターネットに繋がるはず。