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

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

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



1. 사용자 생성

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

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

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

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

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

alter-text

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



2. 접근 권한 부여

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

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

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

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

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

alter-text
grant



3. 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";
}

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

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

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



4. wsl2 mysql을 window에서 workbench로 접속

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

https://www.gowoonsori.com/images/settings/port-forwarding/error.PNG does not exist

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

alter-text
success

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

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

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

alter-text
success2




Reference

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

Related Posts

제어문

제어문

  • Java
  • 2021년 1월 25일

1. 조건문 1) Switch 특정 데이터의 값에 따라 수행할 작업을 선택하는 구문으로 switch를 사용한다. 일반적인 사용법은 C/C++와 다르지 않다. switch() 매개변수에 데이터 값을 입력하고 case : 를 이용해 값에 따라 구문을 구분하면 된다. String이나 ,Integer과 같은 Wrapper타입이 올 수 있다. case의 값에는 리터럴 이나 상수가 와야 하고 중복해서는 안된다. Java 12버전 이후에 case -> 를 이용하여 작업할 구문을 작성할 수 있게 되었고 break를 생략이 가능해졌다. 또한, -> 와 yield를 사용하여 switch도 값을 반환할 수 있게 되었다. case에 따라 특정 변수의 값을 바꾸는 경우에는 위의 코드와 같이 외부의 변수에 값을 할당해주는 방법으로 비슷한 코드를 반복작성해야하는 단점이 존재했는데 쉽게 값을 바꿀 수 있게 되었다....

Read More
Enum

Enum

  • Java
  • 2021년 1월 24일

백기선님의 유튜브 로 진행하시는 스터디를 진행하며 올리는 정리 블로그입니다. Java의 Enum도 기본적으로 c나 c++의 enum과 같은 목적을 위한 클래스로 JDK 1.5이후에 생긴 클래스이다. 잠깐 C언어 얘기를 하자면 C언어의 C99 이전에는 boolean타입을 제공하지 않았기 때문에 다음과 같이 사용하고는 했었다. 1. Java에서의 Enum 특징 Enum 비교시에 값이 아닌 타입까지도 체크가 가능하고 Enum의 상수값이 재정의 되어도 다시 컴파일하지 않는다....

Read More
최장 증가 수열

최장 증가 수열

주어진 수열에서 오름차순으로 정렬된 가장 긴 부분 수열이다. 예를 들어, 341256784134라는 수열에서 LIS는 345678 or 125678 이 된다. 1. 찾는 방법 LIS의 크기 구하는 방법은 dp와 이분탐색에 따라 방법이 나뉘며 경로 추적(trace) 방법은 두 방법 모두 인덱스를 가리키는 배열을 하나 추가하여, 탐색하면서 해당 값의 앞의 수열 인덱스를 저장하는 방법으로 구현한다....

Read More