landrunner’s blog

しばらく開発から離れてた人間が、技術的キャッチアップを図るための勉強ブログ

VPN中にWSL2がネットワークに繋がらない問題に、Docker上でプロキシを作って対処する

VPNにつないだ時、VPNWindowsのルーティングテーブルをいじってWSL2がネットワークに繋がらなくなります。

なので解決方法としては、こちらもうまいことルーティングテーブルをいじってやる、というのが正攻法です。
こちらのブログで紹介されているやり方はまさにそんな方法です。
VPN に繋ぐと WSL2 や Hyper-V VM でネットワークに繋がらなくなる問題を解消する | Aqua Ware つぶやきブログ

この方法で解決できるならば、こちらを使うのがスマートだと思います。

自分の問題点

前述の方法はRoute Metricを60000に設定するのですが、私の環境だとVPNソフトウェアの仕様なのか、管理者の設定なのか、 VPNのRoute Metricを2以上に設定しようとすると強制的に1に戻されます。
なのでこの方法が使えませんでした。

ちなみに自分のVPNクライアントはCisco AnyConnect。ネット上でみる限り問題になっているのはほとんどこいつみたいです。
他のVPNクライアントはもう少しお行儀がいいのかもしれません。

Docker Desktop for Windows上にプロキシを作成

Docker Desktop for WindowsにはVPNパススルー機能といって、VPN中でも問題なくネットワークに接続できます。 そしてDocker Desktop for Windowsは設定一つでWSL2からもアクセスできるにようなります。
じゃあDocker Desktop for Windows上にSquidでプロキシを立てれば動くのでは?
ということで作ってみました。それがこちら。
GitHub - landrunner/vpn-wsl2-proxy

想定構成としてはこんな感じで、SquidVPNと社内のプロキシ経由でインターネットにアクセスします。

今回作ったのはこのsquidのコンテナになります。

使い方

Windows 10でWSL2はインストール済みという前提で記述します。

  • まずDocker Desktop for Windowsをインストールします。

https://hub.docker.com/editions/community/docker-ce-desktop-windows

※このブログを書いた当時、Docker Desktopはまだ法人でもフリーでも使えたのですが、2023/6/8現在一部を除き有料プランへの加入が必要になっています。 企業所属の方は必ず有料プランへご加入をお願いします。

  • 今回作ったコンテナのbuildファイルをgitで持ってきます
git clone https://github.com/landrunner/vpn-wsl2-proxy
  • docker-compose.yamlを開いてプロキシ設定を編集します。ここに設定するのが社内プロキシのホスト名とポートです。
    environment: 
      - PROXY_HOST=your_company_proxy_host
      - PROXY_PORT=8080
  • 起動します
docker-compose up -d
export http_proxy=http://localhost:3128/
export https_proxy=http://localhost:3128/
  • 動作確認します
curl https://www.google.com/

これで動けば設定は完了です。