[WSL2] PortForwarding

김상웅·2022년 6월 17일
3

[Computer Science]

목록 보기
9/10
post-thumbnail

✅ WSL2


공식홈페이지
Linux용 Windowx 하위 시스템을 사용하면 개발자가 기존 가상 머신의 오버헤드 또는 듀얼 부팅 설정 없이 대부분의 명령줄 도구, 유틸리티 및 어플리케이션을 비록한 GNU/Linux 환경을 수정하지 않고 Windows에서 직접 실행할 수 있습니다......

자 다시 쉬운 말로,

Window에서 리눅스를 사용하면 Virtual Machine과 같은 도구로 개발 환경을 구성하거나, 듀얼 부팅을 설정해야했습니다.

하지만 WSL이 등장하면서 윈도우에서 복잡한 네트워크 설정 없이도 Linux 계열의 개발 환경을 구축할 수 있게 되었습니다.

속도도 훨씬 빨라졌고, 재부팅을 해야할 필요가 없어 Window를 사용하는 개발자에게 듀얼부팅을 하거나 Mac으로 바꿔야할 고민을 덜어줄 것입니다.

각종 가상머신, 듀얼부팅을 하지 않고도 윈도우 OS에서도 실제 Linux에서 개발하듯 두 OS를 가질 수 있다.



✅ PortForwading


외부 네트워크에서 Window(localhost)가 아닌 WSL에 접속하게 해준다.

WSL2는 Window 운영 체제를 Linux 게열의 운영체제로 바꾸는 것이 아닙니다.

Window 운영 체제를 사용하면서 Linux 운영 체제를 위에 덮어서 사용하는 것입니다.

Window와 Linux 운영체제가 분리가 되어있다는 말을 의미하고, 두 운영체제에 할당되는 IP4 주소도 달라지게 됩니다.

IP4 주소가 달라지면서 발생하는 문제점은 다음과 같습니다.

1. 우리가 만든 서비스를 배포하기 이전까지 외부 컴퓨터에서 접속할 수 없다.
2. 배포하기 이전 end to end test에 차질이 생길 수 있다.

이외에도 개발하면서 겪는 문제점은 분명 더 많을 것입니다.

이런 문제를 해결하기 위해 WSL을 사용하는 개발자들은 포트포워딩이 필요할 것입니다.

📌WSL PortForwarding

WSL에서 외부 네트워크로 접속하는 것에는 문제가 되지 않습니다.

Windos 환경에서 WSL의 IP4 주소로 접속하는 것도 전혀 문제가 되지 않습니다.

하지만

WSL 환경에서 구동되는 서버, 프로그램에 외부 컴퓨터, 네트워크가 접속할 수 없습니다.

이런 문제를 해결하기 위해 포트포워딩이라는 작업을 해주어야합니다.

📌 ports_wsl.ps1

C 드라이브에 ports_wsl.ps1 이름.확장자명으로 파일을 만들어줍니다.

해당 파일에는 다음 코드를 복사하여 작성해줍니다.

$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,8000,8002);


#[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";
}

Invoke-Expression "netsh interface portproxy show v4tov4";

📌 PowerShell Script 실행

  1. 이후 PowerShell을 관리자 권한으로 실행해줍니다.
  • PowerShell 실행 후 다음 명령어 입력
    	Set-ExecutionPolicy RemoteSigned
  • 또는 PowerShell 우클릭 후 관리자실행 클릭
  1. 다음 위에서 작성한 ports_wsl.ps1 파일을 실행해줍니다.

    	C:\ports_wsl.ps1
  1. 이후 IP 주소를 다음 명령어로 확인하여줍니다.

    ipconfig
  2. ipconfig를 찾을 수 없다고 나오는 경우 PowerShell에서 다음 명령어를 입력합니다.

  • Ubutu

    	sudo apt-get install net-tools
  • PowerShell

    	C:\ports_wsl.ps1

  1. 무선 LAN 어댑터 Wi-Fi 항목의 IPv4 주소로 현재 내 IP를 확인합니다.



✅ Runserver


포트포워딩 작업을 마친 이후 서버를 실행할 때 다음과 같이 입력해줍니다.

Python의 Django 프로젝트를 사용하기 때문에 다음 명령어를 실행합니다.

포트번호를 아래와 같이 입력해주어야합니다! 0:8000

python manage.py runserver 0:8000

로컬에서는 127.0.0.1:8000으로 접속을 할 수 있습니다.

외부에서는 위에서 확인한 IP 주소 (10.58.??.??? 등)로 WSL 환경에서 개발한 서버와 프로그램에 접속할 수 있습니다.

profile
누구나 이해할 수 있도록

0개의 댓글