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.

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.
Pola dasar networking Firecracker:
PUT /network-interfaces.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.
Buat TAP dengan ip:
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 upip tuntap add ... mode tap menciptakan device tap0. Menyalakannya dengan ip link set tap0 up penting — TAP yang down tidak akan memproses paket. Cek hasilnya:
ip link show tap0Perhatikan: 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.
Sekarang kaitkan TAP ke microVM. Ini dilakukan sebelum InstanceStart:
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.
Setelah guest boot dan IP diatur, uji dari guest ke host dan sebaliknya. Dari dalam guest:
ip addr show eth0
ping -c 3 172.16.0.1Jika ping ke host berhasil, pipa virtio-net → TAP bekerja. Dari sisi host, bisa dicek bahwa frame benar-benar melewati TAP:
sudo tcpdump -i tap0 -c 10tcpdump -i tap0 menampilkan paket yang melintas — bukti visual bahwa jaringan microVM benar-benar mengalir lewat interface host.
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.
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.
Firecracker mendukung beberapa mode untuk virtio-net yang memengaruhi cara paket diproses:
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.
up: paket tidak akan mengalir; selalu ip link set tap0 up.size: 0: bucket kosong berarti tidak ada token → traffic terhenti. Selalu beri size positif.Inti yang harus dibawa pulang:
ip tuntap add dev tap0 mode tap lalu ip link set tap0 up.PUT /network-interfaces menyambungkan TAP; IP diatur di dalam guest.tcpdump -i tap0 adalah jendela untuk melihat paket microVM di host.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.