Mengatasi Docker IPVLAN Tidak Bisa Diakses dari Host (Fix Permanen dengan Netplan + Systemd)
Mengatasi Docker IPVLAN Tidak Bisa Diakses dari Host (Fix Permanen dengan Netplan + Systemd)

Mengatasi Docker IPVLAN Tidak Bisa Diakses dari Host (Fix Permanen dengan Netplan + Systemd)

Tags
Docker
sysops
Published
April 4, 2023
Author

๐Ÿ“Œ Latar Belakang

Saat menggunakan Docker dengan driver ipvlan, sering muncul masalah:
โŒ Host tidak bisa mengakses container
Padahal:
  • Container bisa akses jaringan luar โœ…
  • Device lain bisa akses container โœ…
  • Tapi host sendiri tidak bisa โŒ
Ini bukan bug, tapi memang behavior default dari ipvlan.

๐Ÿง  Penyebab Masalah

ipvlan bekerja di level kernel dengan isolasi network:
  • Container langsung attach ke parent interface (misalnya ens192)
  • Host tidak dianggap bagian dari network tersebut
  • Tidak ada route internal host โ†’ container

๐ŸŽฏ Solusi

Solusinya adalah:
โœ… Tambahkan interface ipvlan di host

โš™๏ธ Studi Kasus

  • Interface: ens192
  • IP host: 10.21.2.50/16
  • Network Docker: 10.21.0.0/16
  • IP tambahan host: 10.21.2.60/16

๐Ÿ”ง Step 1 โ€” Konfigurasi Netplan (Optional)

Jika network sudah dikonfigurasi, bisa skip step ini.
Edit file: /etc/netplan/01-netcfg.yaml
network: version: 2 renderer: networkd ethernets: ens192: addresses: - 10.21.2.50/16 gateway4: 10.21.0.1 nameservers: addresses: [8.8.8.8, 1.1.1.1]
Apply:
netplan apply

โš ๏ธ Catatan Penting

Netplan tidak mendukung ipvlan secara native, jadi kita perlu workaround menggunakan script + systemd.

๐Ÿ”ง Step 2 โ€” Buat Script IPVLAN

Buat file:
nano /usr/local/bin/ipvlan-setup.sh
Isi:
#!/bin/bash ip link add ipvlan0 link ens192 type ipvlan mode l2 ip addr add 10.21.2.60/16 dev ipvlan0 ip link set ipvlan0 up
Berikan permission:
chmod +x /usr/local/bin/ipvlan-setup.sh

๐Ÿ”ง Step 3 โ€” Buat Systemd Service

Buat file:
nano /etc/systemd/system/ipvlan.service
Isi:
[Unit] Description=Setup IPVLAN interface After=network.target [Service] Type=oneshot ExecStart=/usr/local/bin/ipvlan-setup.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target

๐Ÿ”ง Step 4 โ€” Enable Service

systemctl daemon-reexec systemctl daemon-reload systemctl enable ipvlan systemctl start ipvlan

๐Ÿ” Verifikasi

ip addr show ipvlan0
Output yang diharapkan:
ipvlan0: ... inet 10.21.2.60/16

๐Ÿงช Testing

Misalnya container:
docker run -d \ --network myipvlan \ --ip 10.21.2.100 \ nginx
Test dari host:
ping 10.21.2.100 curl 10.21.2.100

๐Ÿ”ฅ Tips Tambahan

โœ… Hindari duplicate interface

Update script:
ip link show ipvlan0 || ip link add ipvlan0 link ens192 type ipvlan mode l2

โœ… Disable rp_filter (jika perlu)

sysctl -w net.ipv4.conf.all.rp_filter=0 sysctl -w net.ipv4.conf.ens192.rp_filter=0

๐Ÿš€ Kesimpulan

  • ipvlan tidak mengizinkan host akses container secara default
  • Solusinya adalah menambahkan interface ipvlan di host
  • Karena netplan tidak support, gunakan systemd untuk persistence
  • Setup ini stabil dan cocok untuk production

๐Ÿงฉ Bonus Insight

Gunakan ipvlan jika:
  • Ingin container punya IP sendiri
  • Tidak ingin NAT
  • Butuh performa tinggi (low overhead)
Hindari jika:
  • Banyak komunikasi host โ†” container
  • Infrastruktur kompleks (overlay, Kubernetes, dll)

โœ๏ธ Penutup

Dengan setup ini, kamu bisa:
โœ… Akses container dari host
โœ… Tetap menggunakan ipvlan
โœ… Konfigurasi tetap setelah reboot

Happy hacking ๐Ÿš€