Mengarahkan NAT Docker Default Bridge Lewat VLAN Interface Tertentu

Mengarahkan NAT Docker Default Bridge Lewat VLAN Interface Tertentu

Secara default, Docker bikin network bridge (biasanya docker0) yang traffic-nya di-NAT keluar lewat interface yang jadi default route di host. Tapi kadang kita punya kebutuhan spesifik: traffic dari container harus keluar lewat interface VLAN tertentu, bukan interface utama.

Artikel ini bakal bahas cara mengarahkan NAT dari default bridge Docker supaya keluar lewat VLAN interface pilihan kita.

Konsep Dasar

Docker otomatis membuat rule MASQUERADE di iptables untuk subnet bridge-nya, dan itu keluar lewat default gateway host. Untuk memaksanya lewat VLAN interface (misal eth0.20), kita perlu:

  1. Menambahkan rule NAT khusus yang lebih diprioritaskan dari rule default Docker
  2. Mengatur routing supaya traffic dari subnet Docker memang diarahkan ke VLAN tersebut

Langkah-Langkah

1. Cek Subnet Bridge Docker

docker network inspect bridge | grep Subnet
# contoh output: 172.17.0.0/16

2. Pastikan VLAN Interface Sudah Aktif di Host

ip link show

# Kalau belum ada, buat VLAN interface dulu
sudo ip link add link eth0 name eth0.20 type vlan id 20
sudo ip link set eth0.20 up
sudo ip addr add 192.168.20.2/24 dev eth0.20
Catatan: kalau host pakai systemd-networkd atau NetworkManager, sebaiknya VLAN interface didefinisikan permanen di konfigurasi network manager tersebut, bukan cuma via ip link manual — supaya nggak hilang setelah reboot.

3. Tambahkan Rule MASQUERADE Khusus

Insert rule ini di baris paling atas POSTROUTING chain, supaya dieksekusi sebelum rule default milik Docker:

sudo iptables -t nat -I POSTROUTING 1 -s 172.17.0.0/16 -o eth0.20 -j MASQUERADE

4. Atur Routing Policy (Kalau Diperlukan)

Kalau VLAN tersebut punya gateway sendiri dan kita mau traffic dari subnet Docker lewat situ:

# Cek default route saat ini
ip route show default

# Buat routing table khusus untuk traffic dari subnet Docker
sudo ip route add default via 192.168.20.1 dev eth0.20 table 100
sudo ip rule add from 172.17.0.0/16 table 100

5. Pastikan IP Forwarding Aktif

sudo sysctl net.ipv4.ip_forward=1

Biasanya ini sudah otomatis aktif kalau Docker sudah berjalan normal, tapi tidak ada salahnya dicek ulang.

Testing

Jalankan container test untuk cek IP publik yang terdeteksi:

docker run --rm nicolaka/netshoot curl -4 ifconfig.me

Kalau hasilnya sesuai dengan IP publik yang keluar dari jalur VLAN 20, berarti konfigurasi sudah berhasil.

Catatan Tambahan

  • Rule iptables yang dibuat manual seperti ini tidak persisten setelah reboot kecuali disimpan lewat iptables-persistent, netfilter-persistent, atau di-inject ulang lewat script startup.
  • Kalau butuh isolasi network yang lebih ketat per-VLAN (container punya IP sendiri di segment yang sama dengan VLAN), pendekatan macvlan bisa jadi alternatif yang lebih clean dibanding modifikasi NAT default bridge.
  • Selalu sesuaikan subnet, interface, dan gateway dengan konfigurasi jaringan masing-masing — nilai di atas cuma contoh.

Ditulis berdasarkan pengalaman troubleshooting setup Docker networking di homelab.