VPNとWSL2
最近、wsl2上で動かしているpythonからrequests.get()
を使う機会がありました。そのときに、通常時は問題なく動くものの、VPN接続時にrequests.get()
から進まなくなる問題があり、少し調べたのちにサクッと解決したので、備忘録として残しておきます。
環境としては、WSL2上でVSCodeを走らせており、その中でJupyter Notebookを動かしてrequestしています。また、VPNとしてはSurfsharkを使用しています。エラー発生時はVPNのプロトコルにWireGuardを使用していました。
現状確認
VPN未使用時ではすべてネットへの接続含め正常に動いていました。
VPN接続すると、googleへのpingやdigは通っているものの、pythonのrequestsとかを使うとそこで永遠に止まってしまう状態でした。
解決
ここに解決のヒントが載っていました。リンク先にも書いてありますが、MTUが一貫していなかったことが原因でした。
この記事で行っているようなWSL2のネットワーク回りの設定変更は、今まで痛い目にあってきたので極力したくありません。MTUとか正直よくわからないし。
幸いにも私の環境でMTUを確認していたらあっさりそれ以外の解決策が見つかったので、以下私の環境で確認した際の結果を見ていきます。
ただ、かなりSpecificな問題原因と解決策なのはご了承ください。
まず、WSL2で以下のコマンド実行。MTUは1500。
XXX$ ip addr show dev eth0 | grep mtu
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
一方、コマンドプロンプト側では以下のような出力でした。
XXX>netsh interface ipv4 show interfaces
Idx Met MTU 状態 名前
--- ---------- ---------- ------------ ---------------------------
1 75 4294967295 connected Loopback Pseudo-Interface 1
9 25 1500 disconnected OpenVPN Data Channel Offload for Surfshark
8 25 1500 connected イーサネット
33 5 1420 connected SurfsharkWireGuard
29 15 1500 connected vEthernet (WSL (Hyper-V firewall))
お分かりのように、WireGuardのほうはMTUが1420となっています。これが問題の原因でした。
どうやらOpenVPNのほうはMTUが幸いWSL2側と同じ1500だったので、Surfshark側の設定から使用プロトコルをOpenVPNに切り替えたところ、以下のような出力に変化。
XXX>netsh interface ipv4 show interfaces
Idx Met MTU 状態 名前
--- ---------- ---------- ------------ ---------------------------
1 75 4294967295 connected Loopback Pseudo-Interface 1
9 3 1500 connected OpenVPN Data Channel Offload for Surfshark
8 25 1500 connected イーサネット
29 15 1500 connected vEthernet (WSL (Hyper-V firewall))
MTUもうまく設定できたようで、pythonコードのほうも万事うまくいくようになりました。
結論
WSL2、便利なように見えていつもネット接続関連で一旦躓く印象があります。大体の問題は調べると解決できはするんですがね・・・
特に/etc/resolv.conf
周りはあんまりいじりたくないので、サクッと解決してよかったです。
コメント