[wsl2]MacOS/Win局域网ssh连接wsl2:Ubuntu24.04 LTS

article/2025/8/12 10:17:12

【wsl2】MacOS/Win局域网ssh连接wsl2:Ubuntu24.04 LTS

  • 保证使用的是微软应用商店中下载的Ubuntu发行版本,本文在配置时发现若使用docker所基于的ubuntu系统配置会失败。遂采用默认的子发行版本。
  • 写在前面
    • why wsl2?
    • win11的好处
  • 开始配置之前
    • 1. 确保宿主机和wsl2子系统能够ping通
      • 如何检查 WSL2 的 IP 地址?
    • 2. 确保第三方主机与宿主机ping通
  • 开始配置
      • 补充:一键化脚本与开机自启

保证使用的是微软应用商店中下载的Ubuntu发行版本,本文在配置时发现若使用docker所基于的ubuntu系统配置会失败。遂采用默认的子发行版本。

可以通过微软商店下载。也可以在更新wsl2至最新版后,使用命令安装

wsl -l -o
# 安装Ubuntu-24.04(推荐长期支持版本)
wsl --install Ubuntu-24.04# 设置默认WSL版本为2(若未设置)
wsl --set-default-version 2# 查看已安装的发行版
wsl -l -v# 将Ubuntu设为默认
wslconfig /setdefault Ubuntu-24.04

或请参考其他教程安装,本文默认你的子系统安装没有问题!


写在前面

why wsl2?

因为题主在跑python时,i9-13900K只调用了20%,使用wsl后可以使cpu跑满80%+。加速炼丹!
然而实验室电脑上还有同学需要使用matlab等其他工具,显然是不能卸载Windows的。
遂退而且其次使用WSL2.

win11的好处

如果你是win11,那么恭喜你,请你根据关键词:镜像网络mirrored wsl2搜索相关教程去实现局域网ssh连接。
如: https://blog.csdn.net/jyzjut/article/details/140079778

如何查看自己的windows系统版本:

# win + r 输入: winver

在这里插入图片描述
如果你和题主一样,不习惯用win11,仍然是win10(190xx.xxxx版本)的钉子户(好吧,现在题主已经卸载win拥抱macOS了,这是实验室的电脑),那么根据一些教程配置.wslconfig为mirrored
一定会报错!因为mirrored模式This is unfortunately by design. Mirrored networking is only supported on Windows 11!(Github找到的Issue)

开始配置之前

为了方便区分:装载ubuntu子系统的Windows称做宿主机,子系统称做wsl或wsl2子系统。

1. 确保宿主机和wsl2子系统能够ping通

WSL2默认的网络模式为NAT,什么是NAT?

核心作用:NAT 允许内部私有网络中的设备通过一个公共IP地址访问外部网络(如互联网)。
类比:想象你住在一栋公寓楼里,所有住户共用同一个对外地址(公网 IP),但每户有自己的房间号(私有 IP)。快递员只需将包裹送到公寓地址,再由管理员分发给具体房间。这就是 NAT 的工作方式。

如何检查 WSL2 的 IP 地址?

参考:https://www.cnblogs.com/SocialistYouth/p/16691035.html
上面的文章写的很好,强烈建议看完后继续阅读本文。

WSL2中运行:

ip addr show eth0  # 查看私有 IP(如 172.x.x.x)

在这里插入图片描述

Win终端中:

wsl hostname -I  # 获取 WSL2 的 IP 

在这里插入图片描述
OK,此时我们发现因为只有一个wsl2系统,所以是同一个ip地址。

那么这个类似的“公网IP”在哪里呢?
win终端运行ipconfig
在这里插入图片描述
WSL 172.25.224.1 就是给wsl系统分配的“公网ip”

wsl2 则可以理解为宿主机完整虚拟出来的一个完整的 Linux 虚拟机,拥有自己的逻辑上独立的网卡,也即拥有属于自己的独立网络栈。与 VMware 的 bridge 模式和 docker 的 macvlan 模式类似。

在这里插入图片描述

此时,按照正常思路,我们应该确保wsl2子系统172.25.233.221宿主机10.193.225.128相互之间能够ping通,如果ping不同,请参考 https://www.cnblogs.com/SocialistYouth/p/16691035.html

例如我的:
#宿主机终端:
ping 172.25.233.221
#wsl2执行
ping 10.193.225.128

