问题现象:
Windows 11 + WSL2 + Ubuntu分发, 主机上启动VPN. WSL2内使用docker运行容器. curl http站点没问题, curl https站点显示 Connected to... 并且header已发送, 但是收不到响应.
推测是MTU导致的. 因为curl http的响应是301, body很小, header也很小, 但是curl https要返回的内容可能比较多所以丢包了.
分别在wsl2下安装tcpdump并监听eth和docker0接口, 在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 | ... |
然后重新启动docker服务:
1 | sudo systemctl daemon-reload && sudo systemctl restart docker |
再访问https就正常了.