修复WSL2+VPN场景下, docker内访问https网站异常的问题

问题现象:

Windows 11 + WSL2 + Ubuntu分发, 主机上启动VPN. WSL2内使用docker运行容器. curl http站点没问题, curl https站点显示 Connected to... 并且header已发送, 但是收不到响应.

推测是MTU导致的. 因为curl http的响应是301, body很小, header也很小, 但是curl https要返回的内容可能比较多所以丢包了.

分别在wsl2下安装tcpdump并监听ethdocker0接口, 在windows下安装wireshark并监听VPN网卡(tun模式).

在docker内发起http请求, 可以看到docker0接口正常, eth接口正常, wireshark能看到请求和响应.

在docker内发起https请求, 可以看到docker0接口有请求报文, eth接口只有握手报文, wireshark能看到请求报文.

通过 ip a 命令查看接口, 可以发现WSL2内eth接口mtu为1370, docker0的mtu为1500. 推测MTU不匹配且没开启PMTU导致丢包.

解决方法是配置docker使其mtu变为1370, 方法如下:

1
sudo vim /usr/lib/systemd/system/docker.service

在配置文件中, 将ExecStart=...这一行改为:

1
2
3
...
ExecStart=/usr/bin/dockerd --mtu 1370 -H fd:// --containerd=/run/containerd/containerd.sock
...

然后重新启动docker服务:

1
sudo systemctl daemon-reload && sudo systemctl restart docker

再访问https就正常了.