WSL2【一键配置脚本】配置SSH,及Windows宿主机配置好端口转发

本文介绍了一种方法,通过在WSL2中创建一键脚本配置SSH,同时在Windows端设置开机自启脚本来保持跨系统端口转发的一致性,解决了每次计算机重启后WSL2 nameserver变化导致的重复配置问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

如题,这是一个有点tricky的事情,目前网上有很多教你如何配置的文章。

但是随着每次重启计算机,WSL2的nameserver都会变,难道每一次都需要重新配置一遍吗?

我不!

故催生了本文

WSL端

第一次在WSL1/2使用ssh时,需要做如下配置,方便起见综合成了一个一键脚本(只需要配置一次
注意!下文所更改的端口号是 2234,也就是说WSL端监听的端口号是2234,而不是默认的22了。你可以改成你喜欢的数字。

# 在WSL2中运行的一键脚本
sudo apt remove openssh-server -y #卸载 ssh 服务
sudo apt install openssh-server -y # 重装 ssh 服务

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 备份
sudo sed -i 's/#Port 22/Port 2234/g' /etc/ssh/sshd_config # 替换目标内容
sudo sed -i 's/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/g
' /etc/ssh/sshd_config 
sudo sed -i '/#PermitRootLogin prohibit-password/a\PermitRootLogin yes' sshd_config # 在某行下新增
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g
' /etc/ssh/sshd_config 

sudo service ssh restart

Windows端(powershell脚本)

每次计算机重启,都会改变WSL2的nameserver,所以每次计算机重启都需要重新配置一次Windows端的转发,即运行一次下述脚本即可。(可以把该脚本的运行加入到Windows的 任务计划 中设置为开机自启)
注意!

  • 下面所设置的 wsl2PORT 端口需要和上面WSL中监听的一致
  • 下面所设置的 wsl2Name 可以在 powershell 中使用 wsl -l 来查看
  • 下面设hi的 listenPORT是windows监听的端口,及远程访问这台Windows电脑时连接的端口
# 获取管理员权限
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) { 
    $arguments = "& '" + $myinvocation.mycommand.definition + "'"
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    Break
}

$wsl2Name = "ubuntu20-wsl2" # 设置WSL2镜像的名字
$wsl2PORT = 2234 # 设置WSL2中sshd中的端口
$listenPORT = 2224 # 设置windows监听的端口,访问windows该端口将转发给WSL2中的上面那个端口
# 获取WSL2的eth0的IP地址
wsl -d $wsl2Name sudo service ssh --full-restart
$wsl2inet = wsl -d $wsl2Name ifconfig | Select-String -Pattern "inet.*?(?<ip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}).*?net"
$wsl2ip = $wsl2inet.Matches[0].Groups.Item("ip").Value
# 设置windows到WSL2的端口转发
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=$listenPORT connectaddress=$wsl2ip connectport=$wsl2PORT

# 打开防火墙,放行外部访问本机的流量
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=$listenPORT

设置Windows任务计划

将使用Powershell执行该脚本加入到Windows的任务计划,以实现开机自启,这样就可以再也不用记得(考虑)这件事了。

把该脚本保存为 .ps1 文件,存放在任意地点。然很找到Windows的任务计划(开始菜单栏搜索“任务计划程序”),添加新的计划,触发器栏设置为开机启动。需要注意的是:

  1. 常规栏,给权限“使用最高权限运行”
  2. 操作栏,程序或脚本处填写 powershell 的位置:开始菜单栏搜索 powershell,右键打开其位置,右键powershell快捷方式打开其位置,将此时找到的powershell位置(应该是 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe )填写到该处。把本文的 .ps1 脚本文件的路径(比如笔者的是 C:\Application\AutoRun\重置WSL2IP.ps1)填写到下面那个空即可。

完成设置后可以右键任务计划启动试试,如果没问题的话,就可以试着SSH到WSL2上了。
在这里插入图片描述

最后

祝一切顺利~

### 配置 Windows 11 中 WSL2端口转发Windows 11 中配置 WSL2端口转发涉及多个步骤,主要包括启用 SSH 和设置端口映射规则。以下是详细的说明: #### 启用 WSL2 并安装 OpenSSH Server 为了允许外部设备通过网络访问 WSL2 实例中的服务,需要先确保已启用了 OpenSSH Server。 1. **更新并升级包管理工具** 打开 WSL2 终端并执行以下命令来更新和升级软件包: ```bash sudo apt update && sudo apt upgrade -y ``` 2. **安装 OpenSSH Server** 安装 OpenSSH Server 及其依赖项: ```bash sudo apt install openssh-server ``` 3. **启动并设置 OpenSSH 自动运行** 使用以下命令启动 OpenSSH 服务并将它设为随系统自动启动: ```bash sudo service ssh start sudo systemctl enable ssh ``` 4. **确认 SSH 正常工作** 查看当前监听的端口号以验证 SSH 是否正常运行: ```bash netstat -tuln | grep ssh ``` 默认情况下,OpenSSH 将绑定到 `localhost` 或者特定 IP 地址上的默认端口 (通常是 22)[^1]。 --- #### 设置端口转发规则 由于 WSL2 运行在一个轻量级虚拟机中,默认无法直接从外部网络访问其中的服务。因此需要手动创建端口转发规则。 1. **获取 WSL2 的内部 IPv4 地址** 在 WSL2 终端中输入以下命令查看分配给它的私有地址: ```bash ip addr show eth0 | grep 'inet ' ``` 输出类似于:`inet 172.x.x.x/xx scope global dynamic eth0`,记录下这个 IP 地址[^3]。 2. **使用 PowerShell 创建端口转发规则** 利用 Windows 提供的 `netsh` 工具完成端口转发配置。例如,如果希望将本地机器的 TCP 端口 22 映射至 WSL2 的相同端口,则可运行如下脚本(需管理员权限): ```powershell $wslIp = wsl hostname -I | awk '{print $1}' netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=$wslIp connectport=22 ``` 如果目标是其他自定义应用端口(如 HTTP 的 80 或 HTTPS 的 443),只需调整上述参数即可[^2]。 3. **持久化端口转发规则** 若要让这些更改在重启计算机后仍然有效,建议编写一个自动化脚本来重新加载必要的配置。具体做法参见引用材料描述的一键配置 PS1 脚本方法[^4]。 --- #### 测试连接 完成以上全部操作之后,尝试从另一台电脑或者同一局域网内的移动终端 ping 当前主机名/IP 地址以及指定开放端口,检验是否成功建立通信链路。 ```bash ssh username@<your-windows-ip> ``` 替换 `<your-windows-ip>` 为主机实际公网或内网 IP,并提供有效的用户名登录凭证。 --- ### 注意事项 - 确认防火墙未阻止所使用的端口。 - 对于动态变化的 WSL2 内部 IP 地址问题,可以通过固定 MAC 地址等方式解决。 - 推荐仅暴露必要最小范围的服务端口减少安全隐患。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值