Multipass 우분투 VM에도 고정 IP를 붙여보자

🧐 | 2022-04-26

안녕하세요, 넷마블 기술전략실 조병승입니다.

매우 협소한 저의 작업 환경은 WSL2로 부족함이 없으리라 생각했었습니다. 하지만 몹쓸 호기심이 발동해, 동일한 OS가 올라간 VM이 여러 개 필요한 상황이 생겼습니다. 예전 글에서 말했던 것처럼, WSL에서 GUI 방식으로 편하게 클릭해서 설치하는 우분투는 같은 버전끼리는 CLI로 익숙하지 않은 명령어를 학습해야만 쓸 수 있었습니다. 그러던 중, 우분투용으로 제공하는 멀티패스(Multipass)가 눈에 들어왔습니다.

멀티패스

멀티패스(Multipass)는 클라우드 형태로 우분투 VM을 생성하는 도구입니다. 버추어박스(VirtualBox) 느낌도 많이 나지만, 우분투만 쓴다면 훨씬 간편하게 우분투 VM을 만들 수 있습니다. 리눅스, 맥OS, 윈도우용 모두 지원한다는 특징도 있습니다. (물론 저는 윈도우에서만 써봤습니다.) 어느 시점부터인가, 우분투 공식 홈페이지에서도 우분투 서버 이미지를 다운로드하는 메뉴 중 첫 번째 선택지로 멀티패스를 올려두고 있었습니다.

멀티패스에 대한 자세한 내용은 멀티패스 공식 문서를 참고해주세요.
https://multipass.run/docs

윈도우에선 결국 Hyper-v

WSL2에서도 그랬지만, 멀티패스도 결국 윈도우 개발환경에서는 Hyper-v를 기반으로 동작합니다. 그래서 WSL2에서 고정 IP를 한 번에 잡지 못하는 동일한 이슈가 멀티패스에서도 있을 수밖에 없습니다.

같은 이슈가 생긴다는 뜻은, 같은 문제를 겪는다는 의미겠죠. 워드프레스를 최소 설치하고 사이트 URL값을 고정으로 두지 못한다는 점과 다른 VM에 접속할 수 있는 계정을 화이트리스트 기반으로 잡아두고 싶지만, 매번 설정을 바꿔줘야 했습니다.

WSL2에서 고정 IP를 설정했던 방법인 포트포워드를 그대로 활용하면 되지 않을까 했었지만, 멀티패스에서는 멀티패스의 특징을 반영하고 싶었습니다. 특히 WSL2에서 고정 IP를 자동으로 설정하기 위해 작업 스케줄러에 잡아둔 트리거 조건이 완벽하지 않아서, 가끔 절전모드에서 돌아오거나 로그인을 늦게 할 때마다 직접 명령어를 다시 치고 있었던 문제도 해소하고 싶었습니다.

제어할 수 있는 네트워크 인터페이스 추가

기본 원리는 WSL2에서 고정 IP를 설정했던 방법과 동일합니다. 제어할 수 있는 네트워크 인터페이스를 추가하면 됩니다. 다만, 네트워크 인터페이스를 추가하는 방법에 차이가 있습니다.

주로 윈도우에서 GUI로 제공하는 Hyper-v 관리자에서 가상 스위치를 추가하는 가이드를 쉽게 찾아볼 수 있습니다. 하지만, 이렇게 생성한 가상 네트워크 스위치를 VM에 연결하면 외부와 통신이 되지 않습니다. 인터넷을 쓸 수 없다는 뜻입니다. VM끼리 통신은 전혀 문제가 없으므로 폐쇄망 상태로 환경을 만드신다면 이 방법을 쓰셔도 됩니다. 통상적으로는 원치 않으시는 환경이시리라 생각합니다.

윈도우에 NAT 설치하기

마이크로소프트 공식 문서를 보면, Hyper-v에서 NAT(Network Address Translation, 네트워크 주소 변환) 네트워크를 설치하는 방법이 나와 있습니다. 이 방법으로 가상 네트워크 스위치를 생성하면 Hyper-v 관리자에서도 인식은 하지만, 동작 방식은 조금 다릅니다. NAT 네트워크는 버추어박스(VirtualBox)를 자주 사용하셨던 분이라면 익숙하시리라 예상합니다.

NAT는 간단히 설명하자면, IP 패킷이 오가는 TCP/UDP 포트 숫자와 소스와 목적지 IP 주소 등을 재기록하면서 라우터를 통해 네트워크 트래픽을 주고받는 기술입니다. 동작하는 방식과 원리 등은 아래 링크를 참고해주세요.
위키피디아: https://en.wikipedia.org/wiki/Network_address_translation

윈도우 터미널이나 파워셸창을 열고 아래 명령어를 입력하면 ‘mtps’라는 이름으로 가상 네트워크 스위치를 설치할 수 있습니다.

$ New-VMSwitch -SwitchName "mtps" -SwitchType Internal

이제 추가한 mtps 가상 네트워크 스위치의 ‘ifIndex’값을 찾기 위해 ‘Get-NetAdapter’를 실행합니다.

제 환경에서는 ifIndex가 ‘32’로 나와 있습니다. 이제 이 값을 활용해 NAT 게이트웨이를 설정하면 됩니다. 기본 사용법과 예시 값은 아래 명령어를 참고해주세요.

// New-NetIPAddress 명령어 사용법
$ New-NetIPAddress -IPAddress <NAT Gateway IP> -PrefixLength <NAT Subnet Prefix Length> -InterfaceIndex <ifIndex>

