V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wxyoung
V2EX  ›  程序员

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

  •  
  •   wxyoung · 135 天前 · 1993 次点击
    这是一个创建于 135 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我在 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 条附言  ·  134 天前
    统一回复一下,问题不在配置,我重装了 wsl ,按照这个配置来是没有问题的,也可以使用 vpn 代理,问题出在别的地方,我使用了一些脚本搭建本地环境,换成 apt-get install 就好了
    15 条回复    2024-06-24 12:08:31 +08:00
    javazero
        1
    javazero  
       135 天前
    改桥接试试,目测是 dns 的问题。
    wxyoung
        2
    wxyoung  
    OP
       135 天前
    @javazero 改桥接的话,windows 如何访问 wsl 里的 nginx ,应该不是固定 ip 吧
    zed1018
        3
    zed1018  
       135 天前
    试试不要把 generateResolvConf 设为 false ,让 wsl2 用 windows 的 dns 。

    这是我的配置

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

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

    [boot]
    systemd=true

    [automount]
    options="metadata,umask=022"
    Pantheoon
        15
    Pantheoon  
       134 天前
    是不是装 vpn 了,vpn 会改 dns
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3762 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 10:29 · PVG 18:29 · LAX 02:29 · JFK 05:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.