[WSL2] 포트포워딩과 window에서 workbench로 접속하기

WSL2를 이용하여 개발을 진행서 외부에서 접근하고 싶거나, 배포를 위해 접근하고 싶을 수가 있는데, 문제가 되는 것이 WSL2는 VM과 같은 환경이라 별도의 IP를 갖는다는 점이다.

그러면 포트포워딩을 하면 되지 않느냐라고 할 수 있는데 맞다 포트포워딩을 하면된다 하지만 재부팅을 할때마다 변경되는 IP에 매번 포트 포워딩을 할 수 없는 노릇이기에 Powershell 파일을 이용하여 재부팅마다 wsl2의 ip를 잡아 특정 포트를 포트포워딩 하는 방법을 남기려고 한다.



사용자 생성

모든 db,table에 접근 가능한 root권한을 가진 사용자로 외부에서 db를 접근하는 것은 위험한 일일 수 있으니 외부에서 접근하고자 하는 db만 접근권한을 가진 사용자를 생성하여 이를 이용해 접근하자.

create user 사용자이름@'ip주소' identified by '비밀번호';

위와 같이 create user명령어를 이용하여 외부에서 접근할 사용자를 생성하자

create user gowoonso@'%' identified by '1234';

나는 위와 같이 입력하여 예제 사용자를 만들었고 ‘%‘는 모든 외부 ip접속을 허용한다는 뜻이고 특정 ip에서만 접속하려면 ip주소를 입력해주면 된다.

create user

사진과 같이 mysql에 user가 추가된 것을 볼 수 있다.



접근 권한 부여

grant all privieges on DB이름.테이블이름 to 사용자이름@'ip주소';

위와 같이 grant 명령어를 이용해 특정 db와 테이블이름에 접근 권한을 부여하자.

grant all privileges on earn_points_web.* to gowoonso@'%';

나는 earn_points_web이라는 db의 모든 테이블(*)을 아까만든 [email protected]'%'의 사용자에게 접근권한을 부여했다.

all privileges대신에 select,insert,update을 사용하여 특정 명령어에 대해서만 접근 권한을 부여할 수 도 있고, 모든 db에 대한 접근권한을 부여하고자 한다면 테이블명.* 대신 *.*을 이용하면 된다.

grant



PowerShell명령 이용하여 포트포워딩

쉘 스크립트를 이용하여 Powershell파일을 작성해 재부팅시마다 자동으로 이 파일을 실행시키도록 할 것이다.

파일은 Reference를 참조하였습니다.

$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=@(22,80,3306,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";
}

위 파일에서 중간에 [email protected](22,80,3307,10000,3000,5000);안에 port forwarding할 포트번호를 넣어주면 된다.

위 파일을 컴퓨터를 재부팅시마다 실행시키도록 설정해야하는 데 이는 앞에 작성한 글에 비슷한 내용의 설명이 있기 때문에 생략하겠다.

재부팅을 하면 파일이 실행되고 포트포워딩이 자동으로 설정되어 wsl2의 ip주소로 외부에서 접근하면 접근이 가능할 것이다.



추가) wsl2 mysql을 window에서 workbench로 접속

처음에 wsl2의 mysql에서 사용자를 localhost로 만들어 window에서 접근하려고 하니 서로 별도의 이더넷으로 분리되어 있기 때문에 localhost로 접속이 불가능했다.

error

사용자를 ‘%‘로 만들어 wsl2의 ip로 접근을 하면 window의 workbench에서 접근이 가능하다. success

wsl에서 mysql포트번호를 3306그대로 이용할 시 window의 mysql포트번호가 3306이라면 충돌이 일어나기때문에 ifconfig로 ip확인후 접속해야 한다.

하지만 이러면 매번 ip를 입력하는게 귀찮기 때문에 wsl이나 window의 mysql의 포트번호를 바꿔 사용하면 간단하게 해결이된다.

나는 wsl의 mysql의 포트번호를 3307로 하고 3307을 포트포워딩 설정을 해주었는데 그러면 window에서도 localhost:3307로 접속을 하면 잘 접속이되는 것을 볼 수 있다.

success2




Reference

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