wsl은 windows 내부에서 동작한다.
외부에서 wsl에 접속해서 무언가하려 한다면 (bash 조작 혹은 웹 서버 접속)
외부에서 "windows 공인ip":포트로 들어오고, windows가 "wsl ip":포트로 들어가서 결과를 얻어 반환한다.
wsl에서 A 포트로 서버를 띄워도, "wsl ip":A을 windows의 포트 B와 연결해주지 않으면 외부에선 무슨 짓을 해도 wsl의 A 포트로 들어갈 수 없으며, 이를 연결했다 하더라도 windows의 포트 B를 외부에 열어놓지 않으면 windows PC에조차 접속할 수 없다.
그래서 해야 할 일은
1. wsl 포트 포워딩 (wsl:A to windows:B)
2. windows 포트 포워딩 (windows:B 포트 열어두기)
WSL의 내부 IP 주소는 윈도우 부팅 시마다 바뀐다.
이걸 자동화 해야 한다.
그래서 이 작업은 또 세부 작업으로 나뉜다.
이를 자동화 하는 스크립트는 유서 깊게 내려온다.
몇 년 전에 찾아서 우려먹고 있는데 요즘 찾아도 하나도 바뀐 게 없다.
Set-ExecutionPolicy RemoteSigned
$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=@(원하는, 포트, 입력);
# [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";
이걸 복사한 다음 .ps1 확장자 파일을 하나 만들어서 붙여넣기 한다.
sudo apt install net-tools
wsl에 ifconfig 명령어를 설치한다.
Powershell 창을 열어서 .\파일이름.ps1로 실행해본다.
윈도우 키를 눌러 "작업 스케줄러"를 검색하고 실행한다.
그럼 이런 창이 나온다.

우측에 '작업 만들기' 누르면 이런 창이 뜬다.
일반 탭에서 작업 이름 아무렇게나 정해주고 동작 탭으로 가서 '새로 만들기' 한 다음

프로그램/스크립트에
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
(아무것도 안 했으면 v1.0이다. powershell을 수동으로 업데이트했으면 모를까)
인수 추가에 아까 만든 .ps1 파일 위치를 넣어준다.
그리고 '트리거' 탭에서 '새로 만들기' 한 다음 작업 시작에서 '시작할 때'를 선택한다.
이러면 윈도우 시작할 때 저 파일이 실행된다.
공유기 포트포워딩 한 번 해줘야 되고
방화벽에서 인바운드 규칙 만들어줘야 한다.
공유기 포트포워딩 방법은 구글에 {제조사} 포트포워딩 치면 나온다.
윈도우에서 방화벽 검색하면 '고급 보안이 포함된 Windows Defender 방화벽'이란 메뉴가 나온다.
인바운드 규칙에서 우측 새 규칙을 눌러 규칙을 생성한다.
규칙 종류는 포트
프로토콜은 TCP (WSL은 UDP지원 안함)
포트는 원하는 포트
그리고 넘기고 이름 정해주면 완성이다.
.ps1 파일을 만들어서 작업 스케줄러에 등록한다.이거 다 했는데도 안 되면 서버 호스트가 0.0.0.0으로 돼있는지 확인한다.
(sql이나 웹 프론트 같은 경우 기본값이 로컬호스트이다. 0.0.0.0으로 바꿔 줘야 한다.)