局域网ssh连接wsl2配置与问题一站式解决(connection refused)

问题定位与解决

局域网机器ssh连接不上wsl2:

  1. 检查网络局域网机和宿主机的连通性
# 在局域网机powershell/cmd/terminal上运行
ping <windows IP>
# 发送成功则连通无问题,发送失败,检查两台机器之间的网络(路由器/IP设置等)

如何获取宿主机windows的ip:

# 在宿主机windows的powershell/cmd/terminal上运行
ipconfig
# 查看有外网连接的网卡的ip,一般是Ethernet
# 带wsl/virtual/default switch的一般是wsl的虚拟网卡
  1. 检查宿主机与wsl2的连通性
# 在宿主机windows上运行,注意此处指的是sshd_config中开放的端口
ssh <id>@<wsl2_ip> -p <port2>
# 连接成功则无问题,连接失败可尝试重启甚至重装wsl2的ssh服务
# 在windows上运行:
wsl --shutdown
wsl
# 在wsl2上运行:
sudo service ssh restart
  1. 检查wsl2与外网的连通性
# 在wsl2中运行:
ping baidu.com
# 若能正常显示连接时间,则正常;若连接超时或失败,参考[链接](https://blog.csdn.net/gaopan20080808/article/details/116141003)
  1. 检查防火墙的开放性 最容易出问题
    关闭所有防火墙,尝试连接,如果能连接上,则根据本文Step2.2部分重新设置防火墙的入站规则。
  2. 检查端口转发的规则设置 第二容易出问题
    本文涉及两个不同的端口设置,一个是外机连接本机的端口,一个是本机连接wsl2的端口,注意区分。
# 查看端口转发列表
netsh interface portproxy show all
# 查看windows正在监听的端口,应该能看到所设定的端口正在被LISTENING
netstat -ano -p tcp
  1. 无脑终结式清理windows的网络配置
# 在windows上运行:
wsl --shutdown
netsh winsock reset
netsh int ip reset all
netsh winhttp reset proxy
ipconfig /flushdns

下面的内容是完整的配置方法。

一、在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 @ -p 3456

如果能连接成功,则表明wsl2中的sshd服务已经安装好且配置成功。

Step 2.1 设置端口转发

再测试一下在windows中通过localhost连接wsl2:

ssh @localhost -p 3456

如果能够连接成功,可以尝试以下的配置方式:

# listenport= 是指其他机器连接到本机所用的端口,本文章中设置为1758
# connectport= 是指本机连接到本机wsl2所用的端口,本文章中设置为3456
# 格式如下:
# netsh interface portproxy set v4tov4 listenport= connectport= 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

如果无法连接成功,可以使用以下的配置方式:

  1. 在方便的位置新建一个文本文件,输入以下内容:
# 启动wsl2,启动wsl2中的sshd
wsl.exe sudo /etc/init.d/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端口
# listenport= 是指其他机器连接到本机所用的端口,本文章中设置为1758
# connectport= 是指本机连接到本机wsl2所用的端口,本文章中设置为3456
# 格式如下:
# netsh interface portproxy set v4tov4 listenport= connectport= connectaddress=$wsl_ip
netsh interface portproxy set v4tov4 listenport=1758 connectport=3456 connectaddress=$wsl_ip
  1. 重命名该文本文件为.ps1,且在每次重启后使用管理员身份运行一次该文件(注意在cmd里运行会直接打开文件,因此需要在powershell中运行)

Step 2.2 设置防火墙入站规则

# name可以自己起,localport是上一步中设置的listenport/
# 也即是其他机器连接到本机所用的端口,本文章中设置为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

你可能感兴趣的:(排障,指南,ssh,linux,bash)