프로젝트 진행 중 WSL2로 열은 서버에서 외부와 연결이 되지 않아서 이를 해결한 방법을 기록하고자 합니다.
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를 예시로 쓴다는 점을 알려드립니다.
$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
로 현재 접속되어 있는 네트워크를 확인한 다음 연결을 시도 하면 됩니다.