虚拟网卡消失

只有开启NAT模式虚拟网卡才会出现,其他模式会消失


外网无法访问虚拟机

经查,是Windows防火墙的原因,虽然没有显式的规则,但是Windows防火墙似乎会默认拦截对wsl的入站流量(在系统防火墙被其他程序接管后,这个情况仍然存在)。 实践中,我把系统防火墙关掉或者默认允许所有入站(如图)的时候,外网对wsl的入站可以正常进行。

但这 并不是一种好方法

镜像模式下,wsl的防火墙并不是系统墙的配置,而是Hyper-v的防火墙配置,运行

Get-NetFirewallHyperVVMSetting -PolicyStore ActiveStore -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}'

返回

Name                  : {40E0AC32-46A5-438A-A0B2-2B479E8F2E90}
Enabled               : True
DefaultInboundAction  : Block
DefaultOutboundAction : Allow
LoopbackEnabled       : True
AllowHostPolicyMerge  : True

发现这里默认入站是阻止的。 https://learn.microsoft.com/zh-cn/windows/wsl/networking

执行该命令放行。

Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow

代理相关

NAT模式的代理设置比较麻烦,所以选择镜像模式(Mirrored)。

Windows 搜索栏中搜索并打开 WSL 设置。

按照下图中方式进行设置:

实际上按照图片的设置方法后,已经能确定wsl使用本机代理了(使用的地址为127.0.0.1:7897),并且这时使用TUN模式也能正常工作。可以curl来检测代理是否工作。

# 如果没有可以先安装一个curl
sudo apt install curl
curl www.google.com
curl https://zh.wikipedia.org/wiki/Wikipedia:%E9%A6%96%E9%A1%B5

有返回就说明代理正常。

关于主机地址还回选项

打开后,wsl 里面跑的网络服务可以在宿主机中通过 127.0.0.1 访问到,反之依然。

深入解释

如果在终端中打开 Linux 某个发行版之前,你开启了系统代理,那么打开 Linux 之后,系统会自动给当前 Linux Shell 中的 env 注入代理地址,具体如下:

http_proxy=http://127.0.0.1:7897
HTTP_PROXY=http://127.0.0.1:7897
https_proxy=http://127.0.0.1:7897
HTTPS_PROXY=http://127.0.0.1:7897

也可以在 Linux 的终端配置中定义两个方法,方便随时打开和关闭代理。

# 开启终端代理
proxy_on() {
  export http_proxy="http://127.0.0.1:7897"
  export HTTP_PROXY="http://127.0.0.1:7897"
  export https_proxy="http://127.0.0.1:7897"
  export HTTPS_PROXY="http://127.0.0.1:7897"
  export all_proxy="http://127.0.0.1:7897"
  export socks_proxy="socks5://127.0.0.1:7897"
  export SOCKS_PROXY="socks5://127.0.0.1:7897"
  echo "终端代理已开启"
}
 
# 关闭终端代理
proxy_off() {
  unset http_proxy
  unset HTTP_PROXY
  unset https_proxy
  unset HTTPS_PROXY
  unset all_proxy
  unset socks_proxy
  unset SOCKS_PROXY
  echo "终端代理已关闭"
}

与网上大部分教程的区别

网上的教程通常需要你设置开启局域网代理,并且在wsl里面设置环境变量声明代理地址,但这有一点矛盾:镜像模式不会有虚拟网络适配器,所以局域网代理根本无法工作


连接WSL端口

现在,WSL中起个网络服务后,外部就能访问了,但是在宿主机中,通过tcpview等软件却看不到有程序在占用这个端口。

这是因为Hype-v在内核层面转发了端口 https://pro.4399ai.chat/c/68eccd38-e6cc-8330-ac3e-54c6895ad701


WSL提示未注册类

wsl提示已经损坏,已经无法自动修复,所以需要自己手动安装一个 https://www.cnblogs.com/oldsaltfish/p/18717580


WSL会使用Windows的系统变量

子系统内如果使用了Windows的系统变量,会导致一些安装的软件无法正常运行 想要取消这一设定,在/etc/wsl.conf下加入:

[interop]
appendWindowsPath = false

无法直接从Windows终端中启用wsl子系统的程序

Windows终端中是可以直接调用wsl里面的程序的,比如:

ls | wsl grep xxx

但是有时候一些程序无法直接通过wsl 命令拉起(比如codex),这是因为非交互式shell中省略了部分个人配置,导致一些设置的环境变量没有生效

设置根目录下.zshenv即可解决

PATH="$HOME/.local/share/pnpm:$PATH"