首页 > 系统相关 >Windows子系统(WSL)通过桥接网络实现被外部局域网主机直接

Windows子系统(WSL)通过桥接网络实现被外部局域网主机直接

时间:2023-07-24 17:57:58浏览次数:46  
标签:wsl 桥接 网络 dev WSL 网卡 Windows

实现方法

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

 

1、开启hyper-v

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

 

2、桥接网络

WSL2 默认采用了一个 NAT 网络,这对于大多数情况而言都是没有问题的,但是如果想要把 WSL 中的服务直接暴露出来,就不得不考虑做端口转发等问题。以及如果要使用 IPv6,自带的 NAT 方案也不能满足。

因此,这种时候如果能让 WSL2 使用直接接在 NIC 上自然是最好的,可惜 Windows 中没有直接提供这样的配置选项,如果在 Hyper-V 管理器中配置 WSL 网卡为外部网络则会直接报错。

万幸的是,可以使用 PowerShell 直接进行配置,本文则记录使用 PowerShell 让 WSL2 用上桥接网络的方法。

以下内容需要以管理员身份在PowerShell内执行。

一切开始之前首先需要启动 WSL,直接运行 wsl 即可,这样 WSL 的网卡才会被自动创建出来。

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

桥接网卡输入以下代码:

Set-VMSwitch WSL -NetAdapterName 以太网

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

 

3、手动修改WSL网络

接下来进入 WSL 配置 IP 地址和网关,假设WSL的有线网络为eth0,网关为 192.168.1.1,IP 设置为 192.168.1.150/24:

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

接下来更新名称解析服务器地址,执行 nano /etc/resolv.conf,修改其中内容为 nameserver 192.168.1.1,然后按 Ctrl+X保存退出即可。

 

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=192.168.148.64
brd=192.168.148.255
gateway=192.168.148.1
nameserver=192.168.148.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_ip、brd、nameserver、gateway、net_dev分别修改为实际想要设定的值,另外将echo "password" | 中的password替换为wsl的用户密码。

2、powershell桥接网络脚本
在windows中新建一个ps1文件,例如wsl-bridge-on.ps1(ps1是powershell的脚本,其脚本语言和以前的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;

然后随意执行一条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.ps1和wsl-bridge-off.ps1这两个脚本,在打开方式中选择其它应用,找到powershell安装路径下的可执行文件pwsh.exe,勾选始终使用此应用打开.ps1文件,这样就可以直接双击运行了。不过,默认情况下windows powershell不允许执行自定义脚本,所以需要修改设置打开执行权限。管理员方式打开powershell,执行Set-ExecutionPolicy Unrestricted 或 Set-ExecutionPolicy RemoteSigned ,按y确认即可

 

5、使用方法

需要桥接wsl网络的时候直接双击运行wsl-bridge-on.ps1,出现申请管理员权限的时候按是确认,然后等待脚本执行完毕即可。取消桥接则运行wsl-bridge-off.ps1,也是同样的流程。

标签:wsl,桥接,网络,dev,WSL,网卡,Windows
From: https://www.cnblogs.com/cheyunhua/p/17577895.html

相关文章

  • Windows在资源管理器地址栏输入不用鼠标快速启动程序
    Windows用户一般打开东西,都是双击某个图标,还有一种是在命令行启动。但是,还有一个地方可以直接启动,就是我们常用的资源管理器(在桌面上,以前叫我的电脑、计算机)的那个图标里,地址栏就可以直接输入。1.启动:VisualStudioCode(简称vscode)当输入v的时候,系统会自动搜索桌......
  • Windows多重连接问题
    先叙述我的问题出现情况:我在Windows域账号中使用smb连接Linux服务器的共享文件夹时报多重连接的错,报错具体信息:“不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。中断与此服务器或共享资源的所有连接,然后再试一次。”查找并测试过但不成功的方法:1.删除Windows......
  • 【Boost】Windows端使用 MSVC14.2 编译 Boost 并在 CMake 项目中使用
    Write2023.7.24关于boost在Windows下的使用gcc安装与CLion的配置,能够查到的英文资料都比较少,踩过坑后记录一下。MinGW安装BoostBoostDownload:https://www.boost.org/users/download/下载并解压在某个没有中文路径下的目录中在开始编译操作之前请把gcc添......
  • 在Windows上编译Pytorch 源码
    在Windows上编译PyTorch源码作为一名经验丰富的开发者,我将向你介绍如何在Windows上编译PyTorch源码。编译PyTorch源码可以帮助你获得更多的灵活性,以及对PyTorch内部机制的更深入的了解。下面是整个过程的步骤:步骤操作1安装Git2安装CMake3安装Python4克隆Py......
  • 如何在Windows中安装WinCC V8.0
    通常SIMATICWinCC的产品包装中包含三张光盘。以WinCCV8.0为例,分别是WinCCV8.0、SIMATICNETV18和additionalContent。其中,WinCCV8.0是基本的安装包,SIMATICNETV18提供了通讯所必须的驱动程序,AdditionalContent中提供了SQLSERVER的管理工具。安装时需要注......
  • 记录windows、vs2019、c++、cuda环境配置
    原文链接:   (45条消息)CUDA+Windows+VS环境配置_cudavs_哈哈哈哈哈嗝哈哈哈的博客-CSDN博客            VS2019--c++CUDA环境配置与编程实例-知乎(zhihu.com)测试代码:.cu文件中:#include"stdio.h"#include<cuda_runtime.h>#include<devi......
  • C#实现Windows中"用xxx打开"
    在Windows中,将文件用鼠标拖动到一个程序上面,会有一句小提示:用xxx打开(如下图)。 它本质上就是运行程序时,传递了一个文件路径的命令行参数。相当于这样的命令:program.exefile_path 其中"program.exe"就是打开此文件用的程序,"file_path"参数就是拖过去......
  • windows11中访问ubuntu双系统文件目录
    1、下载linuxreader(免费版)AccesstoExt2/3/4,HFSandReiserFSfromWindows|DiskInternals2、安装打开后找到ubuntu分区 3、想保存什么文件右键Save就行了 ......
  • WINPE(Windows Preinstallation Environment)是一个基于Windows操作系统的轻量级预安装
    WINPE(WindowsPreinstallationEnvironment)是一个基于Windows操作系统的轻量级预安装环境。它主要用于系统部署、故障排除、数据恢复和维护等任务。以下是一些常见的WINPE版本:WindowsPE2.0:也称为Vista版,基于WindowsVista操作系统。具有较高的兼容性,并提供了各种工具和驱动程序......
  • 在windows平台使用Visual Studio 2017编译动态库并使用
    使用VSstdio制作顺序表的库文件.lib与.dll区别lib是编译时需要的dll是运行时需要的1、新建头文件和源文件SeqList.h//SeqList.h#ifndefSEQLIST_H__#defineSEQLIST_H__#defineN10typedefintSLDataType;typedefstructSeqList{ SLDataTypedata[N]......