Skip to main content
  1. Posts/

Create Virtual Networks in Libvirt

·7 mins·
libvirt libvirt kvm
Table of Contents

Virtual network pada Libvirt bekerja berdasarkan konsep virtual network switch. Virtual network switch adalah perangkat lunak yang berjalan pada host fisik dan berfungsi menghubungkan host dengan virtual machine (guest).

Saat pertama kali menginstal Libvirt, Anda akan menemukan sebuah default virtual network dengan mode NAT. Mode ini dapat Anda ubah atau konfigurasi kembali menjadi beberapa mode lain, seperti berikut.

Bridge Mode
#

Pada mode Bridged, setiap virtual machine akan menerima alamat IP dari subnet yang sama dengan host fisik. Artinya, VM akan muncul di jaringan seperti halnya perangkat fisik biasa. Mode Bridge bekerja pada OSI Layer 2.

Contoh Network XML

<network>
  <name>net-bridge</name>
  <forward mode='bridge'>
    <interface dev="eth0"/>
    <interface dev="eth1"/>
    <interface dev="eth2"/>
  </forward>
</network>

Jika Anda ingin menggunakan bridge host yang sudah dibuat dan dikonfigurasi di luar Libvirt, gunakan contoh berikut:

<network>
  <name>net-bridge</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
</network>

NAT Mode
#

Secara default, virtual network Libvirt berjalan dalam mode NAT. Pada mode ini, host fisik melakukan IP masquerading, sehingga virtual machine dapat mengakses jaringan eksternal melalui alamat IP host. Namun perangkat yang berada di jaringan eksternal tidak dapat melakukan koneksi langsung ke VM di dalam host.

Contoh Network XML

<network>
  <name>net-nat</name>
  <forward dev='eth0' mode='nat'>
    <interface dev='eth0'/>
  </forward>
  <bridge name='virbr0' stp='on' delay='0' macTableManager='libvirt'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.128' end='192.168.122.254'>
        <lease expiry='10' unit='minutes'/>
      </range>
    </dhcp>
  </ip>
</network>

Jika atribut dev disetel, aturan firewall akan membatasi forwarding hanya melalui perangkat (NIC) yang disebutkan.

Route Mode
#

Pada mode Route, lalu lintas jaringan dari virtual machine akan diteruskan ke jaringan fisik melalui mekanisme IP routing pada host, tanpa NAT. Dengan demikian, host fisik bertindak sebagai router bagi subnet VM. Mode ini juga dapat menggunakan atribut dev untuk membatasi lalu lintas hanya melalui perangkat fisik (NIC) tertentu.

Mode Route bekerja pada OSI Layer 3.

Contoh Network XML

<network>
  <name>net-route</name>
  <forward dev='eth0' mode='route'>
    <interface dev='eth0'/>
  </forward>
  <bridge name='virbr0' stp='on' delay='0' macTableManager='libvirt'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.128' end='192.168.122.254'>
        <lease expiry='10' unit='minutes'/>
      </range>
    </dhcp>
  </ip>
</network>

Isolated Mode
#

Pada mode Isolated, jaringan virtual benar-benar terisolasi dari jaringan eksternal. Komunikasi hanya dapat dilakukan antar virtual machine di dalam host fisik yang sama. Perangkat atau jaringan di luar host tidak dapat mengakses VM, begitu pula sebaliknya.

Contoh Network XML

<network>
  <name>net-isolated</name>
  <bridge name='virbr0' stp='on' delay='0' macTableManager='libvirt'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.128' end='192.168.122.254'>
        <lease expiry='10' unit='minutes'/>
      </range>
    </dhcp>
  </ip>
</network>

Open Mode
#

Mode Open memiliki karakteristik serupa dengan mode Route, yaitu lalu lintas jaringan diteruskan ke jaringan fisik melalui mekanisme routing host, tanpa NAT. Perbedaannya, mode Open tidak menerapkan aturan firewall (iptables/nftables) apa pun. Karena tidak ada pembatasan firewall, atribut dev tidak dapat digunakan pada mode ini.

Contoh Network XML

<network>
  <name>network</name>
  <forward mode='open'/>
  <bridge name='virbr0' stp='on' delay='0' macTableManager='libvirt'/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.128' end='192.168.122.254'>
        <lease expiry='10' unit='minutes'/>
      </range>
    </dhcp>
  </ip>
</network>

Private Mode
#

Dalam mode Private, Libvirt menggunakan koneksi macvtap direct untuk menghubungkan setiap VM ke jaringan fisik. Perangkat fisik (NIC) yang digunakan harus ditentukan dalam sub-elemen <interface> di dalam <forward>.

