UTokyo VPNは東京大学が提供する公式VPNです。これを用いることで、家にいながら東大内であるかのようにネットワークにアクセスできます。Cisco AnyConnectというソフトウェアを用いてUTokyo Accountを用いて認証を行います。

UTokyo VPNは大変便利ですが、windows上でUTokyo VPNに接続すると、WSL2中でgithubコマンド(git pullなど)が使えなくなり、またclaude codeなども使えなくなるという大問題があります。本ブログではこの原因と解決策を説明します。

原因

AnyConnectはVPN接続時にWindowsのルーティングテーブルを書き換え、すべての通信をVPNトンネル経由にします。しかしWSL2はHyper-Vの仮想スイッチを通じて Windows のネットワークスタックに接続しており、AnyConnectはこの仮想スイッチからのトラフィックをトンネルに乗せません(あるいはブロックします)。

これを解決するために、wsl-vpnkitを用いてWSL2からのルーティングを修正します。

初回インストール(一度だけ)

WSL2のターミナルで以下を順に実行します。

# 1. wsl-vpnkit をダウンロード
curl -L -o /tmp/wsl-vpnkit.tar.gz \
  "https://github.com/sakai135/wsl-vpnkit/releases/latest/download/wsl-vpnkit.tar.gz"

# 2. Windows の一時フォルダにコピー
WINTEMP=$(powershell.exe -Command '$env:TEMP' | tr -d '\r')
cp /tmp/wsl-vpnkit.tar.gz "$(wslpath "$WINTEMP")/wsl-vpnkit.tar.gz"

# 3. WSL2 ディストロとして登録
WINHOME=$(powershell.exe -Command '$env:USERPROFILE' | tr -d '\r')
wsl.exe --import wsl-vpnkit "${WINHOME}\wsl-vpnkit" "${WINTEMP}\wsl-vpnkit.tar.gz" --version 2

# 4. 登録確認(一覧に wsl-vpnkit が出ればOK)
wsl.exe --list

コマンド準備(一度だけ)

wsl-vpnkitを実行するコマンドをまとめてstartvpnというエイリアを作っておきます。これを~/.bashrcに追加します。これは一度だけ行います。

echo "alias startvpn='wsl.exe -d wsl-vpnkit --cd / -- /app/wsl-vpnkit > /dev/null 2>&1 &'" >> ~/.bashrc
source ~/.bashrc

通常起動(VPN接続するたびに実行する手順)

  1. Windows上で、AnyConnectでUTokyo VPNに接続します。
  2. WSL2のターミナルでstartvpnコマンドを1回だけ 実行します。
startvpn

# 接続確認(200 が返れば成功)
sleep 3 && curl -s -o /dev/null -w "%{http_code}\n" https://github.com

以降はそのまま git pushclaude コマンドが使えます。

ポイント:

  • wsl-vpnkitはWSL2全体に作用する、他のターミナルを新しく開いても再実行不要です。
  • WSL2が完全終了(PC再起動やwsl --shutdown)するまで有効です。

削除方法

もし上記の全てをやめて削除したいときは以下のようにします。

# WSL2 ディストロを削除(これだけで完全に消える)
wsl.exe --unregister wsl-vpnkit

# インストール先フォルダも消す場合は Windows エクスプローラーで削除
# 場所: C:\Users\<ユーザー名>\wsl-vpnkit\