VirtualBox bridge Networking: 낮은 CPU 사용율 & Speed Up

VirtualBox 기본 네트워크는 NAT 방식입니다. 이는 편리하긴 하지만 bridge방식에 비해 CPU사용률이 좀 높고, 속도에도 영향을 미치고있지요. bridge 방식의 Network를 사용하면 네트워크 사용시 CPU 사용률이 10~15% 사이고, 속도도 제법 괜찮게 나옵니다. [b:1ahzrbod]단, 아래의 예는 무선랜을 사용하는 노트북에서 진행되었습니다[/b:1ahzrbod].

우선, 자신이 사용하는 네트워크의 자세한 사항이 아래와 같다고 가정합니다. (각자 맞춰서 사용하세여)

[quote:1ahzrbod]

  • 공유기를 사용하며,
  • 내부 네트워크는 192.168.0.0,
  • Ubuntu host는 192.168.0.1 을 할당받았고
  • Gateway: 192.168.0.254, Netmask: 255.255.255.0
  • 무선랜 디바이스명은 wlan0/quote:1ahzrbod라고 가정합니다.

[b:1ahzrbod]01)[/b:1ahzrbod] IP Forwarding 설정및 parprouted 를 설치합니다.

[code:1ahzrbod]

sysctl -w net.ipv4.ip_forward=1

apt-get install parprouted[/code:1ahzrbod]

[b:1ahzrbod]02)[/b:1ahzrbod] 가상 디바이스를 만듭니다.

[code:1ahzrbod]

VBoxTunctl -b -u $USER (사용자명으로 접근이 허가된 tapN 디바이스가 만들어집니다; tap0, tap1,등등) [/code:1ahzrbod]

[b:1ahzrbod]03)[/b:1ahzrbod] 가상 디바이스의 네트워크를 설정합니다. (tap 디바이스의 번호는 02)번 과정에서 만들어진 것으로 하세요)

[code:1ahzrbod]

ip link set tap0 up (위 절차에 의해서 만들어진 디바이스가 tap0 일경우)

ip addr add 192.168.0.200/24 dev tap0 (IP는 적절히 알아서 주세요)

parprouted wlan0 tap0

route add -net 192.168.0.0 netmask 255.255.255.0 tap0

[/code:1ahzrbod]

[b:1ahzrbod]04)[/b:1ahzrbod] VirtualBox 제어판을 띄우고, 동작시킬 VM의 설정중에서 ‘네트워크’ 설정을 아래와 같이 바꾸세요

[quote:1ahzrbod] - NAT 방식에서 호스트 디바이스 사용

  • 디바이스명은 tap0 로 입력
    [attachment=0:1ahzrbod]screenshot1.png[/attachment:1ahzrbod][/quote:1ahzrbod]

[b:1ahzrbod]05)[/b:1ahzrbod] 해당 VM을 실행한후, 네트워크 설정을 DHCP로 잡지말고, STATIC으로 주세요

  • IP: 192.168.0.201
  • GATEWAY: 192.168.0.254, MASK: 255.255.255.0, DNS: 168.126.63.1 ( 알아서, 적당히 )

[b:1ahzrbod]06)[/b:1ahzrbod] OK. 됐습니다.

  • bridge 제거방법

[code:1ahzrbod]

ifconfig tap0 down

VBoxTunctl -d tap0

sysctl net.ipv4.ip_forward=0

pkill parprouted [/code:1ahzrbod]

  • 적절히 스크립트 만들어서 사용하세여.

좋은 글입니다.

저도 Virtualbox에서의 브릿지모드에 대해서 팁을 남기려고 했었는데, 개인적으로는 "잘’ 설명하지 않으면 오히려 여러가지 문제가 될 것 같아서, 관련 지식이 좀 더 모이면 해볼까 생각하고 있었습니다. 현재 네트워크 상황을 판단해서 브릿지 모드를 설정하는 스크립트를 만들까 하는데…아직 실력이 안되네요. ㅠㅠ
언젠가 유선랜과 무선랜 통합 브릿지 모드에 설정에 대한 쉬운 팁… 시간이 된다면 아마도 올릴겁니다. -0-

