首页 > 其他分享 > wsl2 通过桥接网络实现被外部局域网主机直接访问

wsl2 通过桥接网络实现被外部局域网主机直接访问

时间:2023-02-27 18:11:07浏览次数:47  
标签:桥接 ip wsl dev WSL 局域网 wsl2 powershell

wsl2 通过桥接网络实现被外部局域网主机直接访问

背景介绍

之所以有这个需求的主要原因是需要用WSL和外部机器人硬件调试分布部署的ROS系统,WSL2是在windows主机内部建立的虚拟局域网,其ip从外部无法访问,网上很多文章提到端口转发,但是ROS的文档里面要求用到所有的端口,采用端口转发不太实际。所以要想办法让WSL2的ip暴露出来,使得外部主机能够访问到。

一、普通实现方法

思路就是将wsl2自建的虚拟NAT网络桥接到windows主机网卡上,主要参考这篇文章

https://zhuanlan.zhihu.com/p/488442403

1、开启hyper-v

桥接功能需要windows的hyper-v组件支持,但是win10/11家庭版是不包含hyper-v的,专业版才包含。网上也有文章提到家庭版安装hyper-v的方法,但是我没有测试,以下内容都是在win11专业版上进行的测试,win10专业版应该也是一样的。 首先,进入控制面板—程序—启用或关闭windows功能,勾选hyper-v,确认后重启电脑。

2、桥接网络

重启后首先运行wsl2(这样才能出现WSL的虚拟网卡),以管理员方式打开powershell,执行Get-NetAdapter,可以列出系统所有的网卡,记住想要桥接的网卡名称,比如我想桥接到有线网络其名称为“以太网”。

powershell中执行

 Set-VMSwitch WSL -NetAdapterName 以太网

将wsl虚拟网络和主机有线网络桥接起来。

3、手动修改WSL网络

进入wsl2内手动修改ip配置,假设WSL的有线网络为eth0,外部局域网网关为 10.0.0.1,需要将WSL网络IP 设置为 10.0.0.7/24,则在bash中分别执行如下命令:

 sudo ip addr del $(ip addr show eth0 | grep 'inet\b' | awk '{print $2}' | head -n 1) dev eth0
 sudo ip addr add 10.0.0.7/24 broadcast 10.0.0.255 dev eth0
 sudo ip route add 0.0.0.0/0 via 10.0.0.1 dev eth0

接下来还需要更新DNS地址,执行

 sudo vim /etc/resolv.conf

修改文件最后一行内容为 nameserver 10.0.0.1,然后保存退出即可。 一切配置完毕,现在可以从外部局域网其他主机直接ping通WSL了

4、取消桥接

在windows中管理员方式打开powershell,执行以下指令:

 Set-VMSwitch WSL -SwitchType Internal

然后执行 wsl --shutdown 重启wsl,即可恢复原有的虚拟内部网络。

 

二、一键脚本

上述步骤太繁琐,为了简单操作,我编写了两个powershell脚本,可以一键执行网络桥接和取消网络桥接

1、wsl linux配置网络脚本

进入wsl,在wsl的home目录下新建一个脚本文件,例如set_eth0.sh,其内容如下:

 #!/bin/bash
 new_ip=10.0.0.11
 brd=10.0.0.255
 gateway=10.0.0.1
 nameserver=10.0.0.1
 net_dev=eth0
 echo "password" | sudo -S ip addr del $(ip addr show $net_dev | grep 'inet\b' | awk '{print $2}' | head -n 1) dev $net_dev
 sudo ip addr add $new_ip/24 broadcast $brd dev $net_dev
 sudo ip route add 0.0.0.0/0 via $gateway dev $net_dev
 sudo sed -i "\$c nameserver $nameserver" /etc/resolv.conf

注意将new_ipbrdnameservergatewaynet_dev分别修改为实际想要设定的值,另外将echo "password" | 中的password替换为wsl的用户密码。

2、powershell桥接网络脚本

