WSL 2 SSH에 대한 포트 전달을 설정하는 스크립트가 실패합니다.

WSL 2 SSH에 대한 포트 전달을 설정하는 스크립트가 실패합니다.

예전에는 SSH 스크립트를 사용하고 IP를 127.0.0.2로 설정하여 연결할 수 있었지만 이제는 시작할 때마다 더 이상 작동하지 않습니다. 왜 그런지 잘 모르겠습니다. localhost 또는 127.0.0.1을 시도했지만 작동하지 않습니다. localhost에서 웹사이트에 접속할 수 있습니다. WSL2를 호스팅하는 내 컴퓨터에서 SecureCRT를 통해 연결할 수 있는 포트 번호와 IP를 어떻게 얻나요?

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

WSL2를 호스팅하는 내 컴퓨터에서 SecureCRT를 통해 연결할 수 있는 포트 번호와 IP를 어떻게 얻나요?

아마도 나는 당신의 질문을 크게 오해하고 있지만 이것은해야한다매우 간단하며 스크립트가 전혀 필요하지 않습니다.

연결하는 경우:

  • 에서WSL2를 호스팅하는 머신의 SecureCRT
  • 에게해당 머신의 WSL2 인스턴스

그런 다음 WSL2는 "localhost 전달"(빌드 18945 이후)이라는 기능을 제공합니다.이 웹사이트.

당신이 사용하고 있는 스크립트는 더 이상 필요하지 않을 뿐만 아니라 몇 년 전에 bash.exe훨씬 더 유연한 명령으로 대체된 명령을 사용하기 때문에 분명히 매우 오래된 것입니다. wsl.exe한동안 Microsoft는 bash.exe"역사적 명령"으로 나열했지만 최신 문서에서는더 이상 사용되지 않는 것으로 표시되어 있습니다..

어쨌든 핵심 질문에 관해서는WSL 문서:

Linux 배포판에서 네트워킹 앱(예: NodeJS 또는 SQL 서버에서 실행되는 앱)을 구축하는 경우 일반적으로 하는 것처럼 localhost를 사용하여 Windows 앱(예: Edge 또는 Chrome 인터넷 브라우저)에서 액세스할 수 있습니다. ).

그러나 이전 버전의 Windows(빌드 18945 이하)를 실행하는 경우 Linux 호스트 VM의 IP 주소를 가져오거나 최신 Windows 버전으로 업데이트해야 합니다.

이는 "앱 구축"뿐만 아니라 SSH와 같은 기존 앱/서비스에도 적용됩니다.

즉, localhostWindows에서 포트에 연결을 시도할 때 포트가 Windows 자체의 앱/서비스에 의해 바인딩되지 않은 경우 자동으로 WSL2의 해당 포트로 연결을 전달하려고 시도한다는 것입니다(모든 및 모든 인스턴스는 동일한 네트워킹 스택을 공유하기 때문입니다).

따라서 실제로 WSL2 인스턴스가 포트 2222에서 SSH를 실행하고 있다면~해야 한다localhost:2222추가 노력 없이 SecureCRT에서 에 연결할 수 있습니다 .

여기에는 몇 가지 이유가 있습니다.~ 아니다일하다:

  • %userprofile%\.wslconfig다음 과 같은 파일이 있는 경우localhost전달false명시적으로 (가능성 없음) 으로 설정됨

  • 로컬 호스트 전달은 Windows가 최대 절전 모드일 때마다 작동이 중지되는 것으로 알려져 있습니다. 최대 절전 모드는 Windows의 기본값인 "빠른 시작" 옵션에 의해 무의식적으로 실행될 수도 있습니다. 보다스택 오버플로에 대한 내 대답자세한 내용은.

그 외에는 (다시)~해야 한다복잡한 전달 스크립트 없이 작업할 수 있습니다.

관련 정보