Pada mode ini, VM tidak dapat saling berkomunikasi, bahkan jika berada pada host yang sama dan berada di subnet yang sama. Setiap VM hanya dapat berkomunikasi dengan jaringan fisik upstream melalui NIC tersebut.

Contoh Network XML

<network>
  <name>network</name>
  <forward mode='private'>
    <interface dev="eth0"/>
  </forward>
</network>

Vepa Mode
#

Pada mode Vepa (Virtual Ethernet Port Aggregator), Libvirt menggunakan koneksi macvtap direct untuk menghubungkan setiap VM ke jaringan melalui sebuah interface fisik. Perangkat fisik (NIC) yang digunakan harus ditentukan pada sub-elemen <interface> di dalam elemen <forward>.

Pada mode ini, semua trafik antar VM selalu dikirim keluar menuju switch fisik. Switch tersebut harus mendukung hairpin mode (kadang disebut reflective relay) untuk memungkinkan paket kembali masuk dan diteruskan ke VM lain. Tanpa dukungan hairpin, komunikasi antar VM tidak akan berfungsi.

Contoh Network XML

<network>
  <name>network</name>
  <forward mode='vepa'>
    <interface dev="eth0"/>
  </forward>
</network>

Passthrough Mode
#

Mode Passthrough juga menggunakan koneksi macvtap direct untuk menghubungkan VM ke jaringan fisik, namun tidak sama dengan PCI passthrough. Pada mode ini, interface fisik yang dipilih harus ditentukan melalui sub-elemen <interface> dari <forward>.

Mode Passthrough memberikan akses eksklusif ke interface fisik. Artinya, satu interface fisik hanya dapat digunakan oleh satu interface VM pada satu waktu. Libvirt secara otomatis melacak NIC mana yang sedang digunakan. Jika tidak ada lagi interface yang tersedia, maka VM tidak dapat dijalankan atau di-attach ke network tersebut dan akan muncul pesan error seperti berikut:

error: Failed to attach interface
error: internal error: network 'network' requires exclusive access to interfaces, but none are available

Contoh Network XML

<network>
  <name>network</name>
  <forward mode='passthrough'>
    <interface dev='eth0'/>
  </forward>
</network>

Isolating Ports
#

Sejak Libvirt 6.1.0, Anda dapat menambahkan elemen <port isolated> pada virtual network. Ketika elemen ini disetel ke yes (default: no), maka lalu lintas jaringan antar VM akan diisolasi, sehingga VM tidak dapat saling berkomunikasi. Namun, VM tetap dapat terhubung ke host fisik.

Fitur isolating ports dapat digunakan pada beberapa mode forward, termasuk: nat, route, open, bridge, ataupun jaringan tanpa forward (isolated mode).

Contoh Network XML

<network>
  <name>network</name>
  <forward mode='open'/>
  <bridge name='br1' stp='on' delay='0' macTableManager='libvirt'/>
  <port isolated='yes'/>
  <ip address='10.10.101.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='10.10.101.128' end='10.10.101.200'/>
    </dhcp>
  </ip>
</network>

Addressing
#

Berikut adalah beberapa elemen tambahan yang dapat digunakan pada mode nat, route, open, atau jaringan tanpa forward (isolated mode). Elemen-elemen ini digunakan untuk mengatur MAC address, DNS, DHCP, IPv4/IPv6, serta rute statis pada virtual network.

<!-- MAC address khusus untuk virtual network -->
<mac address='00:16:3E:5D:C7:9E'/>

<!-- Domain network untuk DNS resolver -->
<domain name="example.com"/>

<!-- Konfigurasi DNS -->
<dns>
  <txt name="example" value="example value"/>
  <forwarder addr="8.8.8.8"/>
  <forwarder domain='example.com' addr="8.8.4.4"/>
  <forwarder domain='www.example.com'/>
  <srv service='name' protocol='tcp' domain='test-domain-name'
       target='.' port='1024' priority='10' weight='10'/>
  <host ip='192.168.122.2'>
    <hostname>myhost</hostname>
    <hostname>myhostalias</hostname>
  </host>
</dns>

<!-- Konfigurasi IPv4 + DHCP -->
<ip address="192.168.122.1" netmask="255.255.255.0" localPtr="yes">
  <dhcp>
    <range start="192.168.122.100" end="192.168.122.254">
      <lease expiry='1' unit='hours'/>
    </range>
    <host mac="00:16:3e:77:e2:ed" name="foo.example.com" ip="192.168.122.10">
      <lease expiry='30' unit='minutes'/>
    </host>
    <host mac="00:16:3e:3e:a9:1a" name="bar.example.com" ip="192.168.122.11"/>
  </dhcp>
</ip>

<!-- Konfigurasi IPv6 -->
<ip family="ipv6" address="2001:db8:ca2:2::1" prefix="64" localPtr="yes"/>

