kvm 가상 머신에 RDP로 접속하기

17 Feb

지난 번에 kvm을 이용해 가상 머신을 우분투에 설치하면서 네트웍은 Network Address Translation (NAT) 방식으로 설정했다. 이 방식에서는 외부에서 바로 가상머신에 Remote Desktop (이하 RDP)으로 연결이 불가능하고 터널링을 통한 vnc 접속만 허용한다. kvm은 NAT Networking, User Mode Networking, Bridged Networking 이렇게 3가지 네트웍 설정을 제공하며 각각에 따라 RDP 사용 방법이 다르다.

NAT Networking

NAT 방식은 라우터가 작동하는 방식과 비슷하다. 보통 집에 있는 라우터는 인터넷 업체로부터 공인 IP를 하나 할당 받는다. 그리고 내부적으로 라우터 자신이 보통 192.168.1.1을 가진 후 라우터에 연결된 집 안의 컴퓨터들에게 192.168.1.xxx를 할당한다.

라우터에 연결된 컴퓨터들은 같은 네트웍에 있으므로 서로 접속할 수 있으며, 라우터의 공인 IP를 공유하며  밖과 통신할 수 있다.  대신 외부에서 라우터에 연결된 컴퓨터로의 접속은 기본적으로 불가능하다. 외부에서 라우터에 연결된 컴퓨터에 접속하려면 라우터에서 Port Forwarding을 해줘야 한다.

kvm 역시 호스트 머신이 라우터 역할을 한다. 가상 머신을 설치하면 호스트에는 virbr0이라는 가상 네트웍 브릿지가 하나 생성된다. 호스트는 virbr0에 192.168.122.1을 할당 한 후 라우터 역할을 시킨다.  virbr0이 가상 머신에게 192.168.122.2에서 192.168.122.255 사이의 IP를 할당해 준다. 가상 머신들은 virbr0를 통해 외부로 접속이 가능하고 외부에서 가상 머신에 접속할 수는 없다. 그래서 kvm은 5900 포트를 열어주고 ssh 터널링을 통해 가상 머신에 vnc 접속을 가능하게 해준다.

NAT 방식에서도 포워딩이 가능하긴 하다. iptables를 이용해 수정할 수 있으며 부팅 때마다 실행 시켜줘야 하므로 libvirt hook을 이용하면 된다. 그게 귀찮다면 아래 방법들을 이용해볼 수 있다.

Bridged Networking

매번 가상 머신에 접속하려면 ssh 터널링을 해야하기 때문에 무척 번거롭다. 터널링을 하지 않으려면 Bridged Network 방식을 쓸 수 있다. 브릿지 방식은 가상 머신도 호스트 머신과 같은 네트웍상의 아이피를 할당 받는다. 따라서 호스트와 같은 네트웍에 연결되어 있다면 터널링 없이도 직접 가상머신에 접속이 가능하다. kvm이 기본적으로 생성하는 virbr0 브릿지가 아니라 별도의 브릿지를 생성해야 한다.

단, 이 방법은 호스트의 유선 네트웍 카드가 이미 무선 네트웍을 위한 브릿지로 사용되고 있거나 라우터에서 브릿지를 지원하지 않으면 사용할 수 없다.

생성 방법은 kvm/Networking 위키에 잘 나와있다.

먼저 브릿지 관련 패키지를 설치한다.

$ sudo apt-get install bridge-utils

네트웍 설정은 /etc/network/interfaces에 기술되어 있다. 파일을 열어 보면 보통 다음과 같이 되어있다.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

eth0이 우분투에서 사용하는 네트웍 카드이며 ifconfig를 해보면 eth0에 IP가 할당되어 있다. eth0에 브릿지 br0을 연결하려면 10번째 줄부터 아래처럼 고치면 된다.

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
    bridge_ports eth0
    bridge_stp off
    bridge_fd 0
    bridge_maxwait 0

이제 br0 네트웍을 활성화 시키면 된다.

$ sudo ifup br0

ifconfig를 해보면 eth0은 IP가 할당되어 있지 않고 대신 br0에 IP가 할당되어 있다. 이제 kvm 설정에서 가상 머신에게 br0을 통해 인터넷을 하라고 설정을 바꿔주면 된다.

먼저 kvm에 접속한다.

$ virsh

설치된 가상 머신 Windows-8의 네트웍 설정을 바꾸기 위해 일단 가상 머신을 끈다.

stop Windows-8

가상 머신이 멈추면 가상 머신 설정을 연다.

edit Windows-8

설정은 xml 형식으로 되어있다. interface 태그를 찾아보면 아래처럼 되어있다.

<interface type='network'>
    <mac address='52:54:00:a0:55:ef'/>
    <source network='default'/>
</interface>

네트웍 설정을 아래처럼 bridge 방식으로 바꾸고 새로 만든 br0을 브릿지로 설정해준다.

<interface type='bridge'>
    <mac address='52:54:00:a0:55:ef'/>
    <source bridge='br0'/>
</interface>

다시 가상 머신을 시작한다,

start Windows-8

이제 터널링 없이 직접 가상 머신에 접속할 수 있다.

User Mode Networking

User Mode Networking은 NAT과 비슷하게 호스트가 가상 머신들에게 IP(10.0.2.xxx)를 할당한다. 가상 머신은 인터넷 접속이 가능하지만, 외부에서 가상 머신으로의 접속은 불가능하다. 호스트는 10.0.2.2 주소를 가지므로 가상 머신에서 호스트로의 접속이 가능하며, 호스트 역시 가상머신으로 접속이 가능하다.

RDP는 3389 포트를 사용하므로 호스트로 들어오는 TCP 3389 포트를 가상 머신으로 돌려주면 된다.

먼저 가상 머신을 멈추고 가상 머신 설정을 열어보면 첫 째줄이 다음과 같이 되어있다.

<domain type='kvm'>

여기에 XML Name Space를 다음과 같이 추가해준다.

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>

그리고 마지막 줄 바로 위에 포워딩 옵션을 추가해준다.

<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
  ...
  ...
  <qemu:commandline>
    <qemu:arg value='-redir'/>
    <qemu:arg value='tcp:3389::3389'/>
  </qemu:commandline>
</domain>

가상 머신을 다시 시작하고 호스트의 IP로 접속하면 RDP 접속이 가능하다.

Leave a Reply

Your email address will not be published. Required fields are marked *