我在 wsl 里,设置了/etc/wsl.conf ,就无法访问外网,ping 不通,一旦删除/etc/wsl.conf 就可以访问了,但是无法使用 service 了,不知道哪里出的问题,下面是配置信息
Windows 11 专业工作站版 23H2
WSL 版本:2.2.4.0 内核版本:5.15.153.1-2 WSLg 版本:1.0.61 MSRDC 版本:1.2.5326 Direct3D 版本:1.611.1-81528511 DXCore 版本:10.0.26091.1-240325-1447.ge-release Windows 版本:10.0.22631.3447
.wslconfig(windows)配置如下
[wsl2]
memory=20GB #限制最大内存
processors=8 #限制线程数
localhostforwarding=true
nestedVirtualization=true
guiApplications=true
[experimental]
autoMemoryReclaim=gradual # gradual | dropcache | disabled
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
sparseVhd=true
[network]
generateResolvConf = false
我的/etc/wsl.config 配置如下
[boot]
systemd=true
[network]
generateResolvConf = false
[user]
default = root
我的/etc/resolv.conf 配置如下:
nameserver 8.8.8.8
nameserver 8.8.4.4
![]() |
1
javazero 76 天前
改桥接试试,目测是 dns 的问题。
|
3
zed1018 76 天前
试试不要把 generateResolvConf 设为 false ,让 wsl2 用 windows 的 dns 。
这是我的配置 [wsl2] networkingMode=mirrored dnsTunneling=true autoProxy=true firewall=true [experimental] sparseVhd=true autoMemoryReclaim=gradual hostAddressLoopback=true |
5
liuhaitaoSB 76 天前
看你的需求应该是想访问 wsl2 里面的服务,并且 让 wsl2 能访问外网.
generateResolvConf = true 或者删除. 重启瞎 wsl 再进入 wsl,查看/etc/resolv.conf 打开 powershell ,ipconfig 看看上面 ip 对应的网卡, 比如说 以太网适配器 vEthernet (WSL (Hyper-V firewall)): 然后,管理员执行 New-NetFirewallRule -DisplayName "WSL_Hyper-V firewall" -Direction Inbound -InterfaceAlias "vEthernet (WSL (Hyper-V firewall))" -Action Allow 这时, 就可以用 resolv 里面的 ip 乃访问 wsl 了. |
6
liuhaitaoSB 76 天前
@wxyoung 桥接的时候可以指定 ip 啊.
|
7
liuhaitaoSB 76 天前
@liuhaitaoSB 之前可以这样的.好像 G 了,
|
8
liuhaitaoSB 76 天前
刚才瞄了一眼, 之前是 resolv.conf 里面默认是和 window 的虚拟网卡是同一个 ip, 现在改成 10.255.255.254 了.
反着来. 你的配置不用改, windows ipconfg 找到 vEthernet (WSL (Hyper-V firewall)),并且复制其 IP 管理员运行 New-NetFirewallRule -DisplayName "WSL_Hyper-V firewall" -Direction Inbound -InterfaceAlias "vEthernet (WSL (Hyper-V firewall))" -Action Allow 进入 wsl, 修改/etc/resolv.conf 里面修改为上面复制的 IP 重启下 wsl ip addr ,用这个 IP 访问即可. |
![]() |
9
whusnoopy 76 天前
我用 mirrored 模式,直接 wsl2 和本机共享对外 IP https://learn.microsoft.com/en-us/windows/wsl/networking#mirrored-mode-networking
|
![]() |
10
guzzhao 76 天前
我现在用的 mirrored,下面的配置是之前的,也可以固定 ip,可以试试
## ~~使用桥接网络 固定 ip 以及其他配置~~ 1. Hyper-V 虚拟机创建外部虚拟交换机 2. 修改.wslconfig ``` [wsl2] networkingMode=bridged vmSwitch=替换成你创建的虚拟交换机名称 dhcp=false ``` > 当 dhcp=false 时会读取 `/lib/systemd/network/wsl_external.network` 的网络配置 `vim /lib/systemd/network/wsl_external.network` ```ini [Match] Name=eth0 [Network] Description=bridge DHCP=false Address=192.168.1.10/24 # 自行修改 Gateway=192.168.0.1 # 自行修改 ``` **修改 DNS 禁止自动生成** 添加 `/etc/wsl.conf` 加入以下内容 ```ini [boot] systemd=true [network] generateResolvConf = false ``` ```bash rm -f /etc/resolv.conf echo "nameserver 223.5.5.5" > /etc/resolv.conf ``` 3. 重新启动 WSL 子系统 |
![]() |
11
leeyuzhe 76 天前
借楼问一下我 mirrored 模式会导致 idea 使用 debug 时被调试的程序会直接阻塞住,另外停止的时候也停不了
|
![]() |
12
StarkXiao 76 天前
我使用了以下配置,/etc/resolv.conf 是 WSL 自动生成的
``` [wsl2] memory=18GB localhostforwarding=true ``` 在以前,我每次启动 WSL ,我必须执行以下 batch 脚本 ``` batch @echo off setlocal enabledelayedexpansion rem Set Variables set wsl_hosts=wsl.local set win_hosts=win.local set HOSTS_PATH=%windir%\System32\drivers\etc\hosts rem Greping IPs for /f %%a in ('wsl -- bash -c "ip r | grep default | head -1 | cut -f3 -d ' '"') do set winip=%%a for /f %%a in ('wsl -- bash -c "hostname -I"') do set wslip=%%a echo win ip: %winip% echo wsl IP: %wslip% echo Setting below lines to Clipboard... echo !wslip! !wsl_hosts! # wsl_hosts echo !winip! !win_hosts! # win_hosts rem clear clipboard echo off | clip rem write to clipboard ( echo %wslip% %wsl_hosts% # wsl_hosts echo %winip% %win_hosts% # win_hosts ) | clip echo Done rem echo new blank line echo. echo Opening editor to replace Hosts file manually... start explorer.exe C:\Windows\System32\drivers\etc\hosts echo. echo Ready to exec below lines, [press Any Key to continue] when you updated the host file echo ipconfig /flushdns pause >nul ipconfig /flushdns endlocal ``` 上述脚本设置了两个 host 映射 `wsl.local` 以及 `win.local` ,并把映射写到粘贴板,再打开 hosts 文件,人手粘贴更新,最后在 cmd 界面按下任意按键执行 DNS 缓存刷新。 操作完之后,可以通过 `wsl.local` 访问到 wsl 里的服务端口,通过 `win.local` 访问到 Windows 里的服务端口,在 Windows 里使用 localhost 也能访问到 wsl 里。 在今年不知道哪个版本开始,wsl 的 IP 固定了,基本上也就不需要执行上面的脚本了,但每次我开启 wsl 还是执行它,确认 host 有没有更新的必要。 |
![]() |
13
shenjinpeng 76 天前
网络模式改成镜像模式, 不过偶尔也会遇到网络不通的情况, 重启大法解决一切
|
15
Pantheoon 75 天前
是不是装 vpn 了,vpn 会改 dns
|