问题定位与解决
局域网机器ssh连接不上wsl2:
- 检查网络局域网机和宿主机的连通性
# 在局域网机powershell/cmd/terminal上运行
ping <windows IP>
# 发送成功则连通无问题,发送失败,检查两台机器之间的网络(路由器/IP设置等)
如何获取宿主机windows的ip:
# 在宿主机windows的powershell/cmd/terminal上运行
ipconfig
# 查看有外网连接的网卡的ip,一般是Ethernet
# 带wsl/virtual/default switch的一般是wsl的虚拟网卡
- 检查宿主机与wsl2的连通性
# 在宿主机windows上运行,注意此处<port2>指的是sshd_config中开放的端口
ssh <id>@<wsl2_ip> -p <port2>
# 连接成功则无问题,连接失败可尝试重启甚至重装wsl2的ssh服务
# 在windows上运行:
wsl --shutdown
wsl
# 在wsl2上运行:
sudo service ssh restart
- 检查wsl2与外网的连通性
# 在wsl2中运行:
ping
# 若能正常显示连接时间,则正常;若连接超时或失败,参考[链接](/gaopan20080808/article/details/116141003)
-
检查防火墙的开放性 最容易出问题
关闭所有防火墙,尝试连接,如果能连接上,则根据本文Step2.2部分重新设置防火墙的入站规则。 -
检查端口转发的规则设置 第二容易出问题
本文涉及两个不同的端口设置,一个是外机连接本机的端口<port1>,一个是本机连接wsl2的端口<port2>,注意区分。
# 查看端口转发列表
netsh interface portproxy show all
# 查看windows正在监听的端口,应该能看到所设定的端口<port2>正在被LISTENING
netstat -ano -p tcp
- 无脑终结式清理windows的网络配置
# 在windows上运行:
wsl --shutdown
netsh winsock reset
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns
-
netstat -ano指令查看发现计算机未监听当前端口
打开应用程序“服务”,重启iphelper服务。
下面的内容是完整的配置方法。
一、在wsl2中设置ssh
Step 1.1 卸载重装
# 先卸载重装系统自带的sshd
sudo apt-get remove openssh-server
sudo apt-get install openssh-server
Step 1.2 配置重启
# 更改sshd的配置
sudo vi /etc/ssh/sshd_config
取消对应注释且更改对应设置如下:
# 端口默认是22,可以改为指定的端口,此处改成3456
Port 3456
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
注意:此处的端口是宿主机(即安装wsl2的机器)连接wsl2的端口,与外界机器连接宿主机的接口不同。(当然,你也可以设置成同一个,为显区分,本文将设置为不同的端口号)
# 重启ssh服务
sudo service ssh restart
二、在Windows中设置端口转发与防火墙
先尝试一下在宿主机windows里ssh连接wsl2
# 这里的3456就是上面设置的端口,可以设置为其他你习惯的端口号
ssh <id>@<ip> -p 3456
如果能连接成功,则表明wsl2中的sshd服务已经安装好且配置成功。
Step 2.1 设置端口转发
再测试一下在windows中通过localhost连接wsl2:
ssh <id>@localhost -p 3456
如果能够连接成功,可以尝试以下的配置方式:
# listenport=<port1> 是指其他机器连接到本机所用的端口,本文章中设置为1758
# connectport=<port2> 是指本机连接到本机wsl2所用的端口,本文章中设置为3456
# 格式如下:
# netsh interface portproxy set v4tov4 listenport=<port1> connectport=<port2> connectaddress=127.0.0.1
netsh interface portproxy set v4tov4 listenport=1758 connectport=3456 connectaddress=127.0.0.1
# 查看端口转发列表,检查刚刚有无设置成功
netsh interface portproxy show all
# 查看windows正在监听的端口,应该能看到所设定的端口1758正在被LISTENING
netstat -ano -p tcp
如果无法连接成功,可以使用以下的配置方式:
- 在方便的位置新建一个文本文件,输入以下内容:
# 启动wsl2,启动wsl2中的sshd
sudo /etc//ssh start
# 因为每次重启wsl2的ip都会改变,所以获取wsl2的本次ip,并且保存在变量$wsl_ip中
$wsl_ip = wsl hostname -I
# 在控制台输出WSL Machine IP以供用户查看
Write-Host "WSL Machine IP: ""$wsl_ip"""
# 设置端口转发,将外部机器发送到宿主机1758端口的信息转发到wsl2的3456端口<port2>上
# listenport=<port1> 是指其他机器连接到本机所用的端口,本文章中设置为1758
# connectport=<port2> 是指本机连接到本机wsl2所用的端口,本文章中设置为3456
# 格式如下:
# netsh interface portproxy set v4tov4 listenport=<port1> connectport=<port2> connectaddress=$wsl_ip
netsh interface portproxy set v4tov4 listenport=1758 connectport=3456 connectaddress=$wsl_ip
- 重命名该文本文件为<name_you_like>.ps1,且在每次重启后使用管理员身份运行一次该文件(注意在cmd里运行会直接打开文件,因此需要在powershell中运行)
Step 2.2 设置防火墙入站规则
# name可以自己起,localport是上一步中设置的listenport/<port1>
# 也即是其他机器连接到本机所用的端口,本文章中设置为1758
netsh advfirewall firewall add rule name="WSL2" dir=in action=allow protocol=TCP localport=1758
Step 2.3 重启并测试连接情况
wsl --shutdown
wsl
sudo service ssh restart