WSL实现桥接网络并固定IP地址

        WSL在Linux开发过程中给开发人员提供了极大的便利,但同时存在一定的问题,就是IP地址不固定。对嵌入式开发人员来说,要求在固定的网络环境下对开发板进行调试,不太友好。因此笔者尝试对WSL实现桥接网络直连外部交换机,并关闭DHCP固定它的IP地址。

        要实现上述功能有两种方式,一种是临时对WSL的虚拟交换机进行修改,每次重启计算机后会重置;另一种是新建一个虚拟网络交换机,用来实现桥接网络,做好配置则可以保证其永久生效。

临时生效方案

        使用管理员权限运行powershell,运行“Get-NetAdapter | fl”获得网卡列表,从中选择需要桥接到的网卡(必须是物理网卡),笔者电脑上的物理网卡名叫WLAN。

Get-NetAdapter | fl

        在Windows系统下创建文本文档WSL2.bat,并填入以下内容(注意网卡名要填自己电脑上的,Ubuntu要改为自己主机上的子系统名称,且IP地址要和桥接的外部网卡在同一网段,路由地址应为外部网卡的网关地址)

powershell -c "Set-VMSwitch WSL -NetAdapterName WLAN"
wsl -d Ubuntu -u root ip addr del $(ip addr show eth0 ^| grep 'inet\b' ^| awk '{print $2}' ^| head -n 1) dev eth0
wsl -d Ubuntu -u root ip addr add 192.168.0.205/24 broadcast 192.168.0.255 dev eth0
wsl -d Ubuntu -u root ip route add 0.0.0.0/0 via 192.168.0.1 dev eth0
wsl -d Ubuntu -u root echo nameserver 192.168.0.1 ^> /etc/resolv.conf
wsl -d Ubuntu -u root service ssh start

保存后,使用管理员身份运行WSL2.bat,运行结束后,进入WSL子系统,运行ifconfig查看是否修改成功。

        如果修改成功则显示如上图,但这种修改是临时的,意味着下次重启计算机后,设置又会被复位,因此每次重启都需要以管理员身份运行上述脚本。如果嫌麻烦,可以将脚本配置进开机启动项,这样就不需要人为操作了。

永久生效方案

        上述临时生效方案虽然可以将脚本配置成开机启动解决,但终归有些不太方便。出于追求完美的考虑,笔者还是尝试桥接网络的永久生效方案。(注意,永久生效方案需要Hyper-V管理器的支持,配置不高的电脑慎用,会卡到怀疑人生,如果实在想尝试,建议在装好虚拟交换机后卸载Hyper-V管理器)

安装Hyper-V管理器

        如果是专业版Windows操作系统,可以直接在“控制面板->程序和功能->启用或关闭Windows功能”界面选中Hyper-V后,确定退出并重启计算机。

        如果是家庭版Windows系统,则需要通过脚本进行安装,创建如下脚本"Hyper-V.bat"

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hv.txt
for /f %%i in ('findstr /i . hv.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hv.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V -All /LimitAccess /ALL
Pause

        保存后以管理员身份运行Hyper-V.bat,安装Hyper-V管理器,安装完成后重启计算机。

        安装完成后,可在Windows搜索栏内搜索Hyper-V管理器,打开后界面如上图所示。

创建桥接网络虚拟交换机

        按照下图标示的步骤创建虚拟交换机,将其命名为WSLBridge。

修改配置文件

        使用快捷键Win+R唤出运行窗口,在打开栏内填入%USERPROFILE%并在打开的文件夹内创建配置文件".wslconfig",并在该配置文件内输入以下内容。

[wsl2]
vmIdleTimeout=-1
networkingMode=bridged
vmSwitch=WSLBridge
ipv6=true
dhcp=false

        进入wsl的Ubuntu子系统,打开/etc/wsl.conf,若文件不存在则创建

sudo vim /etc/wsl.conf

        在wsl.conf配置文件内填入以下内容

[boot]
systemd = true
[network]
generateHosts = false
generateResolvConf = false

        检查/etc/systemd/network/,若文件夹下没有文件则创建一个配置文件my-network.conf,若文件夹下有文件则忽略此步骤。

sudo vim /etc/systemd/network/my-network.conf

        在my-network.conf文件内填入以下内容

[Match]
Name=en*

[Network]
DHCP=ipv4

        重启networkd

sudo systemctl restart systemd-networkd.service

        打开配置文件/etc/netplan/00-wsl2.yaml,如果不存在就创建。

sudo vim /etc/netplan/00-wsl2.yaml

        在00-wsl2.yaml文件内填入以下格式的内容

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no
      addresses: [静态IP地址/子网掩码]
      gateway4: 网关IP地址
      nameservers:
        addresses: [DNS服务器IP地址1, DNS服务器IP地址2]

举例如下:

network:
  version: 2
  ethernets:
    eth0:
      dhcp4: no
      addresses: [192.168.0.205/24]
      gateway4: 192.168.0.1
      nameservers:
        addresses: [8.8.8.8, 114.114.114.114]

        然后使用sudo netplan apply应用新的网络设置,重启WSL2子系统即可。(出现类似以下报错可忽略)

        重启后,wsl子系统的IP地址将不再随机变化,且直接桥接到外部局域网,可更方便地用于进行网络调试以及嵌入式开发。(用这个方案可永久生效,只需配置一次)

卸载Hyper-V管理器

        由于Hyper-V管理器给笔者的笔记本电脑造成了较大的负荷,所以笔者决定将其卸载,以释放一定的计算资源。卸载Hyper-V后,之前创建的虚拟交换机仍然会正常工作,不受影响。

        在“控制面板->程序和功能->启用或关闭Windows功能”界面取消选中Hyper-V后,确定退出并重启计算机即可。

猜你喜欢

转载自blog.csdn.net/cotex_A9/article/details/132695156