• 实现外网Ping通WSL(网卡桥接方式实现)


    前言:

    在我们经常和机器人打交道的这群人中有一个需求,那就是希望我们的电脑主机能够和外部的机器人系统进行组网,比如:通过ROS组网通信,调试机器人等。但是,WSL2是在windows主机内部建立的虚拟局域网,其ip从外部无法访问。网上实现外网Ping通WSL的很多文章提到端口转发,但是ROS的文档里面要求用到所有的端口,所以采用端口转发不太实际。所以要想办法让WSL2的ip暴露出来,使得外部的主机能够访问到。

    实现原理:

    将wsl2自建的虚拟NAT网络桥接到windows主机网卡上

    实现步骤

    1、开启hyper-v

    桥接功能需要windows的hyper-v组件支持。首先,进入控制面板—程序—启用或关闭windows功能,勾选hyper-v,确认后重启电脑。

    image-20220915090649801

    2、编写桥接网络powershell脚本

    在windows中新建一个ps1文件,例如network-on.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
    }
    #首先随意执行一条wsl指令,确保wsl启动,这样后续步骤才会出现WSL网络
    echo "check the wsl whether it is running..."
    wsl --cd ~ -e ls
    echo "get network card infomation..."
    Get-NetAdapter  # 获取网卡信息
    echo "Bridging WSL network to Ethernet..."
    # 注意这里,这里是把wsl的虚拟网卡 [WSL] 桥接到我们主机网卡 [以太网],如果你想桥接到wifi网卡那应该做相应的调整
    Set-VMSwitch WSL -NetAdapterName 以太网 
    echo "`n Modifying WSL network configuration..."
    # 这里会去运行我们wsl中的一个网络配置脚本
    wsl --cd ~ -e sh -c ./Programs/network.sh
    echo "`ndone!!!"
    pause
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    编写好powershell脚本之后,我们需要修改这个脚本的启动方式,以及赋予管理员权限启动这个脚本。在打开方式中选择其它应用,找到powershell安装路径下的可执行文件pwsh.exe,勾选始终使用此应用打开.ps1文件,这样就可以直接双击运行了。我这里的路径是在这个地方:

    image-20220915093039492

    注意:默认情况下windows powershell不允许执行自定义脚本,所以需要修改设置打开执行权限。管理员方式打开powershell,执行Set-ExecutionPolicy UnrestrictedSet-ExecutionPolicy RemoteSigned ,按y确认即可

    image-20220915095003731

    3、编写网络配置脚本

    在实现网卡桥接之后,我们要进入wsl配置我们的网络(IP、子网掩码、网关等)。我这里是通过写入一个脚本来实现,进入wsl,在你的文件夹下面编写如下脚本

    #!/bin/bash
    new_ip=192.168.1.233
    brd=192.168.1.255
    gateway=192.168.1.1
    nameserver=192.168.1.1
    net_dev=eth0
    # 注意,下面这里需要用到wsl的sud执行命令,所以需要填写你wsl的密码
    echo "[your 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    注意:我这里的网关是 192.168.1.1,我把wsl的ip配置为 192.168.1.233 ,如果你的环境不同需要做相应的调整

    实现结果

    我们双击我们写的network-on.ps1运行脚本即可实现网络的桥接,下面是运行结果

    image-20220915093432005

    此时我们再到wsl中查看一下wsl的IP地址

    image-20220915093611472

    可以看到wsl的IP已经和我们Windows主机的ip在同一个网段上了,我这里window的ip是

    image-20220915093908840

    我们在我们局域网里面的其他电脑ping一下我们的wsl看看是否可以ping通

    image-20220915094100120

    可以看到我们已经实现了把wsl的ip暴露出来,并且可以在局域网中的其他主机进行访问,这样我们后面就可以配置ROS组网进行机器人的调试了。

    取消桥接

    注意:上面说的这种桥接方式在电脑重启之后这个配置会清除。另外,我们也可以通过写一个脚本实现桥接网络配置的一键清除,同样地编写一个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 "Unbridge Network..."
    Set-VMSwitch WSL  -SwitchType Internal
    echo "reboot wsl..."
    wsl --shutdown
    wsl --cd ~ -e ls
    echo "`ndone"
    pause
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    最后

    通过这两个脚本,每次我们可以很轻松实现wsl虚拟网卡和window网卡桥接的建立和取消

    image-20220915094724660

    下一篇我们通过wsl和局域网中的小电脑进行ROS组网,实现一下远程调试!

  • 相关阅读:
    React Native 的手势和触摸事件
    在nvidia-docker容器中测试TensorFlow-Slim 训练图像分类模型
    运行django
    C. Queries for the Array
    pyautogui模拟鼠标拖动选中文字的基本知识(附Demo)
    C++学习:类继承
    【等保常见问题解答】等保测评机构能帮忙做等保整改吗?
    二叉树:有了如此高效的散列表,为什么还需要二叉树?
    Debian11安装MySQL8.0,链接Navicat
    编译libigl笔记
  • 原文地址:https://blog.csdn.net/weixin_40599145/article/details/126865360