解决 Clash 代理端口为 0 问题

Hyper-V 动态端口占用引发的故障

目录

前言

谁能想到自己给自己挖素材了呢。在 Windows 10 运行 Android 应用 中开启了 Hyper-V 功能,而导致了 Clash 的端口为 0 ,如下图:

事情发生在一次重新开机状态后,机场没问题,网络环境正常,再看看 Clash,端口为 0,改回 7890 ,又自动变回 0 ,很明显 7890 这个端口被占用了。

本机操作系统版本:Windows 10 专业版 19045.2604

调试

一开始不知道是 Hyper-V 的问题,直觉还是说某个程序占用了 7890 端口。

netstat -ano | findstr ":7890"

没有结果,代表没有程序在占用。(现在看来这句话应该改为“没有程序在此刻占用这个端口,但不排除有程序在随机保留着这个端口”)

实属无奈,只能寻找 Google 帮忙,找到 Github 上在 Clash 下面的一条 issue

https://github.com/Fndroid/clash_for_windows_pkg/issues/671

两个点:

  • 并不是 Windows 更新带来的问题
  • 电脑开启了 Hyper-V,导致 TCP 动态起始端口包含了 Clash 所使用的端口
# 查看 Hyper-v 启动后的保留端口范围
netsh interface ipv4 show excludedportrange protocol=tcp

果然,7890 端口在随机保留范围内 。

解决方法

三种方法

对症下药。

  • 把 Clash 端口直接设置在随机保留端口范围之外,比如直接设置个 16888,完全没问题;(最佳选择)
  • 既然问题是 Hyper-V 的导致,那就关闭 Hyper-V 功能,但是你之前打开 Hyper-V 所使用到的功能也就无法使用了(比如 WSL);
  • 既然随机保留端口是事实,那我也可以改变随机保留端口的范围;(有点本末倒置了,为什么宁愿选择系统动态映射的端口而不去改一个程序的端口?)

改变 Clash 端口只能一次性解决问题?

❗ ❗ ❗ ❗

但是,第一个解决方法貌似是一次性的,也就是每次重启电脑或者重启 Clash 之后,这个端口又会自动变成 0 或者我使用的这个 Clash 版本会自动寻找自己可以“生存”的端口。我觉得是 Clash 的设置问题,所以看了一下可以设置的地方,只要把 Clash 设置中使用动态端口连接混合配置的选项关闭即可,如下图:

亲测重启后一样成功,算是永久解决了。这项功能的意思是每次启动 Clash For Windows 会随机寻找一个可用端口,但是不会在单次使用中更换该端口(除非手动更改配置),重启后便会更换。

其实端口占用问题算是 Windows 上的一个通病,我也并不能担保以后随着系统的更新或者某些软件的安装不会又出现问题,解决方法也只能是一项项排除。

参考

😐 附上一个我使用的 Clash 的版本