그래도 그전에 몇가지 알리고자 하는 것이 있어서
죄송하지만… 몇가지 덧붙이겠습니다.

위 글은 "[b:3hdagde7]무선랜[/b:3hdagde7]"을 위한 브릿지 모드이고, 유선랜 환경이라면 virtualbox의 도움말에 우분투를 위한 방법이 있습니다.
무선랜과 유선랜의 설정 방법이 다르니 꼭 도움말이나 우분투 공식 위키 문서를 참고하시는 것이 좋습니다.(영문입니다.)

https://help.ubuntu.com/community/VirtualBox

저는 /etc/network/if-up-d/vbox_network 파일에 위 스크립트(브릿지 생성하는 것만) 무선랜이 연결되면 자동으로 실행되는데, 제 스크립트를 가지고 간단히 몇가지 설명을 하자면,

[code:3hdagde7]#! /bin/sh

sysctl net.ipv4.ip_forward=1
VBoxTunctl -b -u xbit # 각 가상머신(게스트OS) 개수만큼, 가상머신과
VBoxTunctl -b -u xbit # 연결할 브릿지(다리)역할을 하는 가상 네트워크 인터페이스를 만듭니다.
VBoxTunctl -b -u xbit
ip link set tap0 up # 가상 인터페이스들을 활성화하고
ip link set tap1 up
ip link set tap2 up
ip addr add 192.168.0.10/24 dev tap0 # 가상 인터페이스들에 고정 ip를 할당
ip addr add 192.168.0.12/24 dev tap1
ip addr add 192.168.0.14/24 dev tap2
parprouted wlan0 tap0 # 각 가상 인터페이스들을 무선랜 장치와 연결합니다.
parprouted wlan0 tap1 # 가상 인터페이스와 가상 머신의 네트워크 장치의 연결은
parprouted wlan0 tap2 # 가상 머신의 네트워크 설정에 "호스트 인터페이스"에 가상 인터페이스 이름을 넣으면 됩니다.
route add -net 192.168.0.11 netmask 255.255.255.255 metric 50 tap0
route add -net 192.168.0.13 netmask 255.255.255.255 metric 50 tap1
route add -net 192.168.0.15 netmask 255.255.255.255 metric 50 tap2
[/code:3hdagde7]

보시면 알겠지만 게스트 OS(가상 머신) 숫자만큼 브릿지로 사용될 장치를 만들고, ip를 할당하는 등의 작업을 해주고 있습니다.
그리고 마지막 route 명령이 좀 다를 것입니다.

[quote:3hdagde7]
route add -net 192.168.0.11 netmask 255.255.255.255 metric 50 tap0
route add -net 192.168.0.13 netmask 255.255.255.255 metric 50 tap1
route add -net 192.168.0.15 netmask 255.255.255.255 metric 50 tap2
[/quote:3hdagde7]

여기에서 각 IP는 가상 머신에 지정된 고정 IP들입니다.(192.168.0.11, 192.168.0.12, …)
마지막의 가상 인터페이스 이름은 각 가상 머신과 연결되는 가상 인터페이스를 넣어 줍니다.(tap0, tap1, …)
route 명령과 IP의 라우팅에 관해서 설명하자면
관련 지식도 짧고…설명 하기도 복잡해서 하지 않겠습니다.
그냥 네트워크에 흐르는 데이터들이 어디로 가야 하는지 경로를 설정하는 명령이라고 간단히 설명하겠습니다.
그런데 우분투 공식 위키나 구글 검색에서 본 글들은 andrwj님의 팁처럼 아래와 같이 되어 있습니다.

[quote:3hdagde7]route add -net 192.168.0.0 netmask 255.255.255.0 tap0[/quote:3hdagde7]

