Мой сценарий для настройки переадресации портов на 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 по умолчанию. Дополнительную информацию смотрите в моем ответе о переполнении стека .

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

Другие вопросы по тегам