Мой скрипт для настройки переадресации портов на WSL 2 SSH не работает

Мой скрипт для настройки переадресации портов на WSL 2 SSH не работает

Раньше я мог подключаться с помощью скрипта SSH и установки IP на 127.0.0.2, но теперь это больше не работает при каждом запуске. Я не уверен, почему. Я пробовал localhost или 127.0.0.1, но это не работает. Я могу получить доступ к веб-сайтам на localhost. Как мне получить номер порта и 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, согласноэтот сайт.

Скрипт, который вы используете, по-видимому, очень старый, не только потому, что он вам больше не нужен, но и потому, что он использует команду bash.exe, которая была заменена гораздо более гибкой 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файл сlocalhostПересылкаявно установлено false(маловероятно)

  • Известно, что переадресация Localhost прекращает работу, когда Windows переходит в спящий режим. Спящий режим также может быть непреднамеренно вызван опцией «Быстрый запуск», которая установлена ​​в Windows по умолчанию. Смотритемой ответ на Stack OverflowЧтобы получить больше информации.

Кроме этого, это (опять же)долженработа без сложных скриптов пересылки.

Связанный контент