本帖最后由 paopiu 于 2023-11-11 16:40 编辑
笔者手里的 WIN10 是家庭版,先看下系统版本。win + r 运行 winver
![1.png 1.png](data/attachment/forum/202311/11/112809dnuqe83nec4dwhdg.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300)
要想桥接 WSL2 网络,必须用到 Hyper-V 管理器。如果你是专业版,可以直接在 控制面板\程序\程序和功能\启用或关闭 Windows 功能 ,将 Hyper-V 打开。如果你的电脑像我一样是家庭版。需要一个 ps1 文件来完成。将下面的代码保存为 run.ps1 。
pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL
管理员身份打开 powershell ,切换到脚本所在目录,执行这个代码,如果报错了,说明没有执行权限。可以执行以下代码,临时开放运行权限。
Get-ExecutionPolicy -List
Set-ExecutionPolicy Unrestricted
# 运行程序
Set-ExecutionPolicy Undefined # 改回权限
![2.png 2.png](data/attachment/forum/202311/11/114829qnkq2dl5rj2jrdjj.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300)
安装 run.ps1 之后,重启电脑,就可以在搜索里找到 Hyper-V 管理器 了。(因为我已经安装好了,就没有安装截图了)
![3.png 3.png](data/attachment/forum/202311/11/115104izss5upngugz4bj5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300)
宿主机先开一个 CMD 或者 PowerShell 启动 WSL ,放一边。
运行 GET-NetAdapter
查看当前的适配器名称。
![4.png 4.png](data/attachment/forum/202311/11/115810rbbm6byada5aenz5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300)
我用的 WLAN ,所以接下来我的代码是,如果你插了网线,改对应的 -NetAdapterName
就可以了。
Set-VMSwitch -name "WSL" -NetAdapterName "WLAN" -AllowManagementOS $true
1. 动态 IP
动态 IP 方式,每次开机的 IP 都不确定,会变化。
接着我们回到 WSL 里面,刷新下 ip 地址,运行
sudo ip addr flush dev eth0
sudo dhclient eth0
修改 DNS
vi /etc/resolv.conf
内容改成 8.8.8.8
,也可以改成其他 DNS 。
nameserver 8.8.8.8
查看当前 IP
ifconfig eth0 | grep inet
![5.png 5.png](data/attachment/forum/202311/11/121246e4gma4rw9hfmcwc6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300)
可以看到此时 WSL 的 IP 地址和宿主机在同一个网段了。
2. 静态IP
在 WSL 中修改下面几个文件
vi /usr/lib/systemd/network/wsl_external.network
vi /etc/wsl.conf
vi /etc/resolv.conf
内容像这样
wsl_external.network
[Match]
Name=eth0
[Network]
Description=WSLBridge
DHCP=false
Address={Your ip for WSL}
Gateway={Gateway of the bridged card}
DNS={DNS used by your bridged card}
wsl.conf
[boot]
systemd=true
### command 可以写在这里,也可以在宿主机里执行
command = "/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/powershell.exe -Command 'Set-VMSwitch -name "WSL" -NetAdapterName "WLAN" -AllowManagementOS $true'"
[network]
generateResolvConf = false
resolv.conf
nameserver {DNS used by your bridged card}
最后设置下 network
systemctl enable systemd-networkd
systemctl restart systemd-networkd
systemctl enable systemd-resolved.service
systemctl restart systemd-resolved.service
每次先启动 WSL ,然后设置网桥(如果前面设置了 command
,这步骤不需要)
Set-VMSwitch -name "WSL" -NetAdapterName "WLAN" -AllowManagementOS $true
此时 WSL 的 IP 地址就是在前面配置文件中的了。
为了使宿主机和 WSL 之间可以相互 PING 通,需要修改宿主机防火墙。
依次打开 控制面板\系统和安全\Windows Defender 防火墙\高级设置 ,找到 入站规则 核心网络诊断 - ICMP 回显请求(ICMPv4-In) 专用,公用和域 ,启用这 2 条规则,就可以相互 PING 通了。这个方法,貌似 WSL 和 宿主机使用了同一个 IP 地址了。
![6.png 6.png](data/attachment/forum/202311/11/121835bet17mllueq0s06z.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300)
如果最后关闭 WSL ,不再需要桥接了,可以运行下面的命令,将 WSL 改回 NAT
Set-VMSwitch WSL -SwitchType Internal