본문 바로가기

환경설정

WSL2(Windows Subsystem for Linux) 포트포워딩 방법

WSL 에서 Django 를 띄워서 테스트를 잘 하고 있다가 PC를 리붓했는데... 왠걸.. 

갑자기 외부에서 해당 서버로 접속이 안된다. 

 

결론적으로 말하자면, 

1. WSL2 은 아이피가 계속해서 유동적으로 변경되기 때문에 

2. 포트를 고정시켜줘야 한다. 

https://learn.microsoft.com/ko-kr/windows/wsl/networking

 

한참을 찾다가 아래 사이트에서 팁을 발견했다. (감사합니다!) 

1.  WSL2 포트포워딩 방법 

https://blog.aaronroh.org/118

 

WSL2, 외부 네트워크와 연결하기

node.js를 WSL2에서 구동하였는데 로컬만 접속되고 외부에서는 접속이 안돼요 Django를 WSL2에서 구동하였는데 외부에서 접속이 안돼요 와 같은 문제점을 해결하는 글입니다 현재 Window10 preview 2004 버

blog.aaronroh.org

2. 그리고 상단의 작성자분이 참고하신 원본 스크립트 경로도 나중을 위해 함께 덧붙인다. 

https://github.com/microsoft/WSL/issues/4150

 

[WSL 2] NIC Bridge mode 🖧 (Has TCP Workaround🔨) · Issue #4150 · microsoft/WSL

Issue WSL 2 seems to NAT it's virtual network, instead of making it bridged to the host NIC. My goal is for a service running in Ubuntu in WSL 2 to be accessible from anywhere on my local netwo...

github.com

 

 

아래의 스크립트를 추려 * .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,443,10000,3000,5000);


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

코드 내 ports 부분을 원하는 포트로 변경 하면 된다. 

$ports=@(80,443,10000,3000,5000);

 

작업스케쥴러는이름/설명 작성 후, 사용자의 로그인여부와 관계없이 가장 높은 권한으로 실행 시킨다 

 

 

시작할때 셋팅하여 컴퓨터가 부팅되면 항상 시작하도록 셋팅한다 

 

프로그램/스크립트 :

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

인수 추가 : 실행하는 위치 작성 

Ex.)ExecutionPolicy Unrestricted -File "C:\Users\컴퓨터명\Desktop\폴더명\wsl2_ipsetting.ps1”