<!-- Routing statis (IPv6) -->
<route family="ipv6" address="2001:db9:ca1:1::" prefix="64"
       gateway="2001:db8:ca2:2::2"/>

Network Namespaces
#

Elemen Namespace XML digunakan untuk menambahkan konfigurasi khusus dnsmasq ke dalam virtual network. Fitur ini memungkinkan Anda menyisipkan opsi-opsi tambahan yang tidak disediakan oleh Libvirt secara langsung.

Namun perlu diperhatikan bahwa Libvirt tidak memberikan dukungan resmi untuk konfigurasi dnsmasq melalui namespace ini. Akibatnya, stabilitas maupun kompatibilitas konfigurasi sepenuhnya menjadi tanggung jawab pengguna.

Namespace dnsmasq menggunakan deklarasi berikut:

xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'

Opsi-opsi yang diberikan dalam <dnsmasq:options> akan diteruskan langsung ke dnsmasq tanpa validasi dari Libvirt.

Contoh XML

<network xmlns:dnsmasq='http://libvirt.org/schemas/network/dnsmasq/1.0'>
  ...
  <dnsmasq:options>
    <dnsmasq:option value='log-queries'/>
    <dnsmasq:option value='log-dhcp'/>
    <dnsmasq:option value='log-facility=/var/log/dnsmasq.log'/>
    <dnsmasq:option value='max-ttl=300'/>
    <dnsmasq:option value='clear-on-reload'/>
    <dnsmasq:option value='mx-host=example.com,mail.example.com,0'/>
  </dnsmasq:options>
</network>

Bridge VLAN (VLAN Filtering Bridge)
#

Bridge VLAN digunakan jika Anda ingin:

  • Menjalankan banyak VLAN di satu interface fisik
  • Memberikan VLAN spesifik ke VM
  • Memanfaatkan VLAN filtering berbasis kernel Linux (lebih aman & efisien)

Membuat Bridge VLAN (br0)
#

Edit Netplan:

network:
  version: 2
  ethernets:
    enp3s0:
      dhcp4: no
  bridges:
    br0:
      interfaces: [enp3s0]
      parameters:
        vlan-filtering: true
      dhcp4: no

Terapkan:

netplan apply

Menambahkan VLAN pada Bridge
#

Misal kita ingin VLAN 10 untuk VM.

bridge vlan add dev br0 vid 10
bridge vlan add dev enp3s0 vid 10

Membuat Virtual Network VLAN 10 (network-vlan10.xml)
#

<network>
  <name>vlan10</name>
  <forward mode='bridge'/>
  <bridge name='br0'/>
  <virtualport type='openvswitch'/>
  <portgroup name='vlan10' default='yes'>
    <vlan>
      <tag id='10'/>
    </vlan>
  </portgroup>
</network>

Define:

virsh net-define network-vlan10.xml
virsh net-start vlan10
virsh net-autostart vlan10

Saat membuat VM, pilih Port Group: vlan10.

Open vSwitch (OVS)
#

Open vSwitch cocok untuk:

  • Data center / cloud-style networking
  • VLAN trunk, VXLAN, GRE, Geneve
  • Routing virtual advanced
  • Integrasi SDN, OpenFlow

Buat bridge OVS:

ovs-vsctl add-br ovs-br0

Tambahkan NIC fisik:

ovs-vsctl add-port ovs-br0 enp3s0

Membuat Virtual Network Open vSwitch (network-ovs.xml)
#

<network>
  <name>ovs-net</name>
  <forward mode='bridge'/>
  <bridge name='ovs-br0'/>
  <virtualport type='openvswitch'/>
</network>

Define:

virsh net-define network-ovs.xml
virsh net-start ovs-net
virsh net-autostart ovs-net

Membuat VLAN di Open vSwitch
#

Misal VLAN 20:

ovs-vsctl add-port ovs-br0 vlan20 tag=20 -- set interface vlan20 type=internal

XML untuk VM VLAN 20:

<interface type='bridge'>
  <source bridge='ovs-br0'/>
  <virtualport type='openvswitch'/>
  <vlan>
    <tag id='20'/>
  </vlan>
</interface>

Related

Install KVM and Virt-Manager
·5 mins
libvirt libvirt ubuntu kvm
Install WebVirtCloud
·2 mins
libvirt libvirt ubuntu kvm
Enable Nested Virtualization pada KVM
·1 min
libvirt kvm libvirt
Setup VM Menggunakan Virt-Manager CLI
·1 min
libvirt kvm libvirt
Cara Membuat Storage Volume di Libvirt
·2 mins
libvirt kvm libvirt
Setting VirtioFS untuk Shared Folder VM
·2 mins
libvirt kvm libvirt