2월 23, 2022

[WSL] 외부 네트워크와 통신 불가한 문제해결

 장고로 구현한 로그인/회원가입을 프론트와 합쳐서 기능을 구현해보는 세션에서 모든 윈도우 유저가 통신이 되지 않았다. 에러가 난 것도 아니고, 그냥 프론트에서 POST로 값을 보내도 아무런 응답이 발생하지 않았다.


https://webisfree.com/2021-07-14/wsl2-외부-remote-ip-접속-가능하도록-설정하기-방화벽-해제

https://blog.dalso.org/linux/wsl2/11430

https://codeac.tistory.com/118

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

해당 링크들을 참조하여 포스팅을 작성했습니다.


내 로컬(윈도우)와 WSL(우분투)가 연결 돼 있지 않아 생긴 문제였다.

  • 로컬로 온 요청이 WSL포트로 전해지지 않았기에 이를 이동시켜 줄 방법이 필요했다.
$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);


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


위의 스크립트 파일을 만들고, 이를 C드라이브에 넣어준 뒤, 실행해줘야 했다. 서버가 8000번 포트를 사용하고 있었기에  $ports에 8000을 추가해주었다(원래 코드엔 없었다). 
방화벽을 해제하고, 로컬 포트로 온 요청을 wsl포트로 연결해주는 코드이다. 솔직히 무슨 뜻을 가진 코드인지는 잘 모르겠다.

관리자권한으로 powershell을 켜준다.

PS C:\> .\test.ps1
/bin/bash: ifconfig: command not found

이 에러가 뜨면 
sudo apt-get install net-tools 로 net-tools를 설치한 후 다시 명령어를 입력한다(우분투에서)


다시 실행해준다.

 DisplayName : WSL 2 Firewall Unlock ~~~ 이런식으로 뜨면 된거다.


이후 netsh interface portproxy show v4tov4 

명령어를 입력해준다 


이렇게 뜨고 밑으로 값이 막 나오는데,
왼쪽 주소는 로컬 주소이다. 0.0.0.0으로 뜬다는 것은 어느 ip로도 접속이 가능한 ip라는 뜻이다.
왼쪽의 포트는 내 로컬 포트이다.

오른쪽의 주소는 내 우분투의 ip이다.
오른쪽의 포트는 내 우분투의 포트이다.
이를 통해 연결을 확인할 수 있다.

이후 ipconfig 명령어를 실행한다.

같은 wifi를 쓰는 프론트에게 내 private ip로 값을 보내게 하고 싶으면 ,
해당 명령어를 입력했을 때 나오는,

"무선 LAN 어댑터 Wi-Fi" 안의 
"IPv4 주소" 를 확인하면 된다. 이것이 내 컴퓨터의 IP주소이다. 여기로 접속할 수 있도록 프론트와 소통해야 한다.

이 파일은 매번 컴퓨터가 켜질때마다 해줘야하기에, 작업 스케줄러에 등록해서 컴퓨터 시작 시 스크립트가 실행되도록 해줬다. 

정확한 원리에 대해서는 잘 모르겠다. 당장 연결이 안되는 문제 해결하느라 급급했다. 추가적인 공부가 필요한 사안이다.