当前位置:   article > 正文

win11电脑通过ssh远程连接另一台windows电脑的wsl2方案成功实践,并实现vscode远程调用其他电脑算力跑深度学习代码。_wsl2远程访问

wsl2远程访问


可以先看总结,熟悉一下整个配置流程
如果是win系统电脑远程连接linux服务器的话,直接省略端口转发步骤即可

一、配置情况

  • 使用电脑:Win11 ;操纵系统版本:22631.3593;Ubuntu版本:Ubuntu-20.04
  • 被远程电脑:Win10;操作系统版本:19045.4474;Ubuntu版本:Ubuntu-20.04

我需要用我自己的win11电脑远程控制另外一台win10电脑,下文分别用win11和win10代替两台电脑的名称,来区别远程和被远程的关系

两台电脑均可以实现wsl2的安装,具体安装教程见微软官网教程,或者CSDN其他的安装教程
建议流程:

  • wsl --install安装WSL,默认安装的是Ubuntu,没指定版本
  • wsl --list --online查看Ubuntu版本列表
  • wsl --install -d Ubuntu-20.04 安装本文所用的Ubuntu版本
  • wsl -l -v查看版本是否安装正确

下图显示安装成功
在这里插入图片描述

二、远程连接中出现的报错

本问在配置远程连接的过程中,一共出现下面三种报错:

1.Permission denied, please try again.

具体原因远程连接没有输入端口号。具体情况是:使用ssh <id>@<win_ip>进行远程连接出现此报错,然后使用ssh <id>@<win_ip> -p <port2>成功连接,port2是在端口转发设置中设置的端口号。

2.kex_exchange_identification: read: Connection reset

这种情况就是网络问题,你要时刻保持被远程电脑的终端是开启的或者是ubuntu是运行的。具体情况:被远程电脑的终端关闭,远程链接不上并出现此报错,重新打开被远程电脑的终端,并运行WSL2的Ubuntu,远程链接成功。

3.SSH连接服务器时,返回time out或者无法访问目标主机排错步骤及其解决方案!

具体原因就是没有设置端口转发,可参考此链接解决,或者按照本文的流程去设置端口转发。

针对上述报错,按照本文章的流程可以避免

三、安装SSH

两台电脑都需要安装

  • 更新apt
  • 安装SSH
sudo apt-get update
sudo apt-get install openssh-server
  • 1
  • 2
  • 确保SSH在运行
sudo service ssh status
  • 1

在这里插入图片描述

四、WSL网络设置

参考链接
wsl2默认的网络模式是NAT模式,不方便和外部主机的互相访问,尤其是当Windows上的容器服务需要暴露给外部主机访问时,因此需要修改网络模式。
在这里插入图片描述
上图可以看到wsl2与外界通信需要通过宿主机进行转发,宿主机和wsl2之间存在有一个虚拟局域网,虚拟网卡WSL和虚拟网卡eth0之间由于在同一个网段,所以能够互相通信。wsl2需要访问外部网络时,需要先发往宿主机的虚拟网卡,然后由宿主机的物理网卡将请求转发出去。
获取win的ip在powershell里面输入ipconfig,获取wsl2的ip在Ubuntu里面输入ifconfig,结果如下图所示
在这里插入图片描述
如果wsl2上存在某个服务,暴露8989端口对外部提供服务。由于wsl没有外网ip,且wsl2的ip是经由宿主机使用网络地址转换技术(NAT)才得以访问局域网的,这隐藏了wsl2,保证了虚拟局域网的安全性,同时也使得局域网其它主机无法直接访问wsl2上的服务。

当前有3种方式可以实现wsl2和局域网内主机的互通,端口转发、 桥接网络 或者 镜像网络。

后两种方法只能在win11电脑中使用,我的被远程电脑是win10,因此我们只使用第一种方法
具体实践如下:

1. 先配置SSH

本文使用的端口是 8989 因此需要进行以下配置:

  • 更改sshd的配置
    这一步需要用到vim命令,可查询相关的vim教程
# 更改sshd的配置
sudo vi /etc/ssh/sshd_config
  • 1
  • 2

打开文件后会发现很多内容前面都有一个#,我要把需要用的内容的前面的#删除,即取消注释,并做相应的更改。
取消对应注释且更改对应设置如下:

# 端口默认是22,可以改为指定的端口,此处改成8989
Port 8989
ListenAddress 0.0.0.0
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

PasswordAuthentication yes
PermitRootLogin yes
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 重启SSH服务
# 重启ssh服务
sudo service ssh restart
  • 1
  • 2

2. 设置端口转发

  • 设置主机端口映射到wsl2的端口
# 添加端口转发规则,把wsl_ip替换成你在Ubuntu中ifconfig查找到的的ip。
netsh interface portproxy add v4tov4 listenport=8989 listenaddress=0.0.0.0 connectport=8989 connectaddress=<wsl_ip>
  • 1
  • 2
# listenport=<port1> 是指其他机器连接到本机所用的端口,本文章中设置为22
# connectport=<port2> 是指本机连接到本机wsl2所用的端口,本文章中设置为8989
# 格式如下:
# netsh interface portproxy set v4tov4 listenport=<port1> connectport=<port2> connectaddress=127.0.0.1
netsh interface portproxy set v4tov4 listenport=22 connectport=8989 connectaddress=127.0.0.1

# 查看端口转发列表,检查刚刚有无设置成功
netsh interface portproxy show all
# 查看windows正在监听的端口,应该能看到所设定的端口1758正在被LISTENING
netstat -ano -p tcp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

