WSL 2의 네트워크 통신 방법
이번 글은 다음의 문서 중 네트워크 부분만을 정리한 것입니다.
Comparing WSL 1 and WSL 2
; https://docs.microsoft.com/en-us/windows/wsl/compare-versions
우선, WSL 2가 설치되면 Hyper-V의 Virtual Switch로 "
Internal network" 유형의 "WSL" 항목이 생기고, "제어판"의 네트워크 연결에서는 "vEthernet (WSL)" 어댑터로 나타납니다. 따라서, WSL 2와 호스트 측의 네트워크는 "vEthernet (WSL)"에 따라 구성되는데 예를 들어 다음은 호스트 측과 "WSL 2" 측의 IP 구성을 보여줍니다.
C:\> ipconfig
...[생략]...
Ethernet adapter vEthernet (WSL):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::85ec:2234:8334:9fd4%55
IPv4 Address. . . . . . . . . . . : 172.18.176.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.178.192 netmask 255.255.240.0 broadcast 172.18.191.255
inet6 fe80::215:5dff:fe9d:7896 prefixlen 64 scopeid 0x20<link>
ether 00:15:5d:9d:78:96 txqueuelen 1000 (Ethernet)
RX packets 2719 bytes 660952 (660.9 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 132 bytes 10729 (10.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
...[생략]...
하지만, 일반적인 Virtual Switch의 경우와는 다르게, WSL 스위치에 대해서는 호스트 측에서 "localhost"와 매핑할 수 있는 배려를 해두었습니다. 이로 인해 WSL 2 내에서 TCP 서버를 (에를 들어, 15000번 포트로) 열어두었다면, 그것을 호스팅하는 Windows 10 PC에서는 "localhost:15000"으로 접속을 할 수 있습니다.
하지만, 그 반대로는, 즉 호스팅 운영체제 측에서 TCP 서버 소켓을 열고 그것을 "WSL 2" 내의 응용 프로그램에서 "localhost:15000"으로 접속하는 것은 가능하지 않습니다. 만약 WSL 2 측에서 호스트 측으로 접속하고 싶다면 원칙적으로 "vEthernet (WSL)" 스위치의 네트워크를 따라 "172.18.176.1:15000"으로 접속해야 합니다.
문제는, 만약 일반적인 응용 프로그램을 만든다면 "172.18.176.1" 값을 쉽게 알 수 없다는 점인데, 다행히 "WSL 2"에서 호스팅하는 리눅스에서는 resolv.conf에 이를 기록해 둔다고 합니다.
$ cat /etc/resolv.conf
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false
nameserver 172.18.176.1
또한 "vEthernet (WSL)" 어댑터가 일반적인 다른 Hyper-V의 Virtual Switch였다면, ("Internal network" 유형이므로) 당연히 WSL 2 내에서는 인터넷 접속이 안 되어야 합니다. 하지만, 이것 역시 가능하게 만들어 둔 배려가 있고!
그렇다면 인터넷에서 "WSL 2"로 접근하려면 어떻게 해야 할까요? 기본적으로 "vEthernet (WSL)"이 구성한 네트워크는 "internal" 유형이므로 외부에서 접근할 수 있는 방법이 없습니다. 대신 호스트 측에 포트 포워딩을 설정해 "WSL 2"로의 접근을 가능하게 만드는데요, 예를 들어, "15000" 포트로 Listen 하는 프로그램을 WSL 2에 실행한 경우, 그것을 호스트 측의 IP로 접근하고 싶다면 다음과 같은 설정을 하면 됩니다.
C:\temp> netsh interface portproxy add v4tov4 listenport=15000 listenaddress=0.0.0.0 connectport=15000 connectaddress=172.18.178.192
C:\temp> netsh interface portproxy show v4tov4
Listen on ipv4: Connect to ipv4:
Address Port Address Port
--------------- ---------- --------------- ----------
0.0.0.0 15000 172.18.178.192 15000
이렇게 환경 구성이 되면, 외부에서 호스트 측의 IP(위의 글에서는 172.18.176.1을 비롯해 기타 어댑터가 소유한 IP)로 15000 포트를 지정해 접근할 수 있습니다.
참고로, 삭제는 이렇게!
C:\temp> netsh interface portproxy delete v4tov4 listenport=15000 listenaddress=0.0.0.0
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]