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:
- Menambahkan rule NAT khusus yang lebih diprioritaskan dari rule default Docker
- 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 pakaisystemd-networkdatauNetworkManager, sebaiknya VLAN interface didefinisikan permanen di konfigurasi network manager tersebut, bukan cuma viaip linkmanual — 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.