在windows中新建一个ps1文件,例如wsl-bridge-on.ps1ps1powershell的脚本,其脚本语言和以前的bat是不一样的) 内容如下:

 # 检查并以管理员身份运行PS并带上参数
 $currentWi = [Security.Principal.WindowsIdentity]::GetCurrent()
 $currentWp = [Security.Principal.WindowsPrincipal]$currentWi
 if( -not $currentWp.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
 {
     $boundPara = ($MyInvocation.BoundParameters.Keys | foreach{'-{0} {1}' -f  $_ ,$MyInvocation.BoundParameters[$_]} ) -join ' '
     $currentFile = $MyInvocation.MyCommand.Definition
     $fullPara = $boundPara + ' ' + $args -join ' '
    Start-Process "$psHome\pwsh.exe"   -ArgumentList "$currentFile $fullPara"   -verb runas
    return
 }
 #首先随意执行一条wsl指令,确保wsl启动,这样后续步骤才会出现WSL网络
 echo "正在检测wsl运行状态..."
 wsl --cd ~ -e ls
 echo "正在获取网卡信息..."
 Get-NetAdapter
 echo "`n正在将WSL网络桥接到以太网..."
 Set-VMSwitch WSL -NetAdapterName 以太网
 echo "`n正在修改WSL网络配置..."
 wsl --cd ~ -e sh -c ./set_eth0.sh
 echo "`ndone"
 pause

最前面那一段是用来检查运行脚本的powershell有没有管理员权限,如果没有,则重新打开一个需要申请管理员权限的powershell;

参考:https://www.delftstack.com/zh/howto/powershell/powershell-run-as-administrator/

然后随意执行一条wsl指令,这样如果wsl在后台未启动的情况下会自动启动,确保出现WSL的虚拟网卡;接下来就是网络桥接指令,注意把Set-VMSwitch WSL -NetAdapterName 以太网中的以太网改为你自己机器的网卡名称。最后是用到了windows和wsl混合命令,直接调用wsl执行linux脚本修改linux的网络配置。这里linux脚本就是步骤1中新建的set_eth0.sh,保存在home路径下。

3、powershell取消桥接脚本

在windows中新建一个ps1文件,例如wsl-bridge-off.ps1

 # 检查并以管理员身份运行PS并带上参数
 $currentWi = [Security.Principal.WindowsIdentity]::GetCurrent()
 $currentWp = [Security.Principal.WindowsPrincipal]$currentWi
 if( -not $currentWp.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator))
 {
     $boundPara = ($MyInvocation.BoundParameters.Keys | foreach{'-{0} {1}' -f  $_ ,$MyInvocation.BoundParameters[$_]} ) -join ' '
     $currentFile = $MyInvocation.MyCommand.Definition
     $fullPara = $boundPara + ' ' + $args -join ' '
    Start-Process "$psHome\pwsh.exe"   -ArgumentList "$currentFile $fullPara"   -verb runas
    return
 }
 echo "正在解除wsl桥接..."
 Set-VMSwitch WSL  -SwitchType Internal
 echo "正在重启wsl"
 wsl --shutdown
 wsl --cd ~ -e ls
 echo "`ndone"
 pause

最前面一段同样是检查管理员权限,然后执行解除桥接指令,最后重启wsl,就完成了

4、配置脚本属性

分别右键wsl-bridge-on.ps1wsl-bridge-off.ps1这两个脚本,在打开方式中选择其它应用,找到powershell安装路径下的可执行文件pwsh.exe,勾选始终使用此应用打开.ps1文件,这样就可以直接双击运行了。不过,默认情况下windows powershell不允许执行自定义脚本,所以需要修改设置打开执行权限。管理员方式打开powershell,执行Set-ExecutionPolicy UnrestrictedSet-ExecutionPolicy RemoteSigned ,按y确认即可

5、使用方法

将以上三个脚本放入同一目录下(如:wsl-bridge目录),需要桥接wsl网络的时候直接双击运行wsl-bridge-on.ps1,出现申请管理员权限的时候按是确认,然后等待脚本执行完毕即可。取消桥接则运行wsl-bridge-off.ps1,也是同样的流程。两个脚本是不是相当方便?windows powershell还是很强大的。

标签:桥接,ip,wsl,dev,WSL,局域网,wsl2,powershell
From: https://www.cnblogs.com/huanliu/p/17161388.html

相关文章

  • HHDESK局域网连接功能
    近年来,许多单位和部门根据实际需要都组建了局域网,这为日常事务处理带来了极大的便利。然而也有许多的局域网相互独立,未实现真正意义上的信息共享。因此,网络互联在这种环境......
  • WSL2 网络不可用 ping:: Temporary failure in name resolution
    突然有一天,WSL虚拟机的网络不可用了。Ping报错ping:www.baidu.com:Temporaryfailureinnameresolution参考了这篇博客link.后我这里的解决方法如下:1打开/etc......
  • 局域网实现PC、Pad、Android互联
    目录局域网实现PC、Pad、Android互联一、网络邻居1、Windows配置1.1开启共享功能1.2设置用户1.3共享文件夹2、Pad连接二、FTP&HTTP1、电脑配置1.1HTTP服务1.2......
  • wsl2 + bridge 固定ip终极方案
    前提1安装了wsl2wsl-l-vPSC:\Users\Administrator>wsl-l-vNAMESTATEVERSION*Ubuntu-22.04Running2......
  • Windows wsl2安装Docker
    wsl2的Ubuntu安装好后,就可以安装Docker了。由于众所周知的原因,国内访问国外的某些网站会访问不了或者访问极慢,Docker的安装网站就在其中。所以推荐使用阿里的镜像进行安......
  • Windows wsl2支持systemd
    背景很多Linux发行版都是使用systemd来管理程序进程,但是在WSL中默认是用init来管理进程的。为了符合长久的使用习惯,且省去不必要的学习成本,就在WSL的发行版(我这里安装的......
  • 18-桥接器模式
    18-桥接器模式概念桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立的变化,实现指的是抽象类和它的派生类用来实现自己的对象。实现系统可能有多角度分类,......
  • 手动搭建桥接网络 2
    1.建namespace和默认空间联通#veth1在ns1上,IP:192.168.1.11#veth0从默认空间->br0,IP:192.168.1.10ipnetnsaddns1iplinkaddveth0typevethpeernamevet......
  • 局域网大文件上传解决方案
    ​ 我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用。首先我们需要了解的是上传文件三要素:1.表单提交方式......
  • CentOS 7搭建本地yum源和局域网yum源
    搭建本地yum源本地yum源,就意味着只有搭建该yum源的这台服务器能使用,其它的服务器都不能使用该yum源。搭建本地yum源的所有步骤如下:复制#准备好一个centos 的镜像,我这......