目录:

  • 前言:
  • 实现原理:
  • 实现步骤
    • 1、开启hyper-v
    • 2、编写桥接网络powershell脚本
    • 3、编写网络配置脚本
  • 实现结果
  • 取消桥接
  • 最后

前言:

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

实现原理:

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

实现步骤

1、开启hyper-v

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

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 runasreturn
}
#首先随意执行一条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

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

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

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

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

实现结果

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

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

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

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

可以看到我们已经实现了把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 runasreturn
}
echo "Unbridge Network..."
Set-VMSwitch WSL  -SwitchType Internal
echo "reboot wsl..."
wsl --shutdown
wsl --cd ~ -e ls
echo "`ndone"
pause

最后

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

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

实现外网Ping通WSL(网卡桥接方式实现)相关推荐

  1. 虚拟机ping主机和外网ping不通的解决办法

    配置拷贝的centos的虚拟机[详细版] 由于自己虚拟机配置的不完全,部分功能实现不出来,所以拷贝了完全配置好的同学的虚拟机,但需要修改部分的参数才能正常使用,此文章参考老师所提供的办法和部分文章所提 ...

  2. CentOS ping本机ip,能ping通,外网ping不通

    [注]:下述操作过程是结合多种网络方法,然后自己实践的结果.写在这里,主要目的是加深记忆,也希望能帮助后来者 输入命令:ifconfig 查看ip和mac地址 [遇到的问题]ping 本机ip(192 ...

  3. 无法上外网, ping网关ping不通的解决——arp命令

    转自:http://jingyan.baidu.com/article/3c48dd34873909e10be35894.html 转自:http://man.linuxde.net/arp 用来管理 ...

  4. SHELL脚本:检测一坨IP是否都能ping通(网卡监控)

    工作快3年了,期间遇见过不少problems,每次都是上网搜之.解决了就算完了.也不曾写过什么文章.最近看见好多帖子提出的问题都是我曾遇见过的,但下面的回复却几乎都没有帮楼主解决问题.于是乎.我觉得我 ...

  5. flannel无法跨主机ping通容器的解决方式

    前几天,出现了无法跨主机ping通容器的情况,导致一个node机网络中断,无法访问,排查过程如下. 首先确认,宿主机node2是可以ping通容器 [root@node2 ~]# ping 10.1. ...

  6. 虚拟机pin不通外网pin不通百度的解决方式

    最近发现经常有同学会出现pin不同外网的情况,特地在此写出自己的解决方式,希望可以帮助到大家 第一.调整网络编辑器内部设置 1.1 在VM中选择编辑->虚拟网络编辑器 1.2 在虚拟网络编辑器中 ...

  7. 阿里云不同账号实现内网ping通

    (适用于同一区域,本例是均位于北京F区) 操作简述: 账户A创建云企业网,账户B.C.D加入 详细步骤 账户A下的操作 1.登录云企业网控制台 https://cen.console.aliyun.c ...

  8. 服务器无法ping通百度的处理方式

    问题描述: ping: www.baidu.com: Temporary failure in name resolution 处理方法: vim /etc/resolv.conf添加:nameser ...

  9. 关于vmware中的centos无法ping通宿主机或者是外网的解决思路

    centos安装使用有段时间了,突然就无法访问外网,宿主机当然是正常使用,网络畅通的,下面重新梳理一下centos的网络配置以及无法ping通宿主机或者是外网的解决思路. 桥接还是NAT模式? 桥接, ...

  10. 内网虚拟机静态IP设置VMWare内网通外网不通把某一网段白名单虚拟机ping不通主机虚拟机桥接改成非192.168网段服务器与电脑直连共享wifi

    首先关于虚拟机网络问题,先打开网络适配器,查看是否有vmware下载后的两个自带的虚拟网卡,网络和internet->更改适配器 可以看到VMnet1和VMnet8两个虚拟机网卡和wlan网卡以 ...

最新文章

  1. SpringBoot第七篇:springboot开启声明式事务
  2. mongo 时间格式化 查询_MongoDB中查询转换(将时间戳转变通用日期格式)
  3. [html] Form表单是怎么上传文件的?你了解它的原理吗?
  4. catia钣金根据线段折弯_钣金折弯如何确定折弯的顺序
  5. Delphi WebBrowser控件的使用
  6. Zabbix 监控Nginx连接的状态
  7. Stanford CS230深度学习(五)CNN和ResNet
  8. TDT2 多语言本文 4.0 版 TDT3 多语言本文 2.0 版
  9. .Net并行编程系列文章导航
  10. 关于大型网站技术演进的思考(十二)--网站静态化处理—缓存(4)
  11. Matlab多惯量仿真,两连杆机器鱼的简单建模以及MATLAB仿真
  12. 北理乐学C语言寻找特殊偶数,北理乐学C语言答案-最新教程.doc
  13. java回调函数(callBack)
  14. linux 时间戳几字节,字节转换跟时间戳转换
  15. vue验证码图片显示不出来,将图片转换为base64格式显示
  16. 撰写SCI论文好用的免费工具(上) - 易智编译EaseEditing
  17. 中专计算机专业包括哪些方面,中专计算机有什么专业?
  18. 漂亮的带搜索框蓝黄拼色网站404页面源码
  19. 使用TeamViewer远程连接Android手机并控制
  20. 阿里云 ECS 7 天实践训练营 - day01 -基于ECS搭建FTP服务

热门文章

  1. Keras天坑:想当然的对层的直接运算带来的问题
  2. 刘强东带到石头村什么宝贝?飞翔鸽、“村长刘”品牌、歌唱家!
  3. Kafka代码实现--from-beginning,读取历史未消费的数据
  4. 集成学习Bagging与Boosting的区别
  5. yum rpm 命令
  6. 计算机ppt制作教案,教案幻灯片制作
  7. 2021深圳入户新政策大变动(软考中、高级职称请留意)
  8. 4.(css3布局)使用flex布局携程网首页案例
  9. 工欲善其事,必先利其器
  10. 《智能搜索和推荐系统》总结