WSL 2 외부 접속 허용

SungjoonAn·2022년 2월 25일
0

Django

목록 보기
8/12
post-thumbnail

프로젝트 진행 중 WSL2로 열은 서버에서 외부와 연결이 되지 않아서 이를 해결한 방법을 기록하고자 합니다.

WSL2 architecture overview

WSL(Windows Subsystem for Linux) 로 윈도우 내에서 Linux환경을 사용할 수 있는 시스템입니다. WSL은 1과 2로 나누어져 있는데 2는 1과는 다르게 Hyper-V 기반의 최신 가상화 기술을 이용하여 실제 리눅스 커널을 직접 탑재하였습니다. 실질적으로 차이점은 빠른 performance이외로 docker나 VScode가 호한이 가능하다는 점입니다. 특히 VScode같은 경우는 Linux에서 code .을 입력을 하면 VScode remote가 열리게 됩니다. 여기서 VScode remote는 WSL에서 원격 서버를 실행하도록 하는 VScode 내부의 확장입니다. 즉 UI만 Windows에서 작동하고, 그 이외는 모두 Linux에서 작동을 합니다.

하지만 이러한 Hyper-V기반으로 Linux가 가상환경에서 돌아가게 된다면 WSL내부에서 사용하는 별도의 가상 IP를 가지고 있습니다. 이 가상 IP는 Local PC를 재부팅을 할때마다 IP값이 변경이되고 별도의 WSL Port Forwarding을 해주는 작업을 해야지 외부에서 접속이 가능했습니다.

이를 몰랐던 저는 Frontend쪽에서 보낸는 것을 받지도 못했지만 이 이유조차 몰랐었습니다.
맙소사

이를 해결을 하기 위해서는 몇가지의 준비사항이 필요합니다. 첫번째로는 Port Forwarding을 해줄수 있는 script가 필요합니다.

인터넷 상에서 다양한 script들이 존재하는데 본문에는 제 시점에서 작동되는 script를 예시로 쓴다는 점을 알려드립니다.

  • powershell script 작성
$remoteport = bash.exe -c "ifconfig eth0 | grep 'inet '"
$found = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';

if( $found ){
  $remoteport = $matches[0];
} else{
  echo "The Script Exited, the ip address of WSL 2 cannot be found";
  exit;
}

#[Ports]
#All the ports you want to forward separated by coma
$ports=@(80, 1000,2000,3000,5000,8000,8002,8080);


#[Static ip]
#You can change the addr to your ip config to listen to a specific address
$addr='0.0.0.0';
$ports_a = $ports -join ",";


#Remove Firewall Exception Rules
iex "Remove-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' ";

#adding Exception Rules for inbound and outbound Rules
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

Powershell script같은 경우는 ports_wsl.ps1같은 예시 이름으로 저장해주고 $ports부분에는 Forwarding 원하는 port를 집어 넣기만 하면 됩니다.

Script실행을 위해서는 Windows PowerShell은 반드시 관리자 권한으로 실행해야 합니다.

실행을 완료를 하게되면 WSL 2 Firewall Unlock을 볼수가 있고 ipconfig로 현재 접속되어 있는 네트워크를 확인한 다음 연결을 시도 하면 됩니다.

  • 윈도우 스케줄러 등록
    위에서 언급했다 싶이 Port Forwarding해도 재부팅시 바뀌기 때문에 재부팅할 때마다 script을 실행해줘야 하는 번거로움이 있다. 몰론 불편하지 않으신 분들은 안해도 되는 프로세스이다.
    Window내에 작업 스케줄러로 들어가서 세부 세팅을 해주면 앞으로는 로그인시 자동으로 작업을 해줘서 사용자가 안해도 되는 이점이 있다.

참조

0개의 댓글