Windows 머신에서 개발 작업을 수행할 때 WSL2에서 수행하지 못하거나, Windows 종속적인 환경(Active Directory, Exchange Server 등)을 구성해야 한다면 Hyper-V를 사용하는 것이 간편하다. 그런데, Hyper-V를 설치하면 기본적으로 제공되는 가상 스위치인 vEthernet (Default Switch)에 치명적인 약점이 있다. 재부팅 할 때 마다 vEthernet (Default Switch)의 대역과 IP가 바뀌고, 그에 따라 이 스위치를 사용하는 VM의 IP도 바뀐다는 것이다.
간단한 확인을 하려고 VM을 만들어서 짧게 사용할 때는 크게 문제가 되지 않지만 장기간 VM끼리 또는 VM-Host 간 통신이 필요한 개발 작업을 수행한다면, Host를 재부팅 할 때 마다 VM의 IP가 바뀌게 되면 귀찮아 진다. 코드에서 IP를 바라보게 했다면 코드를 수정해야 하고, 도메인을 바라보게 했다면 hosts 파일을 수정하거나, DNS를 수정해줘야 한다. vEthernet (Default Switch)을 수정해서 뭔가를 해보려고 해도, 그 설정은 초기화된다. 아무래도 기본으로 설정되는 가상 스위치라, 사용자가 고장내더라도 재부팅 할 때 복구되도록 만들어진 것으로 보인다.
그래서 이를 해결하려면 새로운 가상 스위치를 만들어 사용해야 한다. 이 글은 Windows 10 Pro 21H2(OS Build 19044.1586)을 기준으로 작성되었다. 여기서 사용한 명령어들은 시간이 흐름에 따라 크게 바뀌는 명령어는 아니므로 수 년 간은 그대로 사용할 수 있을 것이다. 만약 주류 Windows 버전에서 더 이상 아래 명령어가 동작하지 않는다면 수정하도록 하겠다.
Powershell을 통해 실행하면 되고, 필요한 명령어는 단 세 줄이다.
New-VMSwitch -SwitchName "MySwitch" -SwitchType Internal
New-NetIPAddress -IPAddress 172.16.0.1 -PrefixLength 16 -InterfaceAlias "vEthernet (MySwitch)"
New-NetNat -Name "NATNetwork" -InternalIPInterfaceAddressPrefix "172.16.0.1/16"
이렇게 실행하고 원하는 Hyper-VM의 스위치를 vEthernet (MySwitch)로 변경하면 된다. 단, vEthernet (Default Switch)와는 달리 자체 DHCP가 없기 때문에 VM에서 IP를 수동으로 잡아줘야 한다. 바로 위 명령어와 완전히 동일하게 했다면 VM에 할당할 수 있는 IP는 172.16.0.2~172.16.255.255 이고, 원하는대로 골라서 쓰면 된다. 만약 172.16.0.11이라는 IP를 할당하고 싶을 때는, Windows VM 기준으로 아래처럼 해주면 된다.
각 명령어가 하는 일은 아래와 같다.
New-VMSwitch -SwitchName "MySwitch" -SwitchType Internal
MySwitch라는 이름의 가상 스위치를 생성하는 명령어이다. 이 때 타입은 Internal이다. Internal 타입의 스위치는 인터넷으로의 연결이 안되는데, 세번째 명령어에서 NAT를 통해 인터넷으로의 통신을 열어줄 것이다. 더 자세한 설명은 MS 공식문서 New-VMSwitch를 참조하자.
New-NetIPAddress -IPAddress 172.16.0.1 -PrefixLength 16 -InterfaceAlias "vEthernet (MySwitch)"
첫번째 명령어를 통해 만든 vEthernet (MySwitch)에 172.16.0.1 IP를 할당하고, 16비트 주소 대역을 할당한다. 다른 표현으로는 172.16.0.0/16 이며, 172.16.0.1~172.16.255.255를 의미한다. 다른 대역 사용을 원한다면 사설 IP 대역 중 원하는대로 골라서 쓰면 된다. 나는 회사에서 10.0.0.0/8을 사용하고, 홈네트워크에서 192.168.0.0/16을 사용하기 때문에, 헷갈리지 않도록 Hyper-V VM 대역에는 172.16.0.0/16을 사용한다. 더 자세한 설명은 MS 공식문서 New-NetIPAddress를 참조하자.
New-NetNat -Name "NATNetwork" -InternalIPInterfaceAddressPrefix "172.16.0.0/16"
첫번째 명령어를 통해 MySwitch를 만들 때 Internal 타입으로 만들었기 때문에, 기본적으로 해당 스위치를 사용하는 VM에서 인터넷으로의 접근이 안된다. 이를 허용해 주기 위해 NAT을 만들어 주어야 한다. 172.16.0.0/16 대역의 내부 IP를 NAT 해주도록 설정하게 된다. 더 자세한 설명은 MS 공식 문서 New-NetNat을 참조하자.