wsl2 镜像网络模式与 clash tun 模式冲突的解决方案

2023-12-13 16:33:25 +08:00
 kuingsmile

参考 https://www.v2ex.com/t/975098?p=2 中有人提到的,同时设置了 wsl2 镜像网络模式和 clash 的 tun 模式之后,wsl2 内的 https 访问会无法连接的问题。

经过测试发现原因是由于 clash 的 tun 模式默认 MTU 为 9000 ,修改为 1500 就正常了。

先使用命令ifconfig,查找 ip 地址为198.18.0.1的网卡的名字,比如eth4,然后 root 用户执行ip link set eth4 mtu 1500就可以了。

想开机自动执行的话,在/etc/systemd/system目录下添加一个文件mtufix.service,内容:

[Unit]
Description=clash tun mtu fix
After=network-online.target

[Service]
ExecStart=/usr/sbin/ip link set eth4 mtu 1500

[Install]
WantedBy=multi-user.target

然后执行

systemctl enable mtufix.service
systemctl start mtufix.service
4882 次点击
所在节点    程序员
13 条回复
zuotun
2023-12-13 17:25:27 +08:00
解决方案是别用镜像模式, 宿主机都访问不了虚拟机的端口....
docker 暴露一个端口, WSL 用 Windows 对外 IP 可以访问, Windows 用相同 IP 或者 127 都不通, 这算什么事?
不仅如此, 还连带我其他 Windows 上直接起的也不行, node 项目唤起浏览器然后 localhost:3000 不通....
我甚至都没开什么 clash, 关闭镜像网络重启之后就好了, 过程中 Docker Desktop 会断开连接别的也没什么.
Jat001
2023-12-13 23:15:35 +08:00


无法复现,不知道是不是修了,还是因为我用的 fake-ip 地址不一样

CFW 0.20.39
WSL 2.0.14
Jat001
2023-12-14 01:18:13 +08:00
多次测试后发现确实 mtu 会影响 wsl 内的网速,有时候会导致连接超时

另外 systemd-networkd 也可以管理网络设置,配置文件还更简单

/etc/systemd/network/10-eth7.network

```
[Match]
Name=eth7

[Link]
MTUBytes=1500
```

理论上这样设置后每次开启 tun mode ,networkd 都会重新设置 eth7 的 mtu ,不像 systemd service 只会运行一次

不过 networkd 有个 bug ,就是热插拔的设备不会在接入后重新配置,看 github 已经修了,不知道是不是我这系统里的 systemd 太老了

https://github.com/systemd/systemd/pull/22540
Jat001
2023-12-14 03:47:57 +08:00
@Jat001 #3 又测试了下,在 wsl 启动后再打开 tun mode 会导致 wsl 内无法联网,所以没必要纠结热插拔的问题了
Clouder1
2023-12-21 23:29:34 +08:00
解决了,赞。
奇怪的是这个问题在我的设备上是突然出现的,之前一段时间开 mirrored mode 和 Clash Tun mode 也没遇到这个情况,今天突然连不上网了.
rozbo
350 天前
真灵!这你是怎么发现的!
arc9un
305 天前
还有一种解决方法
https://github.com/clash-verge-rev/clash-verge-rev/issues/329
把 CFW 换成 clash-verge-rev(目前还在更新),clash-verge-rev 有个 merge 功能支持直接设置 tun 的 mtu 。
直接在订阅里新建一个 merge ,加上
```
tun:
mtu: 1500
```
这样不用在 wsl 里设置什么东西,就能设置 tun 虚拟网卡的 mtu 。设置完后记得重启电脑生效。
srwxyz
281 天前
@zuotun 同感,已切默认模式,自己配路由都比这玩意好使
hxf168482
266 天前
今天发现在 mirror 模式下,mvn install 无法下载 jar 包,发现原来是这个问题,点赞。
Nolca
261 天前
似乎镜像模式也能从 windows 访问 wsl 内端口,参考 https://github.com/microsoft/WSL/issues/10632
不过我目前还没成功,成功了再回复。
Nolca
261 天前
最后还是 networkingMode=NAT ,mirrored 目前不能 windows 到 wsl
lllei
223 天前
@Nolca <https://learn.microsoft.com/en-us/windows/wsl/networking> 中有提到解决方案:

```powershell
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
```
JuzerQ
189 天前
只要 mtu 改成 1500 就行了吗,v2rayN 设置里面可以设置 tun 模式的 mtu 值
![]( https://imgur.com/a/6B5Mzt2)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1000081

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX