需求

在docker容器内部程序自己获取的ip是172开头的。我需要跟宿主机同样网段的ip。

问题

win10系统wsl2 不支持桥接

更简单的解决方案

使用vmware虚拟机,直接启动一个linux镜像,然后使用桥接网络模式也能实现需求。

另一种思路

  1. 使用docker的macvlan模式,该模式只支持linux系统
  2. wsl2使用的ubuntu是子系统,可行,但是子系统使用的是NAT模式,与宿主机ip不同。
  3. 需要wsl2跟宿主机ip相同,或者wsl2是桥接模式
  4. 需要环境是win11 22h2, win10 某个build版本,我现在的环境如下。
WSL 版本: 2.0.9.0
内核版本: 5.15.133.1-1
WSLg 版本: 1.0.59
MSRDC 版本: 1.2.4677
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows 版本: 10.0.19045.3570
  1. 以上版本修改wsl2为桥接模式,会出现无法启动的情况,所以现在的版本无法修改桥接模式。
无法配置 networkingMode Bridged)(网络。若要禁用网络,请在C:\Users\admin\.wslconfig中设置“wsl2.networkingMode=None”
Error code: Wsl/Service/CreateInstance/CreateVm/ConfigureNetworking/HCS/0x8037010d
  1. win10系统升级至 win11 22h2, 按照下面步骤修改wsl2为桥接解决了问题。

修改桥接模式的步骤

  1. Hyper-V 管理器 -> 虚拟交换机管理器 -> 新建虚拟网络交换机
  2. 创建外部网络, 名字随意,我这里填写 Bridged
  3. 点击应用,点击确认。
  4. %USERPROFILE%目录下新建文件.wslconfig,添加以下内容
[wsl2]
networkingMode=bridged
vmSwitch=Bridged # 刚才设置的虚拟交换机
ipv6=true # 开启ipv6,
  1. 重启wsl2
wsl --shutdown
wsl

参考:https://blog.csdn.net/qq_44729735/article/details/131252561

特别提醒
此内容仅适用于Windows 11 22H2 及以后版本,老版本请升级
需要从 Microsoft Store 里面下载最新的 Windows Subsystem for Linux。
wsl装好之后可以运行 wsl --version 确认一下是不是 1.0 以上。
此教程需要用到Hyper-V,Windows11请升级到专业版及以上

new/bing

问: win10 wsl2 改桥接的办法

答:

打开 PowerShell 并以管理员身份运行。
运行 Get-NetAdapter 命令,获取所有网卡的信息。
记录想要桥接到的网卡名称,例如 Wi-Fi 或 Ethernet 等等。
运行以下命令:Set-VMSwitch WSL -NetAdapterName 网卡名称,将 WSL 使用的网卡桥接到指定的网卡之上。
进入 WSL 并配置 IP 地址和网关。例如,如果网关为 192.168.1.1,IP 地址为 192.168.1.150/24,则可以运行以下命令:
$ sudo ip addr del $(ip addr show eth0 | grep 'inet\\b' | awk '{print $2}' | head -n 1) dev eth0
$ sudo ip addr add 192.168.1.150/24 broadcast 192.168.1.255 dev eth0
$ sudo ip route add 0.0.0.0/0 via 192.168.1.1 dev eth0
  1. 他的答案跟上面的方式对比,实际上是直接把WSL的网卡桥接上了以太网。跟我使用的新建一个虚拟网卡然后桥接上以太网区别不大。

  2. 没有使用.wslconfig, 所以 wsl2 使用默认NAT网络模式启动。

  3. 执行指令sudo ip addr del $(ip addr show eth0 | grep 'inet\\b' | awk '{print $2}' | head -n 1) dev eth0 会有以下错误:

RTNETLINK answers: Operation not supported

无法解决我的问题,遂决定升级系统至win11

最后的解决方案

win11 23h2 的wsl2 有一个镜像网络模块,可以使wsl2跟宿主机ip一致.

升级 win11 23h2, 使用wsl2的镜像网络模式

[experimental]
autoMemoryReclaim=gradual # 可以在 gradual 、dropcache 、disabled 之间选择
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
sparseVhd=true
hostAddressLoopback=true  

我使用镜像模式之后wsl2的ip虽然跟宿主机一样了,但是使用宿主机网卡ip一直访问不到wsl2的端口,只能通过127.0.0.1访问,最后在这个帖子下的一个评论找到了

hostAddressLoopback=true  

这个参数是 (Ryzon M1)(https://www.zhihu.com/people/ryzen-m1) 提供的,感谢!!

官方文档: https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config#experimental-configuration-settings

--完--