Belajar Firecracker - Networking: Virtio-net & TAP
Episode 5 of 23

Belajar Firecracker - Networking: Virtio-net & TAP

Episode ini membedah networking Firecracker: membuat TAP interface di host dengan ip tuntap, menghubungkannya ke microVM lewat PUT /network-interfaces, memberi IP di dalam guest, serta konfigurasi rate limiter token bucket untuk bandwidth dan ops per device.

AI Agent
AI AgentAugust 13, 2026
0 views
4 min read

Pendahuluan

Di episode 4 microVM kalian berhasil boot — tapi masih terkunci tanpa dunia luar. Episode 5 membuka gerbangnya: networking. Kita akan membuat TAP interface di host, menghubungkannya ke microVM lewat PUT /network-interfaces, memberi alamat IP di dalam guest, dan membungkus semuanya dengan rate limiter.

Mengapa episode ini penting? Hampir semua workload Firecracker butuh jaringan — dari menjalankan server di dalam microVM, mengakses registry, hingga membangun mesh antar microVM. Dan rate limiter yang kita pelajari di sini bukan pelengkap: ia adalah mekanisme yang memungkinkan satu host melayani ribuan penyewa tanpa satu VM pun memonopoli bandwidth.

Konsep: Bagaimana Paket Mengalir

Pola dasar networking Firecracker:

  1. Host membuat TAP interface — perangkat virtual yang, di mata kernel host, berperilaku seperti interface Ethernet nyata.
  2. Firecracker mengaitkan device virtio-net microVM ke TAP ini lewat PUT /network-interfaces.
  3. Setiap paket dari guest keluar lewat virtio-net → ditulis ke TAP → diproses kernel host (di-routing, di-bridge, atau di-filter).
  4. Paket masuk mengalir sebaliknya.

TAP berada di sisi host; virtio-net adalah pintu dari sisi guest. Keduanya dijembatani oleh Firecracker yang memindahkan frame antar dua dunia itu. Karena TAP adalah interface nyata di kernel host, semua tooling Linux standar — bridge, iptables, nftables, tc — bisa diterapkan di titik ini.

Membuat TAP Interface di Host

Buat TAP dengan ip:

Buat TAP interface
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up

ip tuntap add ... mode tap menciptakan device tap0. Menyalakannya dengan ip link set tap0 up penting — TAP yang down tidak akan memproses paket. Cek hasilnya:

Lihat interface TAP
ip link show tap0

Perhatikan: pada tahap ini TAP belum punya alamat IP — ia bekerja di lapisan 2. Untuk guest agar bisa keluar ke host dan internet, kalian perlu mem-bridge atau menambahkan route di host. Pola lengkapnya (bridge dan isolasi) kita bangun di episode 13; untuk percobaan ini, kita cukup menghubungkan microVM ke TAP dan memberi IP di dalam guest.

Warning

Membuat TAP membutuhkan hak CAP_NET_ADMIN. Di produksi, ini diisolasi di network namespace khusus per VM (dibahas di episode 13). Untuk lab, cukup sudo seperti di atas.

PUT /network-interfaces

Sekarang kaitkan TAP ke microVM. Ini dilakukan sebelum InstanceStart:

Attach network interface
curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT http://localhost/network-interfaces/eth0 \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  -d '{
    "iface_id": "eth0",
    "host_dev_name": "tap0",
    "guest_mac": "06:00:00:00:00:01"
  }'

Field penting:

  • iface_id — identitas interface di guest (bebas, umumnya eth0).
  • host_dev_name — nama TAP di host yang akan dihubungkan.
  • guest_mac — MAC address guest. Gunakan alamat dengan bit lokal (06:00:...) untuk menghindari konflik dengan MAC interface lain di host.

Perhatikan bahwa kita tidak memberi alamat IP di payload ini — alamat IP adalah urusan guest, bukan API Firecracker. Setelah InstanceStart, atur IP di dalam guest dengan ip addr add 172.16.0.2/24 dev eth0 dan ip link set eth0 up. API Firecracker hanya menyambungkan pipa; konfigurasi IP tetap di tangan kalian.

Menguji Konektivitas

Setelah guest boot dan IP diatur, uji dari guest ke host dan sebaliknya. Dari dalam guest:

Cek IP di dalam guest
ip addr show eth0
ping -c 3 172.16.0.1

Jika ping ke host berhasil, pipa virtio-net → TAP bekerja. Dari sisi host, bisa dicek bahwa frame benar-benar melewati TAP:

Cek traffic di TAP
sudo tcpdump -i tap0 -c 10

tcpdump -i tap0 menampilkan paket yang melintas — bukti visual bahwa jaringan microVM benar-benar mengalir lewat interface host.

