前提:構成
- Windows10
- WSL2 カーネルバージョン 5.10.102.1
- Ubuntu 20.04.4 LTS
- docker-ce 20.10.14 ※docker desktopは未使用
事象
WSL上で稀に一部URLへアクセスできない場合が発生する
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg
curl: (35) OpenSSL SSL_connect: 接続が相手からリセットされました in connection to download.docker.com:443
原因
自分のとこのVPNに接続した場合に MTU の値が
小さくなっていたが、WSL側にそれが伝搬されていないのが原因っぽい
c:\>netsh.exe interface ipv4 show subinterfaces
MTU MediaSenseState 受信バイト 送信バイト インターフェイス
------ --------------- ----------- ---------- -----------------
1200 1 190906226 24442368 VPN
1500 1 1559306163 204611796 Wi-Fi
1500 1 7174232 304467918 vEthernet (WSL)
対応
WSLのターミナル起動時に、MTU値を取得して動的にWSL側のI/Fに設定するようにした
/etc/profile.d/network-env.sh
#!/usr/bin/env bash
CMDNETSH="/mnt/c/WINDOWS/system32/netsh.exe"
MTU=$($CMDNETSH interface ipv4 show subinterfaces | grep VPN | head -1 | awk '{print $1}')
if [ "$MTU" == "" ]; then # VPN接続していない場合
MTU=$($CMDNETSH interface ipv4 show subinterfaces | grep "vEthernet (WSL)" | head -1 | awk '{print $1}')
fi
export MTU # ※後述
if [ "${MTU}" != "" ]; then # eth0のMTU値を変更する
sudo ip link set eth0 mtu $MTU
fi
追加対応
この設定をdockerのコンテナにも適用するため、docker-compose.ymlに下記を追加
この設定の為、先のshell(network-env.sh)内で export MTU
してる
networks:
default:
driver_opts:
com.docker.network.driver.mtu: ${MTU}
参考にしたサイト
https://ydkk.hateblo.jp/entry/2020/12/06/150914
https://github.com/microsoft/WSL/issues/4517#issuecomment-628701283