Belajar LXC - Networking: bridge, veth & NAT
Episode 6 of 23

Belajar LXC - Networking: bridge, veth & NAT

Episode ini membedah jaringan LXC: bridge default lxcbr0 dengan NAT, pasangan veth yang menghubungkan container ke bridge, konfigurasi di /etc/lxc/default.conf dan lxc-usernet, mode network none/veth/macvlan/ phys, serta pengaturan IP statis atau DHCP.

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

Pendahuluan

Container bisa saja hidup tanpa jaringan, tapi container yang berguna hampir selalu butuh bicara dengan dunia luar. Di episode 6 kita membedah stack networking LXC: bridge lxcbr0 dengan NAT, pasangan veth yang menghubungkan container ke bridge, mode-mode network, dan cara memberi IP statis maupun DHCP. Ini adalah episode yang paling sering jadi sumber kebingungan di homelab — jadi kita bahas sampai tuntas.

Anatomi: Bridge, veth, dan NAT

lxcbr0: Jembatan Default

Secara default, LXC membuat bridge lxcbr0 di host — biasanya di jaringan 10.0.3.0/24. Bridge adalah "switch virtual": semua container yang menempel padanya bisa saling bicara, dan lalu lintas ke luar diteruskan oleh host.

Lihat bridge default
ip addr show lxcbr0

veth Pairs: Kabel Virtual

Setiap container mendapat satu veth pair: sepasang antarmuka virtual yang saling terhubung seperti ujung kabel. Satu ujung berada di dalam container (eth0), ujung lainnya menempel di bridge (vethXYZ). Ini cara LXC memberi container network namespace-nya sendiri (ingat konsep episode 2).

NAT: Pintu ke Dunia Luar

Lalu lintas keluar dari lxcbr0 ke jaringan luar di-NAT oleh host lewat iptables/nftables. Ini berarti container bisa keluar ke internet, tetapi dari luar, container tidak bisa diakses langsung — kecuali kalian menambahkan port forwarding (misal DNAT dari port host ke IP container).

Konfigurasi Jaringan

default.conf: Template untuk Semua Container

File /etc/lxc/default.conf menentukan pengaturan network yang dipakai setiap container baru. Isi tipikal pada instalasi Ubuntu:

Linux/etc/lxc/default.conf
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.hwaddr = 00:16:3e:xx:xx:xx
  • type = veth — memakai pasangan veth.
  • link = lxcbr0 — ujung host menempel ke bridge lxcbr0.
  • flags = up — antarmuka langsung diaktifkan saat container start.
  • hwaddr — MAC address (bisa diisi per-container untuk stabilitas DHCP lease).

lxc-usernet: Kuota Jaringan untuk Unprivileged

Untuk container unprivileged (yang tidak berhak membuat bridge di host), file /etc/lxc/lxc-usernet memberi izin kepada user biasa untuk membuat antarmuka jaringan:

Linux/etc/lxc/lxc-usernet
# <user> <type> <link> <parent bridge> <count>
devnull veth lxcbr0 10

Baris di atas mengizinkan user devnull membuat hingga 10 veth yang menempel ke lxcbr0. Tanpa entri ini, user non-root tidak bisa menjalankan container unprivileged dengan jaringan veth.

Warning

Gejala klasik: lxc-start gagal dengan error "Permission denied" atau "lxc-usernet: Operation not permitted". Penyebab paling umum adalah lxc-usernet tidak memiliki entri untuk user kalian. Perbaiki file tersebut lalu retry start.

Mode Network

LXC mendukung empat mode dasar:

  • none — container tanpa antarmuka sama sekali. Cocok untuk workload offline yang benar-benar terisolasi.
  • veth — pasangan veth ke bridge; mode paling fleksibel dan paling umum.
  • macvlan — antarmuka dengan MAC sendiri yang menempel langsung ke interface fisik (misal eth0). Container terlihat seperti device fisik di jaringan LAN. Perlu diingat: macvlan tidak bisa berkomunikasi dua arah dengan host pemiliknya secara langsung.
  • phys — antarmuka fisik host diserahkan penuh ke container (passthrough). Hanya satu container yang bisa memakai satu NIC fisik pada satu waktu.

Mode dipilih lewat lxc.net.0.type di config container:

LinuxContoh konfigurasi macvlan
lxc.net.0.type = macvlan
lxc.net.0.link = eth0
lxc.net.0.flags = up

IP Statis vs DHCP

DHCP

Cara paling mudah: biarkan container mengambil IP dari bridge. Pada container Ubuntu dengan systemd-networkd:

Linux/etc/netplan/10-lxc.yaml di dalam container
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true

IP Statis

Untuk IP yang stabil (dibutuhkan oleh port forwarding atau DNS), set IP statis di dalam container. Di host, config LXC bisa mendeklarasikan jaringan lewat lxc.net.0.ipv4.address:

LinuxDeklarasi IP statis di config container
lxc.net.0.type = veth
lxc.net.0.link = lxcbr0
lxc.net.0.flags = up
lxc.net.0.ipv4.address = 10.0.3.10
lxc.net.0.ipv4.gateway = 10.0.3.1

Selalu jaga konsistensi: deklarasi di config LXC dan konfigurasi di dalam container (netplan/NetworkManager) harus menunjuk IP yang sama.

Port Forwarding

Agar container bisa diakses dari luar NAT, tambahkan DNAT di host:

Forward port 8080 host ke 80 container
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.0.3.10:80
sudo iptables -A FORWARD -p tcp -d 10.0.3.10 --dport 80 -j ACCEPT

Tip

Untuk unprivileged container, memakai lxc.net.0.ipv4.address dengan lxc.net.0.ipv4.gateway adalah cara paling bersih — LXC mengatur rute dan ARP secara otomatis, tanpa perlu menyentuh netplan secara manual.

Troubleshooting Cepat

  • Container tanpa IP: cek ip addr di dalam container dan pastikan lxc.net.0.flags = up ada di config.
  • Container bisa keluar tapi tidak bisa diakses dari luar: itu perilaku NAT yang benar; tambahkan port forwarding.
  • macvlan tidak bisa ping host: itu batasan desain macvlan; gunakan veth bila butuh komunikasi host-container.

Penutup

Inti yang harus dibawa pulang:

  • lxcbr0 adalah bridge NAT default (10.0.3.0/24) untuk jaringan container.
  • veth pairs menghubungkan eth0 container ke bridge host.
  • /etc/lxc/default.conf menyediakan template network; /etc/lxc/lxc-usernet memberi kuota veth untuk user unprivileged.
  • Mode network: none, veth, macvlan, dan phys.
  • IP bisa statis (via config LXC + konfigurasi guest) atau DHCP; akses dari luar lewat port forwarding.

Di episode 7 selanjutnya kita akan membatasi resource dengan cgroupslxc.cgroup2.memory.max dan lxc.cgroup2.cpu.max di config container, lalu memverifikasi dengan lxc-cgroup (legacy) dan systemd-cgls di host. Inilah cara memastikan satu container tidak melahap seluruh RAM host.

Belajar LXC - Networking: bridge, veth & NAT | Belajar LXC