保证他们都能ping通再继续!

2. 确保第三方主机与宿主机ping通

参考:https://www.crifan.org/windows_10_wifi_lan_cannot_be_pinged_by_mac/

题主是用自己的macOS去连接宿主机win下的wsl2,所以,这一步也十分关键。
保证你的设备和宿主机都在一个局域网下!

#验证
#macOS执行:
ping <宿主机ip>
#宿主机执行
ping <macOS ip>

这时候,我们发现一般都ping不通。为什么?防火墙!
此时,无脑关闭所有防火墙,尝试ping,一般都能ping通了。ping不通请检查是否手动设置过ip地址,如果不会设置的话,请恢复为dhcp方式获取ip地址,此外请检查以及物理连接是否通畅。
在这里插入图片描述
测试成功后,如果您不放心你的宿主机裸奔,请参考https://blog.csdn.net/hitzzq508/article/details/120576464进行防火墙设置。

开始配置

  1. wsl2安装openssh
apt update
apt install openssh-server

可选,即登录时,宿主机可使用:ssh root@<wsl-ip> 连接

#在wsl2中开启root用户远程访问
username@localhost:/$ sudo passwd root
New password: 
Retype new password:
  1. 配置openssh
sudo nano /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_keyPasswordAuthentication yes#取消注释并修改为yes
PermitRootLogin yes 

注意:此处的端口是宿主机(即安装wsl2的机器)连接wsl2的端口,与外界机器连接宿主机的接口不同。(当然,你也可以设置成同一个,为显区分,本文将设置为不同的端口号)
接下来,你会发现ubuntu22.04以上版本的系统不生效,端口还是22.具体关键词可以搜索ubuntu24.04 修改默认ssh端口失败

# 重启ssh服务
sudo service ssh restart #不生效~
# ubuntu 22.04及以上
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket  #这个是关键!
# 查看端口
sudo service ssh status

在这里插入图片描述

  1. 配置防火墙