我设置好的端口转发列表如下:
在这里插入图片描述

3. 防火墙设置入站规则

我是直接把防火墙都关闭了,所以没有进行这一步的设置,但是这一步的设置也不难,可以参照教程一步一步来。也可以根据代码进行一键设置。

# name可以自己起,localport是上一步中设置的listenport/<port1>
# 也即是其他机器连接到本机所用的端口,本文章中设置为22
netsh advfirewall firewall add rule name="WSL2" dir=in action=allow protocol=TCP localport=22
  • 1
  • 2
  • 3

也可以借助此文的方法进行防火墙的设置

4. 重启测试连接情况

wsl --shutdown
wsl
sudo service ssh restart
  • 1
  • 2
  • 3

五、网络连通性检查

1.检查网络局域网和win10电脑的连通性

  • 打开win10电脑的powershell,输入ipconfig获取IP地址
# 在宿主机windows10的powershell/cmd/terminal上运行
ipconfig
# 查看有外网连接的网卡的ip,一般是Ethernet
# 带wsl/virtual/default switch的一般是wsl的虚拟网卡

# 在宿主机Ubuntu上面运行
ifconfig
# 查看wsl2的ip
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
在这里插入图片描述

# 这里的ip是宿主机WIN10电脑上的ip
# 在win11机器上的powershell/cmd/terminal上运行
ping <windows IP>
# 发送成功则连通无问题,发送失败,检查两台机器之间的网络(路由器/IP设置等)
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述

2.检查Win10电脑和自身wsl2的连通性

# 在宿主机windows10上运行,注意此处<port2>指的是sshd_config中开放的端口
ssh <id>@<wsl2_ip> -p <port2>
# 连接成功则无问题,连接失败可尝试重启甚至重装wsl2的ssh服务
# 在windows上运行:
wsl --shutdown
wsl
# 在wsl2上运行:
sudo service ssh restart

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.检查wsl2与外网的连通性

# 在wsl2中运行:
ping baidu.com
# 若能正常显示连接时间,则正常;若连接超时或失败,参考[链接](https://blog.csdn.net/gaopan20080808/article/details/116141003)
  • 1
  • 2
  • 3

参考链接1参考链接2

六、远程连接

打开win11电脑的Ubuntu或者powershell都行,输入:ssh <id>@<win_ip> -p <port2>

  • 注意这里的win_ip不是宿主机win10电脑中WSL的ip,而是前面获取的windows自己的ip,即通过在win10电脑里面在powershell上通过ipconfig命令获取的ip
  • 之前没加后面的端口号(prot2),导致一直报错:Permission denied, please try again.

在这里插入图片描述
然后输入密码,和你在Ubuntu中sudo命令需要输入的密码是一样的(这里的密码和你在下载安装Ubuntu时已经设置的账户密码是一致的),出现如下界面,表明连接成功。

在这里插入图片描述

七、vscode远程链接

首先要在被远程电脑里面配置好anaconda

1.配置VScode,添加WSL插件,VScode中连接WSL环境

启动VScode,添加WSL插件
在这里插入图片描述

2.安装远程开发插件Remote Development和SSH

在这里插入图片描述
安装完成后,vscode左侧多出了一个菜单栏,我们点击配置按钮配置远程服务器的地址。选择SSH Targets。我的是汉化版,选择远程(隧道/SSH)

在这里插入图片描述
这时候边栏多了远程连接的图标,你可以点加号添加新的连接,也可以点那个齿轮调整config文件(建议)。实际上加号连接的东西也会问你记录在哪个config里面。至于选那个config,第一个就行了(建议),其他的好像也能用。加号的添加方式按照里面的提示填就行了。Host 相当于你的昵称,HostName是你的服务器ip地址,User是你服务器上的用户名。还要再添加一个Port,之前映射的端口。config文件设置好之后,记得ctrl+s保存即可,

Host ubuntu20.04  #你随便取
    HostName 192.000.0.000  #填你在win10电脑上面ipconfig获取到的ip即可
    Port 8989 # 填之前端口转发设置的<port2>
    User xiaoming     #ssh <id>@<win_ip> -p <port2>,Ubuntu前面的id
  • 1
  • 2
  • 3
  • 4

不知道用户名可以通过在powershell里面输入whoami获取
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
下面就跟在终端里面远程连接一样
在这里插入图片描述
此时你的vscode就工作在远程服务器中了,让我们来打开一个文件夹:
在这里插入图片描述
点击后就打开了家目录,此时我们就可以像平常那样直接用vscode的资源管理器来管理我们的文件了。如果我们想要打开远程服务器的shell,那么可以像在本地那样直接在终端中打开就好了:
在这里插入图片描述

八、总结

要想在两台win系统的实现远程连接运行深度学习代码,而又不想直接远程控制电脑桌面,可以通过以下流程实现:

1.在两台电脑上面都安装WSL2,并安装相应版本的Ubuntu系统
2.配置安装anaconda
3.安装ssh
4.配置ssh
5.在被远程电脑上面设置WSL2的端口映射
6.检查远程电脑之间的网络连通性
7.使用ssh <id>@<win_ip> -p <port2>进行远程连接

参考

局域网ssh连接wsl2配置与问题一站式解决(connection refused)
WSL2设置桥接网络及高级设置
windows下使用vscode远程连接Linux服务器进行开发

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/957040
推荐阅读
相关标签
  

闽ICP备14008679号