问题现象:
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就正常了.