Skip to content

WindowsがVPNに繋がっているとWSL2がネットに繋がらない問題の解決

Posted on:2023年3月10日

最近仕事でPulse SecureでVPNに接続した状態で作業することが多いのだけど、VPNに繋いだらWSL2のUbuntuがインターネットに繋がらなくなることに気がついた。

$ curl example.com  
curl: (6) Could not resolve host: example.com  

VPNに繋ぐとインターネットに繋がらなくなる問題はどうも自分だけじゃないようで、GitHubのissueでも沢山報告されていた。

WSL2 , problem with network connection when VPN used (PulseSecure) · Issue #5068 · microsoft/WSL (github.com)

解決方法

根本的な解決ではないかもしれないが、とりあえずこのツールが役に立った。調べるとホスト側とディストリビューション側で長いスクリプトを実行する…とか、ホスト側にツールをインストールしてトンネルする…とかあったが、これは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  

これでディストリビューションがインターネットに繋がるはず。