我在 WIN10 计算机上的 WSL2 中运行 SSH 服务器。为了使其工作,我正在使用:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=172.19.237.178 connectport=22
这最初运行良好。172.19.237.178
是 WSL2 VM 的 IP。
只有一个问题。我已将 sshd 设置为在 PC 启动时运行,并且每次启动机器时 WSL2 都有不同的 IP。有没有办法将 WSL2 配置为使用静态 IP?
編輯:参见这个问题寻找一种确定 WSL 机器 IP 的解决方法。
答案1
WSL2 机器的 IP 地址不能设为静态,然而,可以使用wsl hostname -I
基于此,我能够创建以下 powershell 脚本,它将在我的 WSL 机器上启动 sshd 并将流量路由到它。
wsl.exe sudo /etc/init.d/ssh start
$wsl_ip = (wsl hostname -I).trim()
Write-Host "WSL Machine IP: ""$wsl_ip"""
netsh interface portproxy add v4tov4 listenport=22 connectport=22 connectaddress=$wsl_ip
我通过 visudo 将以下内容添加到我的 sudoers 文件中,以避免需要密码来启动 sshd
%sudo ALL=(ALL) NOPASSWD: /etc/init.d/ssh
最后,从管理 powershell 终端,我安排脚本在启动时运行
$trigger = New-JobTrigger -AtStartup -RandomDelay 00:00:15
Register-ScheduledJob -Trigger $trigger -FilePath C:\route_ssh_to_wsl.ps1 -Name RouteSSHtoWSL
答案2
该解决方案帮助我设置了我的 wsl 的静态 IP,请尝试:
在您的 Windows 主机上运行此命令:
netsh interface ip add address "vEthernet (WSL)" 192.168.99.1 255.255.255.0
在你的 wsl linux 机器上:
sudo ip addr add 192.168.99.2/24 broadcast 192.168.99.255 dev eth0 label eth0:1;
但是为了在重新启动系统后保留此 IP,您需要在启动脚本中设置这些命令。
答案3
无需使用脚本获取 ip,只需使用适用于 Windows 的 Openssh 服务器并将默认 shell 从 c:/system32/cmd.exe 更改为 c:/system32/bash.exe:
https://docs.microsoft.com/en-US/windows-server/administration/openssh/openssh_server_configuration
答案4
我没有足够的声誉来评论,所以我给出了自己的答案,但批准了 Nick 的答案(https://superuser.com/a/1619390/1023342) 对我来说是个好方法,除了一个小细节,对我来说wsl hostname -I
返回两个 IP(“IP1 IP2”)并且我想要第一个,然后我这样做:
$wsl_ip = (wsl hostname -I).split(" ")[0]
netsh interface portproxy add v4tov4 listenport=22 connectport=22 connectaddress=$wsl_ip