Windows 11 WSL2 Ubuntu子系统SSH服务配置与开机自启全攻略 1. 为什么要在WSL2中配置SSH服务很多开发者习惯在Windows系统上使用WSL2运行Ubuntu子系统进行开发工作。但直接使用Windows Terminal连接WSL2有个明显缺陷——每次重启电脑后WSL2的IP地址都会变化。这意味着如果你用VS Code的Remote-SSH插件连接WSL2每次重启后都要重新配置连接信息。我在实际开发中就经常遇到这个问题早上打开电脑准备继续昨晚的工作发现VS Code无法连接到WSL2需要先打开终端查看新IP再修改SSH配置非常影响工作效率。后来发现通过配置SSH服务并实现开机自启可以完美解决这个问题。更棒的是配置好SSH服务后你还能实现从局域网其他设备如iPad、备用电脑访问WSL2环境使用专业的SSH客户端如MobaXterm管理WSL2在WSL2中运行的服务如Jupyter Notebook可以通过端口转发暴露到局域网2. 安装与基础配置2.1 安装SSH服务组件首先打开WSL2的Ubuntu终端执行以下命令更新软件源并安装必要组件sudo apt update sudo apt upgrade -y sudo apt install openssh-server openssh-client -y这里有个小细节需要注意WSL2默认的Ubuntu镜像可能没有包含完整的systemd支持特别是较旧版本的Windows 11所以我们不能用常规的systemctl命令管理服务。不过别担心Ubuntu自带的service命令在WSL2中工作得很好。安装完成后先别急着启动服务我们需要先修改配置文件。用vim或nano打开SSH配置文件sudo vim /etc/ssh/sshd_config2.2 关键配置修改找到并修改以下配置项如果找不到就直接添加到文件末尾Port 2222 # 避免与Windows自带的SSH服务冲突 ListenAddress 0.0.0.0 PasswordAuthentication yes PermitRootLogin yes # 开发环境可以允许root登录生产环境建议设为no这里特别说明下端口选择Windows 10/11默认会在22端口运行OpenSSH服务所以WSL2的SSH服务最好改用其他端口比如2222。我在实际测试中发现如果不改端口两个服务会冲突导致连接失败。保存退出后可以首次启动SSH服务sudo service ssh start验证服务是否正常运行sudo service ssh status如果看到Active: active (running)的提示说明服务已经正常启动。3. 高级配置技巧3.1 解决WSL2 IP变动问题WSL2有个特性每次重启都会获得新IP。这会导致SSH客户端配置失效。我的解决方案是在Windows端创建一个update_hosts.bat脚本echo off setlocal enabledelayedexpansion for /f tokens* %%a in (wsl hostname -I) do set ip%%a echo 正在更新WSL2 IP: %ip% echo %ip% ubuntu-wsl2 %SystemRoot%\System32\drivers\etc\hosts把这个脚本设为管理员权限运行每次开机执行一次就能通过ubuntu-wsl2主机名稳定访问WSL2。3.2 密钥认证配置虽然密码登录很方便但更安全的做法是使用SSH密钥认证。先在Windows端生成密钥对ssh-keygen -t ed25519然后把公钥复制到WSL2中type $env:USERPROFILE\.ssh\id_ed25519.pub | wsl tee -a ~/.ssh/authorized_keys最后修改WSL2的文件权限chmod 600 ~/.ssh/authorized_keys chmod 700 ~/.ssh3.3 防火墙配置如果发现无法从局域网其他设备连接WSL2可能是Windows防火墙阻止了连接。需要添加防火墙规则New-NetFirewallRule -DisplayName WSL2 SSH -Direction Inbound -LocalPort 2222 -Protocol TCP -Action Allow4. 实现开机自启动4.1 创建启动脚本在Windows端创建wsl_ssh_start.bat脚本echo off wsl -u root -e /usr/sbin/service ssh start把这个脚本放到启动文件夹%AppData%\Microsoft\Windows\Start Menu\Programs\Startup。4.2 免密码sudo配置为了避免每次启动都输密码我们需要配置sudo免密码。在WSL2中执行sudo visudo在文件末尾添加替换your_username为你的实际用户名your_username ALL(ALL) NOPASSWD: /usr/sbin/service ssh start4.3 测试自启动重启Windows后打开任务管理器应该能看到wsl_ssh_start.bat进程。在WSL2中执行service ssh status确认服务已自动启动。5. 常见问题排查连接超时怎么办确认WSL2的SSH服务正在运行service ssh status检查Windows防火墙是否放行了2222端口尝试从WSL2内部连接自己ssh localhost -p 2222VS Code连接失败在VS Code的SSH配置中添加这几行Host wsl2 HostName ubuntu-wsl2 User your_username Port 2222 IdentityFile ~/.ssh/id_ed25519如何提高安全性禁用密码登录只允许密钥认证安装fail2ban防止暴力破解定期更新系统和SSH软件包我在三个不同的开发机器上部署过这套方案最久的一台已经稳定运行8个月。期间Windows系统多次更新WSL2也升级过几次但SSH服务始终保持可靠。唯一遇到的问题是某次Windows大更新后启动脚本的执行顺序变了导致SSH服务启动稍晚简单的解决办法是在脚本开头加个5秒延时。