WSL 2 인스턴스와 호스트 측의 Hyper-V에 운영 중인 VM과 네트워크 연결을 하는 방법 - 두 번째 이야기
지난번에 테스트한 글을,
WSL 2 인스턴스와 호스트 측의 Hyper-V에 운영 중인 VM과 네트워크 연결을 하는 방법
; https://www.sysnet.pe.kr/2/0/12494
아래의 글을 읽은 김에 한 번 더 해봤습니다. ^^
Allowing Windows Subsystem for Linux to communicate with Hyper-V VMs
; https://automatingops.com/allowing-windows-subsystem-for-linux-to-communicate-with-hyper-v-vms
Hyper-V를 호스팅하는 경우 WSL과 "Default Switch" 간의 네트워크는 분리돼 있습니다.
// Windows 호스팅 서버 (Hyper-V)에서 ipconfig 실행 결과
Ethernet adapter vEthernet (Default Switch):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::c52e:bcaf:7ccb:3114%36
IPv4 Address. . . . . . . . . . . : 172.23.240.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
Ethernet adapter vEthernet (WSL (Hyper-V firewall)):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::ace:43c2:3a85:56b5%62
IPv4 Address. . . . . . . . . . . : 172.18.208.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
// WSL 2 Ubuntu 20.04 인스턴스에서 ifconfig 실행 결과
eth0: flags=4163 mtu 1500
inet 172.18.214.61 netmask 255.255.240.0 broadcast 172.18.223.255
...[생략]...
// Hyper-V VM에 설치된 윈도우 VM에서 ipconfig 실행 결과 (Default Switch에 연결된 경우)
Ethernet adapter 이더넷 3:
Connection-specific DNS Suffix . : mshome.net
Link-local IPv6 Address . . . . . : fe80::c2d7:20ff:31bf:6e94%4
IPv4 Address. . . . . . . . . . . : 172.23.240.28
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . : 172.23.240.1
따라서 호스트 측에서는 WSL 2와 VM 모두에 ping이 잘 동작합니다.
ping 172.18.214.61 // Host -> WSL 2: OK
ping 172.23.240.28 // Host -> VM: OK
반면, WSL 2와 VM 간의 ping은 모두 동작하지 않는데요, 이유는 기본적으로 중계를 하지 않기 때문입니다.
PS C:\temp> Get-NetIPInterface | where { $_.InterfaceAlias -eq 'vEthernet (WSL (Hyper-V firewall))' } | Select-Object ifIndex,InterfaceAlias,ConnectionState,Forwarding
ifIndex InterfaceAlias ConnectionState Forwarding
------- -------------- --------------- ----------
62 vEthernet (WSL (Hyper-V firewall)) Connected Disabled // IPv6
62 vEthernet (WSL (Hyper-V firewall)) Connected Disabled // IPv4
PS C:\temp> Get-NetIPInterface | where { $_.InterfaceAlias -eq 'vEthernet (Default Switch)' } | Select-Object ifIndex,InterfaceAlias,ConnectionState,Forwarding
ifIndex InterfaceAlias ConnectionState Forwarding
------- -------------- --------------- ----------
36 vEthernet (Default Switch) Connected Disabled // IPv6
36 vEthernet (Default Switch) Connected Disabled // IPv4
저렇게 Forwarding 설정이 꺼져 있는데요, 따라서 그걸 켜주면,
Get-NetIPInterface | where { $_.InterfaceAlias -eq 'vEthernet (WSL (Hyper-V firewall))' } | Set-NetIPInterface -Forwarding Enabled -Verbose
Get-NetIPInterface | where { $_.InterfaceAlias -eq 'vEthernet (Default Switch)' } | Set-NetIPInterface -Forwarding Enabled -Verbose
이후 서로 간에 ping이 잘 동작합니다.
ping 172.23.240.28 // WSL 2 -> VM: OK
ping 172.18.214.61 // VM -> WSL 2: OK
재미있는 건, 이러한 양방향 Forwarding은 "Default Switch"에 대해서만 가능하고,
"Internal Network" 유형에 대해서는 약간 다른 동작을 합니다.
[VM 측이 Internal Network 유형인 경우]
VM -> WSL 2: Failed (Forwarding 설정 여부와 무관)
WSL 2 -> VM: OK (Forwarding 설정 여부와 무관)
지난 글을 쓸 때까지만 해도 WSL 2에서 (Internal Network에 속한) VM으로 불가능했던 것으로 아는데, 아마도 WSL 2 패치 과정에서 현재는 지원하게 된 것으로 보입니다. 반면 그 반대로 VM에서 WSL 2 인스턴스로는 ping이 되지 않습니다. 대신 ping을 제외하고는 일반적인 TCP/UDP 통신이라면
호스팅을 경유한 포트 포워딩으로 해결할 수 있을 텐데요, 단지 ping의 경우 ICMP 프로토콜이므로 포트가 없어 테스트할 수 없습니다.
한 가지 더 첨언하자면, 원래 ping을 위한 echo 요청은,
Windows 7/2008에서 ping을 위한 echo 요청 열기
; https://www.sysnet.pe.kr/2/0/780
Windows Defender Firewall with Advanced Security에서 "File and Printer Sharing" 범주의 ICMPv4-In, ICMPv6-In 규칙으로 제어합니다.
File and Printer Sharing (Echo Request - ICMPv4-In)
File and Printer Sharing (Echo Request - ICMPv6-In)
하지만, WSL 2 인스턴스에서 ("Default Switch"로 연결된) Hyper-V VM으로 ping을 하는 경우에는 저 규칙으로 열리지 않고 대신 "Virtual Machine Monitoring" 범주의 항목으로 열어야 합니다.
Virtual Machine Monitoring (Echo Request - ICMPv4-In)
Virtual Machine Monitoring (Echo Request - ICMPv6-In)
여기서 더 재미있는 것은, ("Default Switch"가 아닌) "Internal Network" 유형에 속한 VM인 경우에는 다시 "File and Printer Sharing" 범주의 ICMPv4-In, ICMPv6-In 규칙으로 열어야 WSL 2 인스턴스에서 ping이 됩니다. 마치, 윈도우 호스트 측에서 VM으로 ping을 하는 것과 유사하다고 볼 수 있습니다.
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]