// 실제 실행 명령어
$ New-NetIPAddress -IPAddress 192.168.0.1 -PrefixLength 24 -InterfaceIndex 32

이제 NAT 네트워크 설정이 거의 끝났습니다. ‘New-NetNat’ 명령어로 NAT 네트워크 설정을 마무리하겠습니다. 만약 이미 추가한 NAT 네트워크가 있다면, 새 NAT 네트워크를 추가할 수 없으므로 ‘Remove-NetNat’ 명령어로 제거하시고 추가하셔야 합니다. 윈도우 제한으로 인해 NAT 네트워크는 하나만 설치할 수 있으므로, 이점은 꼭 주의하셔서 설정해야 합니다.

// Net-NetNat 명령어 사용법
$ New-NetNat -Name <NATOutsideName> -InternalIPInterfaceAddressPrefix <NAT subnet prefix>

// 실제 실행 명령어
$ New-NetNat -Name MyNATmtps -InternalIPInterfaceAddressPrefix 192.168.0.0/24

이제 VM 내부에서 192.168.0.0/24 대역으로 네트워크를 할당하면, 192.168.0.1에서 라우팅해주는 네트워크를 쓸 수 있습니다.

Hyper-v 관리자에서 네트워크 어댑터 추가

새로 생성한 네트워크 어댑터를 멀티패스 우분투 VM에 추가하려면 Hyper-v 관리자를 활용해야 합니다. 우선 설정 변경을 위해 실행 중인 ubu1을 종료합니다. ubu1 하위 메뉴 중에서 ‘설정’을 누르고, ‘하드웨어 추가’에서 ‘네트워크 어댑터’를 추가합니다.

왼쪽 설치된 하드웨어 장치 중 ‘연결되지 않음’이라는 네트워크 어댑터를 클릭하고, 가상 스위치로 mtps를 선택하고 확인을 클릭합니다. 이제 ubu1에 mtps 네트워크 어댑터를 추가했습니다.

ubu1에 들어가서 ‘ip a’ 명령어를 입력하면, 기본 네트워크인 ‘lo’와 ‘eth0’ 아래에 ‘eth1’이 추가된 것을 볼 수 있습니다.

우분투 VM 네트워크 설정

이제는 멀티패스로 설치한 우분투 VM 내부에서 네트워크 설정을 하겠습니다.

라즈베리파이에 우분투 서버를 올려서 유선랜 IP와 무선랜 IP를 모두 설정해보신 분이라면 익숙하실 ‘netplan’으로 들어갈 차례입니다. 별도로 Hyper-v 관리자에서 네트워크를 추가하거나 하지 않아도 자동으로 추가돼 있으므로, 우분투 VM에만 집중해도 충분합니다.

NAT 네트워크로 설정한 192.168.0.1이 게이트웨이로 동작하며 호스트 역할을 하므로, 멀티패스 우분투 VM은 192.168.0.2 이후 IP를 쓰도록 하겠습니다. Hyper-v 관리자에서 볼 수 있는 기본 스위치나 WSL용 네트워크와 달리, DHCP로 네트워크를 자동 구성하는 기능이 없으므로 고정 IP를 설정하기에 매우 적합하다고 볼 수 있습니다.

미리 설치한 우분투 VM은 ubu1과 ubu2라고 이름을 지었습니다. 먼저 ubu1에서 netplan 설정을 열어보겠습니다. ‘/etc/netplan’ 디렉터리에 ‘50-cloud-init.yaml’ 파일이 있습니다.

$ sudo vi /etc/netplan/50-cloud-init.yaml

여기에 ‘eth1’ 관련 설정을 추가하고 VM을 재가동하면, VM 부팅과 동시에 설정한 고정 IP를 기존 동적 IP와 함께 쓸 수 있습니다. 아래에서 ‘eth1:’부터가 새로 추가한 고정 IP 설정입니다.

network:
    ethernets:
        eth0:
            dhcp4: true
            match:
                macaddress: 52:54:00:b8:6f:a1
            set-name: eth0
        eth1:
            addresses: [192.168.0.2/24]
            gateway4: 192.168.0.1
            dhcp4: no
version: 2

설정을 완료하고 VM을 재부팅합니다. ‘multipass list’ 명령어로도 IP 주소를 확인할 수 있습니다. ubu1에 NginX를 설치하고 웹브라우저에서 192.168.0.2에 접속하면 NginX 기본 화면을 볼 수 있습니다.

ubu2, ubu3, ubu4 등 남아있는 우분투 VM에도 네트워크 카드를 추가하고, IP 주소가 겹치지 않게 netplan을 설정하면 ubu1처럼 순서대로 고정 IP가 생깁니다. (간혹 ‘50-cloud-init.yaml’ 파일 수정을 허용하지 않는 상황이라면, 별도 yaml 파일을 디렉터리에 추가하면 됩니다.)

WSL2에서 멀티패스로

애초에 도커 환경에서 도커 컨테이너끼리 내부 네트워크 설정을 하면, VM 자체를 여럿 띄우지 않아도 됩니다. 언젠간 저도 그 정도 다룰 수 있는 날이 오지 않을까요? 멀티패스를 활용하면 WSL2와 비슷하면서도 기존에 사용하던 VM에 좀 더 가까운 형태로 우분투 서버를 쓸 수 있습니다. 멀티패스에 점점 익숙해지면서 WSL2를 쓰는 빈도가 점차 줄고 있는 스스로를 보면서 조금 뿌듯하기도 합니다.

혹시라도 저와 비슷한 환경에서 비슷한 길을 가고 계신 분께, 조금이나마 도움이 됐으면 좋겠습니다.