Ubuntu에서 사용하는 QEMU/KVM 가상머신 게스트OS와 호스트OS를 동일한 네트워크에 연결하고 싶은가요? QEMU/KVM으로 구동되는 가상머신에서 호스트OS와 사용하는 IP 대역을 동일하게 사용하기 위한 Ubuntu 브릿지 설정 방법을 알아보겠습니다.
목차
본 문서는 2023년 1월 28일에 보다 이해하기 쉽게 개정했습니다.
Ubuntu 브릿지 설정이 필요한 경우
QEMU/KVM의 Virtual Machine Manager를 이용해서 가상머신을 생성할 때 네트워크 장치를 별도로 설정하지 않으면 NAT를 사용해서 네트워크를 구성하게 됩니다. 예를 들어, NAT를 이용하면 호스트 OS는 IP 대역을 172.30.18.xxx를 사용하는 한편, 게스트 OS의 IP대역은 192.168.98.xxx를 사용한다든지 하는 방식으로 사용하게 됩니다. 게스트에서는 호스트에 172.30.18.xxx로 접근이 가능하며, 호스트에서는 게스트에 192.168.98.xxx로 접근할 수 있습니다.
그리고 macvtap을 이용하면 호스트 OS와 게스트 OS를 동일 네트워크로 연결할 수는 있지만 게스트 OS에서 호스트 OS에 엑세스 하지 못하는 문제가 생깁니다. 그래서 결론적으로 호스트 운영체제로 사용하는 Ubuntu에 브릿지 설정을 해 주어야 하며, KVM에도 호스트에서 설정한 브릿지를 사용하도록 설정해야 브릿지를 통해 동일 네트워크를 사용할 수 있습니다.
무엇보다도 동일 IP 대역으로 설정해서 관리의 편의를 도모하고 싶다면, 호스트 OS인 Ubuntu 브릿지 설정이 꼭 필요합니다.
Ubuntu 브릿지 설정 개요
전체 브릿지 설정 과정은 아래와 같은 방식으로 진행합니다.
- 호스트 OS: 브릿지 넷필터 비활성화
- 호스트 OS: 브릿지 추가
- QEMU/KVM에서 브릿지 선택
호스트OS Ubuntu 브릿지 설정하기
우선 저의 경우에는 호스트 OS로 Ubuntu 22.04, 그리고 Virtual Machine Manager를 이용해서 VM을 QEMU/KVM으로 구동하였습니다. 호스트 OS에서는 브릿지 넷필터를 비활성화해 준 후, 브릿지를 추가해 주어야 합니다.
브릿지 넷필터 비활성화
우선 브릿지 넷필터 비활성화가 필요합니다. 다른 설정을 아무리 잘해도 이 문제 때문에 계속 네트워크 설정이 안 되는 문제를 겪었다. 모든 트래픽을 브릿지로 보내고 VM으로 보내려면 이 작업을 꼭 해야 합니다. 아래의 내용을 /etc/sysctl.d/bridge-filter.conf로 저장합니다.
net.bridge.bridge-nf-call-ip6tables=0
net.bridge.bridge-nf-call-iptables=0
net.bridge.bridge-nf-call-arptables=0
/etc/sysctl.d/bridge-filter.conf이제는 /etc/udev/rules.d/99-bridge-filter.rules 파일에 아래와 같이 작성합니다.
ACTION=="add", SUBSYSTEM=="module", KERNEL=="br_netfilter", RUN+="/sbin/sysctl -p /etc/sysctl.d/bridge-filter.conf"
/etc/udev/rules.d/99-bridge-fileter.rules이제 재부팅 해주면 반영됩니다.
sudo reboot
ShellScript브릿지 추가: GUI 방식
이제 호스트 운영체제인 Ubuntu에 브릿지를 추가해 줄 차례입니다. GUI 어플리케이션인 nm-connection-editor를 사용할 것입니다. 혹시나 GUI를 이용할 수 없는 경우에는 다음 섹션의 CLI 방식으로 브릿지 추가하는 방법을 확인하시기 바랍니다. 그럼 nm-connection-editor를 실행합니다.
새로운 연결을 추가해 주기 위해서 + 버튼을 눌러줍니다.
Connection Type은 Virtual의 Bridge로 선택한 후, Create를 눌러서 Bridge Connection을 추가해 줍니다.
저는 Connection Name과 Interface name을 모두 bridge0로 변경했습니다. 여러분이 사용하길 원하는 이름이 있다면 원하는대로 적어주셔도 됩니다. 단, 가급적 공백 없이 작성하시는 편이 좋습니다.
이제 Bridged connections의 Add 버튼을 눌러주면, 아래와 같이 Connection Type을 선택하는 창이 뜹니다. Connection Type으로 Ethernet을 선택해 주고, Create를 눌러줍니다.
아래와 같이 창이 뜨면, Connection name에 eth-bridge0를 입력해 줍니다. 그리고 Device에 유선 연결이 되어 있는 NIC(network interface card)를 선택해 줍니다. 저의 경우에는 enp1s0를 선택해 주었습니다.
이제 Save를 눌러서 Ethernet Connection을 저장해 주면, 아래 그림과 같이 Bridged connections에 저장한 eth-bridge0이 추가됩니다.
호스트 브릿지 IP 설정이 자동으로 되게 한다면 다음 단계는 건너 뛰어도 됩니다. 만약 특정 IP를 사용하고 있다면 다음과 같이 설정해 주시면 됩니다. IPv4 Settings 탭을 선택하고 Method를 Manual로 변경해 줍니다. Addresses에 Add를 누른 후 브릿지의 IPv4를 설정해 줍니다. 저는 192.168.0.40으로 설정해 보겠습니다. Netmask는 255.255.255.0를 입력할 것이므로 24를 입력해 주었습니다. DNS Server는 저는 국내에 있는 Dacom 네임서버 164.124.101.2로 설정해 주었습니다. eth-bridge0을 활성화시키면 여기에서 설정한 bridge0의 IP 주소를 호스트 OS의 IP로 사용하게 됩니다.
Save를 눌러서 저장해 준 후, nm-connection-editor를 종료하고 nm-connection-editor를 다시 실행하면, 아래 그림과 같이 Bridge에 bridge0이 추가되었고, Ethernet에 eth-bridge0이 추가 된 것을 확인할 수 있습니다.
ifconfig 명령으로 추가된 bridge0과 NIC로 사용하던 enp1s0의 설정이 아래와 같은 것을 확인할 수 있습니다.
이제 마지막으로 terminal을 열어서 eth-bridge0을 활성화 해줍니다.
nmcli c up eth-bridge0
ShellScript활성화가 잘 됐는지 확인해 보겠습니다.
nmcli c show
ShellScripteth-bridge0을 활성화하기 전에는 eth-bridge0가 활성화되지 않은 것을 볼 수 있습니다. 활성화를 하고 난 후에는 Wired connection 1이 자동으로 비활성화되며, Wired connection 1에 붙어있던 DEVICE enp1s0이 eth-bridge0으로 가서 붙은 것을 확인할 수 있습니다.
그리고 ip a 명령어를 사용했을 때에도 아래와 같이 enp1s0에 bridge0 state UP 이라고 나오는 것을 확인할 수 있습니다.
그리고 참고로 eth-bridge0을 비활성화하고 싶을 땐 nmcli c down 명령어를 다음과 같이 사용하면 됩니다.
nmcli c down eth-bridge0
ShellScript브릿지 추가: CLI 방식
nm-connection-editor는 GUI 방식으로 제작된 도구이지만, 사실 그 안에서 설정하는 모든 것은 cli로 처리되는 것과 동일하죠. 그럼 CLI 명령어인 nmcli를 사용해서 브릿지 설정하는 방법을 확인해 보겠습니다.
아래 명령을 내리면 GUI 도구인 nm-connection-editor에서 했던 작업과 동일한 결과가 됩니다.
nmcli c add type bridge ifname bridge0 con-name bridge0 ip4 192.168.0.40/24 gw4 192.168.0.1 ipv4.dns 164.124.101.2
ShellScript내용을 하나씩 살펴보겠습니다. c add type bridge는 브릿지 타입의 connection을 추가하라는 것입니다. ifname bridge0은 interface name을 bridge0으로 하겠다는 것이고, con-name bridge0은 connection name을 bridge0으로 하겠다는 것입니다. ip4 192.168.0.40/24는 IP와 Netmask를 각각 설정하는 것입니다. gw4 192.168.0.1은 게이트웨이 주소를 설정하는 부분입니다. ipv4.dns 164.124.101.2는 DNS 설정을 하는 부분입니다.
이제 eth-bridge0 세팅을 하겠습니다. c add type ethernet은 ethernet 타입으로 하겠다는 것이며, slave-type은 bridge로 설정해 주며, connection name은 eth-bridge0이며, interface name은 enp1s0을 사용할 것이며 master는 bridge0이라는 의미입니다.
nmcli c add type ethernet slave-type bridge con-name eth-bridge0 ifname enp1s0 master bridge0
ShellScript여기까지 매우 간단하죠? 이제 브릿지를 구동해 주면 GUI에서 설정했을 때와 동일하게 동작합니다.
nmcli c up eth-bridge0
ShellScriptQEMU/KVM Virtual Machine Manager 브릿지 설정
호스트 운영체제에서 Bridge를 설정해 주었다면, 이제는 설정해 준 Bridge를 QEMU/KVM에서 사용하겠다고 설정해 주어야 합니다.
NIC 메뉴를 선택한 후, 우측에 Virtual Network Interface에 있는 Network source를 Bridge device…로 선택해 줍니다. Device name은 호스트에서 설정해 준 bridge0을 입력해 줍니다. Device model은 virtio를 선택해 줍니다. 우측 하단의 Apply를 눌러서 적용해 줍니다.
이제 Ubuntu 브릿지 설정을 모두 마쳤습니다. 호스트와 VM 양쪽 모두 브릿지 네트워크 설정을 했습니다. 이제 동일한 IP 대역을 사용하도록 했으니, 편하게 이용하면 됩니다.
관련 자료
Ubuntu의 nmcli man 페이지를 참고했습니다.