# 宿主机终端或powershell中执行:
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound  -InterfaceAlias "vEthernet (WSL)"  -Action Allow
  1. 接下来,在宿主机win中测试ssh连接wsl2
    打开宿主机的终端或powershell:

    # 这里的3456就是上面设置的端口,可以设置为其他你习惯的端口号
    ssh <id>@localhost -p 3456
    # 例如我就是: ssh ronchy22@localhost -p 3456
    

    如果能够宿主机能够连接成功,可以尝试以下的配置方式,将外部连接的端口(如1758)映射到WSL2的SSH端口(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
    
    • listenaddress=0.0.0.0允许所有IP访问,若需限制可改为宿主机局域网IP
    • 若WSL重启导致IP变化,需动态获取IP(见步骤5解决方案)
  2. 在第三方如macOS测试ssh连接宿主机
    macOS终端中输入下列命令,并按照提示输入密码。

    # macOS terminal
    ssh <wsl2-usrname>@<宿主机ip> -p 1758
    # 例如我的:ssh ronchy22@10.193.225.128  -p 1758
    

    此时如果macOS终端报错:kex_exchange_identification: read: Connection reset
    那么,请在宿主机合适的地方,如C\User\username,或者桌面新建文本文档,并将后缀修改为.ps1,并以管理员权限运行,再次尝试连接,即可!

    $wsl_ip = (wsl hostname -I).Trim()
    netsh interface portproxy delete v4tov4 listenport=1758
    netsh interface portproxy add v4tov4 listenport=1758 connectport=3456 connectaddress=$wsl_ip
    
    • 此脚本动态获取WSL最新IP并更新转发规则
    • 权限问题:确保Windows防火墙允许1758端口入站 (即上面的防火墙设置)
    New-NetFirewallRule -DisplayName "WSL2_SSH" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1758
    

端口映射逻辑详解:
很多教程都是22对22端口,所以很容易把监听端口搞混淆.

  • 为何避免22对22端口? 冲突风险:Windows可能已占用22端口(如OpenSSH服务),导致转发失败
  • 清晰区分:
    • WSL内部端口:SSH服务实际监听的端口(如3456),需在sshd_config中设置。
    • 宿主机监听端口:外部设备连接的端口(如1758),通过netsh映射到WSL的3456
  • 映射关系示意图
    外部设备(Mac) --> 宿主机IP:1758 --> WSL IP:3456
    

通过以上步骤,可实现稳定的跨设备SSH访问WSL2服务!。若需长期使用,建议结合开机自启脚本和动态IP处理,避免手动维护!

补充:一键化脚本与开机自启

  1. 创建PowerShell脚本 保存为auto_forward.ps1(管理员运行)
Powershell
# 获取WSL动态IP
$wsl_ip = (wsl hostname -I).Trim()
# 删除旧规则,防止冲突
netsh interface portproxy reset
# 添加SSH端口转发
netsh interface portproxy add v4tov4 listenport=1758 listenaddress=0.0.0.0 connectport=3456 connectaddress=$wsl_ip
# 开放防火墙
if (-not (Get-NetFirewallRule -DisplayName "WSL2_SSH" -ErrorAction SilentlyContinue)) {New-NetFirewallRule -DisplayName "WSL2_SSH" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 1758
}
  1. 设置开机自启
    将脚本放入启动文件夹(Shell:Startup),或通过任务计划程序添加开机任务.

http://www.hkcw.cn/article/xorghxgraH.shtml

相关文章

JAVA游戏打手俱乐部护航小程序+APP+公众号+h5 源码游戏陪玩小程序系统

一、系统概述 JAVA 游戏打手俱乐部护航陪玩系统是一款集小程序、APP、公众号和 H5 于一体的综合性游戏陪玩平台。该系统凭借丰富多样的功能&#xff0c;为游戏玩家和陪玩师傅搭建了便捷的沟通桥梁。其主要功能包括精准分类、优惠券管理、我的团队、师傅申请入驻、师傅端抢单机…

使用Mac下载MySQL修改密码第一篇_数据库

Mac下载MySQL MySQL官网链接MySQL​​​​​​ 当进入到官网后下滑到community社区&#xff0c;进行下载 然后选择community sever下载 这里就是要下载的界面&#xff0c;如果需要下载之前版本的话可以点击archives&#xff0c; 可能会因为这是外网原因&#xff0c;有时候下…

【Mac 从 0 到 1 保姆级配置教程 08】- 快速配置 Neovim、LazyVim 以及常用开发环境,如果之前有人这么写就好了

文章目录 2. 安装 Neovim3. 安装 LazyVim3.1. 安装依赖3.2. 安装 LazyVim3.3. 问题修复 4. 配置 LazyVim4.1. 基础知识4.2. 内置快捷键4.3. 自定义快捷键4.4. 配置主题4.5. 配置 C/C 环境4.6. 配置 JSON 和 Markdown 5. 最后6. 参考资料7. 系列教程 Mac 从 0 到 1 保姆级配置教…

Android SMS发送技术指南

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;本文详细介绍了在Android平台上如何使用编程接口&#xff08;API&#xff09;发送短信&#xff0c;包括 SmsManager 类的使用、调试技巧和设备兼容性处理。通过实例代码展示了如何实现文本消息的发送&#xf…

AndroidStudio创建Android虚拟机教程

前言 在 Android 开发的世界中&#xff0c;拥有一个可靠且灵活的测试环境是至关重要的。Android Studio 提供了虚拟设备&#xff08;AVD&#xff09;管理器&#xff0c;这是一个强大的工具&#xff0c;允许开发者创建自定义的虚拟设备来模拟不同的 Android 设备。通过 AVD&…

uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数

uniapp 小程序 web-view 打开H5页面传参以及调用postMessage回传参数 uniapp 运行微信小程序&#xff0c;在小程序内利用 web-view 打开H5页面进行数据流转的总结。 首先做点准备工作&#xff0c;官网明确的说了小程序是不支持本地的&#xff0c;那怎么进行调试呢&#xff0c;…

mac 下载nvm

先在终端查看是否安装brew brew -v显示版本&#xff0c;开始下一步&#xff0c;如果不显示版本&#xff0c;则需要先安装brew 安装brew 使用brew安装nvm 执行安装命令 brew install nvm配置环境变量 配置环境变量之前&#xff0c;先查看nvm下载的位置 brew list nvm这是…

Android的uid~package~pid的关系

UID &#xff1a; Linux 系统级用户标识&#xff0c;Android 中每个应用安装时分配唯一 UID&#xff08;如 1000&#xff09;。 Package&#xff1a; Android 应用包名(例如android)&#xff0c;一个 UID 可关联多个 Package&#xff08;共享 UID 场景如android:sharedUserI…

Rust 学习笔记:发布一个 crate 到 crates.io

Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io提供有用的文档注释常用标题文档注释作为测试注释所包含的项目 使用 pub use 导出一个方便的公共 API设置 crates.io 账户添加 metadata 到一个新的 crate发布到 c…

大白话 Seata 分布式事务浅析,详解TCC模式

大家好&#xff0c;我是此林。 说到分布式事务&#xff0c;第一时间想到 Seata&#xff0c;它支持多种事务模型&#xff0c;比如&#xff1a;XA模式、AT模式、TCC模式、Saga模式(长事务)。 其中 TCC 模式是高性能分布式事务解决方案&#xff0c;适用于核心系统等对 性能有很高…

超标量处理器设计6-指令解码

1. 指令缓存 指令缓存本质上是一个FIFO, 它能够将指令按照程序中指定的顺序存储起来&#xff0c;这样指令在解码的时候&#xff0c;仍然可以按照程序中指定的顺序进行解码。指令缓存是超标量处理器中必须的部件&#xff0c;其原因有两个&#xff1a; 1. 每周期可以取指的个数大…

技嘉华硕微星主板BIOS开启TPM模块教程

目录 一. TPM模块安装 二. 在BIOS开启TPM功能 华硕主板&#xff08;Intel平台&#xff09; 华硕主板&#xff08;AMD平台&#xff09; 技嘉主板&#xff08;Intel平台&#xff09; 技嘉主板&#xff08;AMD平台&#xff09; 微星主板&#xff08;Intel平台&#xff09; …

java基础知识

ASCII码 1. next() 示例​​ 读取一个字符串&#xff08;遇到空格或换行符停止&#xff09; 运行示例&#xff1a;​​ 输入: 张三 李四 输出: 张三 // 只读取了"张三"&#xff0c;"李四"留在输入缓冲区

【解决】【亲测下载obsidian可行】打不开github.com 或者 加速访问 github

Windows系统 基本思路&#xff1a;通过修改IP绑定来实现加速访问 1、hosts文件目录 C:\Windows\System32\drivers\etc\hosts2、修改内容 2.1 ping github.com 在Windows的cmd页面下直接输入&#xff1a; ping github.comPS&#xff1a;这一步只是看一下&#xff0c;没在后…

逆向入门(1)

前言&#xff1a; 本篇文章面向想入门逆向的新手小白。 NSSCTF和BUUCTF是两个刷题网站&#xff0c;知识点下面会有对应的题&#xff0c;大家可以自己试着做一下 NSSCTF:https://www.nssctf.cn/problem BUUCTF:https://buuoj.cn/challenges 1.看exe模式&#xff08;位数&am…

经典算法回顾之最小生成树

最小生成树&#xff08;Minimum Spanning Tree&#xff0c;简称MST&#xff09;是图论中的一个重要概念&#xff0c;主要用于解决加权无向图中连接所有顶点且总权重最小的树结构问题。本文对两种经典的算法即Prim算法和Kruskal算法进行回顾&#xff0c;并对后者的正确性给出简单…

Java八股文智能体——Agent提示词(Prompt)

这个智能体能够为正在学习Java八股文的同学提供切实帮助&#xff1a;不仅可以帮你优化答案表述&#xff0c;还能直接解答八股文相关问题——它会以面试者的视角&#xff0c;给出贴合求职场景的专业回答。 将以下内容发送给任何一个LLM&#xff0c;他会按照你提示词的内容&…

VScode编译调试debug,gpu的cuda程序,Nsight

进行下面操作的前提是&#xff0c;我们的环境已经能跑简单的CUDA程序了。 一、安装Nsight 二、创建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

飞牛fnNAS存储空间模式详解

目录 一、NAS的存储空间 二、多硬盘对NAS速度的提升原理 三、多硬盘对数据安全的提升原理 四、多硬盘对容量的提升原理 五、磁盘阵列模式 六、飞牛NAS支持的存储模式 七、具体如何选择存储空间模式 在数字化时代,数据是个人和企业发展的核心资产,但面临硬盘损坏、病毒…

vue3: baidusubway using typescript

项目结构&#xff1a; <!--npm install -D tailwindcss-3d BaiduSubwayMap.vue npm install -D tailwindcss postcss autoprefixer--> <template><div class"relative w-full h-screen"><!-- 地图容器 --><div id"subway-container…