가상 머신을 돌리고 있는 상태에서 samba로 공유 디렉토리 접근이 되지 않아서, ping을 때려봐도 응답이 없어서 살펴보다 발견한 것인데,
저렇게 명령이 실행되어 경로 설정을 해버리면 가상 머신의 게스트 운영체제안에서는 문제가 없지만 호스트 운영체제(그러니깐 virtualbox를 실행하는, 실제 컴퓨터의 운영체제)에서 내부 네트워크의 실제 다른 컴퓨터에 접근을 할 수가 없습니다.(현재 노트북이니깐, 공유기에 물려 사용하고 있는 다른 컴퓨터들과 통신 불가)

그리고 또한 저같이 여러개의 가상머신을 돌릴 경우, 각 가상 인터페이스마다 바로 위 코드로 route명령을 내리면,
마지막 route 명령의 가상 인터페이스를 사용하는 가상 머신만 네트워크가 가능할 겁니다.
(테스트해보지 않았지만, 아마 그럴겁니다.)

걍 관련 배경지식 모두 무시하고 제가 한 것 같이 각각의 가상 머신의 ip와 가상 머신과 연결되는 가상 인터페이스에 대해 route 명령을 내려주면 아무 문제 없이, 실제 컴퓨터들 사이에서 뿐만 아니라, 실제 컴퓨터들과 가상머신 사이에서도 네트워크가 가능 합니다.(하지만 다른 실제 컴퓨터와 가상 머신과의 통신을 하려면 ip를 지정해서 연결해야 합니다. 쉽게 말해서 samba를 이용하거나, 윈도우에서의 공유디렉토리 접근에서 컴퓨터 이름으로 접근하는 것이 아니라 ip로 직접 지정해야 한다는 것입니다.)

[quote="xbit":1p87ml0w]
가상 머신을 돌리고 있는 상태에서 samba로 공유 디렉토리 접근이 되지 않아서, ping을 때려봐도 응답이 없어서 살펴보다 발견한 것인데,
저렇게 명령이 실행되어 경로 설정을 해버리면 가상 머신의 게스트 운영체제안에서는 문제가 없지만 호스트 운영체제(그러니깐 virtualbox를 실행하는, 실제 컴퓨터의 운영체제)에서 내부 네트워크의 실제 다른 컴퓨터에 접근을 할 수가 없습니다.(현재 노트북이니깐, 공유기에 물려 사용하고 있는 다른 컴퓨터들과 통신 불가)
[/quote:1p87ml0w]
네, 브릿지만 밖으로 보이기때문에, 실제 VM 안으로는 못들어가지요.
이것은, 바로 그점을 원하기 때문입니다. 즉, VirtualBox의 VM을 서버용으로 쓰는게 아니라, Private용으로 쓰고싶기땜에 이렇게 하고싶을때도 있을거예여. VM을 서버처럼 쓰는 법은 xbit님께서 기술한 방법대로해도 문제없을것으로 생각합니다 :slight_smile:

[quote="xbit":1p87ml0w]
.(하지만 다른 실제 컴퓨터와 가상 머신과의 통신을 하려면 ip를 지정해서 연결해야 합니다. 쉽게 말해서 samba를 이용하거나, 윈도우에서의 공유디렉토리 접근에서 컴퓨터 이름으로 접근하는 것이 아니라 ip로 직접 지정해야 한다는 것입니다.)[/quote:1p87ml0w]
또다른 방법중 하나는, HOST와 VM 사이를 [url=http://www.openvpn.org:1p87ml0w]OpenVPN[/url:1p87ml0w]으로 묶어버리는 방법입니다.

Public Service를 위한 VM이 아니라, 내부용도라면 VM의 접근을 통제하기 젤 쉬운방법은 걍 브릿지 안으로 숨겨버리는 것이겠져. 그러면서도 외부의 허가된 누군가/또는 장소에는 접근을 허락하고 싶을때, OpenVPN 패키지를 사용하여 암호화된 터널링으로 묶어버려서 쉽게 IP가 아닌, 이름으로 접근이 가능합니다.

그 남자(들)에게서 고수의 향기를 느꼈다…?

두 분 좋은 팁 감사드립니다~ :)