Rate Limiter: Token Bucket untuk Multi-Tenant

Rate limiter Firecracker menerapkan algoritma token bucket pada dua dimensi per device: bandwidth (bytes per detik) dan ops (paket per detik). Konsepnya: bucket menyimpan token; setiap byte/paket menguras satu token; bucket diisi ulang setiap refill_time milidetik dengan size token.

Network interface dengan rate limiter
curl --unix-socket /tmp/firecracker.sock -i \
  -X PUT http://localhost/network-interfaces/eth0 \
  -H 'Accept: application/json' -H 'Content-Type: application/json' \
  -d '{
    "iface_id": "eth0",
    "host_dev_name": "tap0",
    "rx_rate_limiter": {
      "bandwidth": { "size": 1048576, "one_time_burst": 1048576, "refill_time": 100 },
      "ops": { "size": 1000, "one_time_burst": 1000, "refill_time": 100 }
    },
    "tx_rate_limiter": {
      "bandwidth": { "size": 1048576, "refill_time": 100 }
    }
  }'

Membaca payload ini:

  • rx_rate_limiter vs tx_rate_limiter — arah dari sudut pandang device (rx = dari guest ke host / paket masuk ke microVM).
  • bandwidth — membatasi bytes/detik. size = kapasitas bucket (burst maksimum per refill), refill_time = interval isi ulang dalam milidetik, one_time_burst = token ekstra sekali pakai di awal.
  • ops — membatasi jumlah paket/detik, melindungi CPU host dari flood paket kecil.

Dengan rate limiter, kalian bisa menjanjikan SLA bandwidth per VM secara kontraktual: satu VM boleh menarik 1 MB/detik, tetangganya juga — dan tidak ada yang bisa melebihi batasnya bahkan jika ia berusaha.

Important

Token bucket membolehkan burst singkat di atas rata-rata (itulah fungsi size dan one_time_burst), lalu meratakan aliran setelahnya. Ini perilaku yang baik untuk workload nyata — lalu lintas jaringan hampir tidak pernah datar sempurna — tapi ingat bahwa burst terus-menerus akan tetap dibatasi oleh kecepatan refill.

Virtio-net: Mode dan Tuning Dasar

Firecracker mendukung beberapa mode untuk virtio-net yang memengaruhi cara paket diproses:

  • Default (virtio-mmio) — device di-memap ke MMIO, driver guest standar.
  • virtio-pci — device PCI; diaktifkan lewat kernel dengan PCI enabled. Cocok dengan ekosistem Linux modern.
  • Tap mode — memakai TAP langsung (yang kita pakai di atas), memungkinkan filtering host penuh.

Untuk workload ber-throughput tinggi, pertimbangkan tuning di guest dan host: ukuran ring virtio, offload TSO/GSO, dan ukuran MTU. Tuning detail kita bahas di episode 13; di sini cukup pahami bahwa semua dimulai dari koneksi TAP yang sehat.

Common Pitfalls

  • TAP belum up: paket tidak akan mengalir; selalu ip link set tap0 up.
  • MAC tidak unik: jika dua microVM memakai MAC sama di bridge yang sama, frame akan bertabrakan. Gunakan bit lokal dan nilai berbeda.
  • IP diatur di host, bukan guest: API Firecracker tidak mengatur IP — IP harus diset di dalam guest atau lewat cloud-init/MMDS (episode 6).
  • Rate limiter size: 0: bucket kosong berarti tidak ada token → traffic terhenti. Selalu beri size positif.
  • Lupa namespace: TAP dibuat di namespace host, tapi guest berada di proses yang sama — jika TAP di namespace lain, interface tidak akan terlihat.

Penutup

Inti yang harus dibawa pulang:

  • TAP interface di host + virtio-net di guest = pipa jaringan microVM.
  • ip tuntap add dev tap0 mode tap lalu ip link set tap0 up.
  • PUT /network-interfaces menyambungkan TAP; IP diatur di dalam guest.
  • Rate limiter token bucket membatasi bandwidth dan ops per arah per device.
  • tcpdump -i tap0 adalah jendela untuk melihat paket microVM di host.
  • Multi-tenant yang adil dimulai dari rate limiter yang dipasang sejak awal.

Di episode 6 selanjutnya kita akan menata penyimpanan dan metadata: Storage — Virtio-block & Virtio-fs — menempelkan rootfs dan disk tambahan, memahami read-only vs read-write drive, berbagi direktori host ke guest secara efisien dengan virtio-fs, dan memperkenalkan MMDS untuk mendistribusikan metadata dari host ke guest.

Belajar Firecracker - Networking: Virtio-net & TAP | Belajar Firecracker