Мой сценарий для настройки переадресации портов на WSL 2 SSH не работает
Раньше я мог подключиться, используя сценарий SSH и установив IP-адрес 127.0.0.2, но теперь он больше не работает при каждом запуске. Я не уверен, почему. Я пробовал локальный хост или 127.0.0.1, но не работает. Я могу получить доступ к веб-сайтам на локальном хосте. Как мне получить номер порта и IP-адрес, к которому я могу подключиться через SecureCRT на моем компьютере, на котором размещен WSL2?
try {
## Port forward WSL virtual machine ports to host firewall for remote access
## !! this script must be run as Administrator !!
## powershell -executionpolicy bypass -file "c:\docker\WSL-portproxy.ps1"
## ip -o -4 -f inet addr show eth0 | awk '{ split($4, ip_addr, "/"); print ip_addr[1]; }'
## print out is "4: eth0 inet 172.20.x.x/20 brd ..." string
$remoteport = bash.exe -c "ip -o -4 -f inet addr show eth0";
$remoteport = ($remoteport -split "\s+")[3];
$remoteport = $remoteport.substring(0, $remoteport.LastIndexOf("/"));
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if(!$found){
echo "WSL ip address not found";
exit;
}
echo "WSL ip address $remoteport";
# Port forwards from WSL virtual machine to Win10 host firewall
# Bind a specific host ip addr or use 0.0.0.0 default
$ports=@(2222);
$addr='127.0.0.2';
# Remove firewall exception rules, add inbound and outbound rules
$ports_a = $ports -join ",";
echo "Firewall inbound/outbound rules";
iex "Remove-NetFireWallRule -DisplayName 'WSL Firewall Unlock' ";
iex "New-NetFireWallRule -DisplayName 'WSL Firewall Unlock' -Description 'Remote access to WSL services' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL Firewall Unlock' -Description 'Remote access to WSL services' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";
for( $i = 0; $i -lt $ports.length; $i++ ){
$port = $ports[$i];
echo "portproxy ${addr}:${port} to ${remoteport}:${port}";
iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}
# Do your script's stuff
}
catch
{
Write-Error $_.Exception.ToString()
Read-Host -Prompt "The above error occurred. Press Enter to exit."
}
Удалось настроить его с помощью этого, но он больше не работает.
Я получаю следующую ошибку:
C:\Users\admin\Downloads\f.ps1 : System.Management.Automation.RuntimeException: You cannot call a method on a
null-valued expression.
at System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception
exception)
at System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame)
at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
At line:1 char:91
+ ... tionPolicy -Scope Process Bypass }; & 'C:\Users\admin\Downloads\f.ps1'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,f.ps1
1 ответ
Как мне получить номер порта и IP-адрес, к которому я могу подключиться через SecureCRT на моем компьютере, на котором размещен WSL2?
Возможно, я совершенно неправильно понимаю ваш вопрос, но это должно быть очень просто и вообще не требовать сценария.
Если вы подключаетесь:
- Из SecureCRT на компьютере, на котором размещен WSL2.
- К экземпляру WSL2 на этом компьютере
Затем WSL2 предоставляет функцию, известную как «переадресация локального хоста» (начиная со сборки 18945, согласно этому веб-сайту.
Сценарий, который вы используете, очевидно, очень старый, и не только потому, что он вам больше не нужен, но и потому, что он использует команду, которая была заменена гораздо более гибкойwsl.exe
тоже несколько лет назад. Некоторое время Microsoft перечислялаbash.exe
как «историческая команда», но в последнем документе она помечена как устаревшая.
В любом случае, что касается вашего основного вопроса, согласно документу WSL:
Если вы создаете сетевое приложение (например, приложение, работающее на сервере NodeJS или SQL) в своем дистрибутиве Linux, вы можете получить к нему доступ из приложения Windows (например, интернет-браузера Edge или Chrome), используя localhost (так же, как вы обычно это делаете). ).
Однако если вы используете более старую версию Windows (сборка 18945 или ниже), вам потребуется получить IP-адрес виртуальной машины узла Linux (или обновить ее до последней версии Windows).
Это относится не только к «созданию приложения», но и к существующим приложениям/сервисам, таким как SSH.
Это означает, что при попытке подключения кlocalhost
порт в Windows, если порт не привязан к приложению/службе в самой Windows, он автоматически пытается перенаправить соединение на этот порт в WSL2 (любой и все экземпляры, поскольку они используют один и тот же сетевой стек).
На самом деле, если ваш экземпляр WSL2 использует SSH на порту 2222, вы просто сможете подключиться из SecureCRT кlocalhost:2222
без каких-либо дополнительных усилий.
Есть несколько причин, по которым это может не сработать:
Если у тебя есть
%userprofile%\.wslconfig
файл с явно установленным значением localhostForwardingfalse
(вряд ли)Известно, что переадресация локального хоста перестает работать всякий раз, когда Windows переходит в спящий режим. Спящий режим также может быть неосознанно запущен опцией «Быстрый запуск», которая используется в Windows по умолчанию. Дополнительную информацию смотрите в моем ответе о переполнении стека .
Кроме этого, он (опять же) должен работать без каких-либо сложных сценариев пересылки.