求大神指导下 wsl2 的网络配置

9 天前
 wxyoung

我在 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
1343 次点击
所在节点    程序员
15 条回复
javazero
9 天前
改桥接试试,目测是 dns 的问题。
wxyoung
9 天前
@javazero 改桥接的话,windows 如何访问 wsl 里的 nginx ,应该不是固定 ip 吧
zed1018
9 天前
试试不要把 generateResolvConf 设为 false ,让 wsl2 用 windows 的 dns 。

这是我的配置

[wsl2]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true
firewall=true

[experimental]
sparseVhd=true
autoMemoryReclaim=gradual
hostAddressLoopback=true
wxyoung
9 天前
@zed1018 你的/etc/wsl.conf 是什么
liuhaitaoSB
9 天前
看你的需求应该是想访问 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 了.
liuhaitaoSB
9 天前
@wxyoung 桥接的时候可以指定 ip 啊.
liuhaitaoSB
9 天前
@liuhaitaoSB 之前可以这样的.好像 G 了,
liuhaitaoSB
9 天前
刚才瞄了一眼, 之前是 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 访问即可.
whusnoopy
9 天前
我用 mirrored 模式,直接 wsl2 和本机共享对外 IP https://learn.microsoft.com/en-us/windows/wsl/networking#mirrored-mode-networking
guzzhao
9 天前
我现在用的 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 子系统
leeyuzhe
9 天前
借楼问一下我 mirrored 模式会导致 idea 使用 debug 时被调试的程序会直接阻塞住,另外停止的时候也停不了
StarkXiao
9 天前
我使用了以下配置,/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 有没有更新的必要。
shenjinpeng
9 天前
网络模式改成镜像模式, 不过偶尔也会遇到网络不通的情况, 重启大法解决一切
zed1018
9 天前
@wxyoung #4

[boot]
systemd=true

[automount]
options="metadata,umask=022"
Pantheoon
8 天前
是不是装 vpn 了,vpn 会改 dns

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

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

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

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

© 2021 V2EX