虚拟网卡消失

只有开启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"