Window Host에서 WSL 서비스로 port forward 사용

윈도우에서 WSL2 사이에 port forward 를 통해서 WSL에서 사용중인 서비스에 접속하고 사용할 수 있다.

  • 원격에서 WSL2에 SSH서비스로 접근하고자 할 때
  • 원격에서 WSL2에 서비로 동작하는 django 등 서비스에 접근하고자 할 때

WSL2 에 포트 포워드

초기 WSL2 버전까지만 해도 WSl2의 IP로 직접 포트 포워딩을 하거나 VM의 IP를 변경해 사용하는데 왜그런지 최신 WSL2 의 VM IP 는 호스트의 네트워크 인터페이스에서 게스트 머신 WSL2의 IP 네트워크가 확인이 안된다.

예를 들어 윈도우의 ipconfig로 아래 처럼 가상머신 어뎁터가 나오지만 IP network 이 다르다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

이더넷 어댑터 vEthernet (Default Switch):

연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::6b31:c23a:366b:1078%47
IPv4 주소 . . . . . . . . . : 192.168.160.1
서브넷 마스크 . . . . . . . : 255.255.240.0
기본 게이트웨이 . . . . . . :

이더넷 어댑터 vEthernet (WSL (Hyper-V firewall)):

연결별 DNS 접미사. . . . :
링크-로컬 IPv6 주소 . . . . : fe80::6b31:2b1a:9d22:efc5%55
IPv4 주소 . . . . . . . . . : 172.18.80.1
서브넷 마스크 . . . . . . . : 255.255.240.0
기본 게이트웨이 . . . . . . :

WSL2의 게스트 머신과 윈도우 호스트 머신 사이의 라우팅을 담당하는 어뎁터가 172.18.80.1 이 WSL의 라우팅 포인트 같은데 실재 wsl 의 IP 는 다음 같이 나온다.

1
2
> wsl hostname -I
172.18.82.228

즉 호스트의 라우팅 테이블에서 알 수 없는 네트워크로 정의된다. 그래서 윈도우에서 직접 게스트 머신으로 라우팅이 안된다. 포트 포워딩시 WSL 게스트 머신의 IP를 직접 사용이 어렵다는 의미다.

게스트머신 IP로 ssh 접근은 된다. 그런데 port forwarding 에선 잘 안된다. 그런데 localhost 는 직접 게스트 머신의 포트에 접근이 가능하다. 그래서 localhost 를 사용하면 된다.

포트 포워드 스크립트

.ps1 파일에 아래 스크립트를 작성한다. WSL2 의 IP에 대해서,

  • 줄막음 처리한 것은 이전에 사용했던 방식이다. (어떤 버전인진 모르겠다)
  • 127.0.0.1 혹은 localhost 를 사용하면 된다.

스크립트

-

1
2
3
4
5
6
7
8
9
10
11
# `start_wsl2_portforward.ps1` 파일
$script = {
# netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=(wsl hostname -I)
# netsh interface portproxy add v4tov4 listenport=2000 listenaddress=0.0.0.0 connectport=2222 connectaddress=(wsl hostname -I)
# portforward for Router
netsh interface portproxy add v4tov4 listenport=5000 listenaddress=0.0.0.0 connectport=5555 connectaddress=127.0.0.1
netsh interface portproxy add v4tov4 listenport=2000 listenaddress=0.0.0.0 connectport=2222 connectaddress=127.0.0.1
netsh advfirewall firewall add rule name="TCP/5000" protocol=TCP dir=in localport=5555 action=allow
netsh advfirewall firewall add rule name="TCP/2000" protocol=TCP dir=in localport=2222 action=allow
}
Start-Process -FilePath powershell.exe -ArgumentList "-Command & {$script run}" -verb RunAs

윈도우를 시작하고 Powershell 에서 이 스크립트를 실행하면 관리자 모드 허용을 받아 포트 포워드와 방화벽이 모두 업데이트 된다.

1
2
3
4
> start_wsl2_portforward.ps1

확인됨...

호스트의 포트 포워드 구성을 확인.

1
2
3
4
5
6
7
8
PS C:\Users\daddy> netsh interface portproxy show v4tov4

ipv4 수신 대기: ipv4에 연결:

주소 포트 주소 포트
--------------- ---------- --------------- ----------
0.0.0.0 2000 127.0.0.1 2222
0.0.0.0 5000 127.0.0.1 5555

호스트의 방화벽을 확인

1
> netsh advfirewall firewall show rule name="TCP/8686"

포워드 / 방화벽 구성 삭제

포드워와 방화벽을 삭제할 수 있다.

1
2
3
4
5
# 포트 포워드 삭제
netsh interface portproxy delete v4tov4 listenport=5000 listenaddress=0.0.0.0

# 방화벽 삭제
netsh advfirewall firewall delete rule name="TCP/5000"