LXD / Incus ↔ Docker — Konflik Firewall
Permasalahan
Ketika Docker dan LXD/Incus berjalan bersama di satu host, Docker akan mengatur policy chain iptables `FORWARD` menjadi `DROP` dan hanya meng-ACCEPT trafik untuk bridge miliknya sendiri. Paket forward dari bridge incus/lxd (`lxdbr0`) tidak cocok dengan rule apapun sehingga jatuh ke policy DROP tadi, sehingga container/VM LXD kehilangan akses internet keluar (outbound) — walaupun host itu sendiri baik-baik saja dan bridge LXD sudah punya `ipv4.nat=true`. Solusinya adalah meng-ACCEPT bridge LXD di dalam chain `DOCKER-USER` milik Docker, lalu membuatnya persistent (bertahan setelah reboot).
PENTING: Ini bukan masalah NAT, DNS, atau konfigurasi LXD. `ipv4.nat=true` dan `net.ipv4.ip_forward=1` pada bridge sudah benar — paket di-drop pada hook `FORWARD` sebelum proses NAT sempat berjalan. Jangan buang waktu mengutak-atik ulang bridge, DNS, atau `lxd init`.
Diagnosa
- Di dalam container Inucs/LXD, `apt update` / `apt-get` / `curl` timeout pada IPv4 (`connection timed out`, `Failed to fetch`) dan/atau langsung muncul `Network is unreachable` pada IPv6.
- Request yang sama persis berhasil dijalankan dari host.
- Build image `packer-lxd` error di provisioner shell pertama pada `apt update` → `Failed to fetch … Could not connect … connection timed out`.
- Masalah muncul tepat setelah Docker diinstall di host LXD tersebut (atau setelah upgrade Docker yang menerapkan ulang rule-nya).
Pemeriksaan
1. Test Connectivity dari VM / Container
Lakukan pengujian konektivitas dari VM atau container yang mengalami masalah.
Hasil pengujian menunjukkan VM/container dapat atau tidak dapat mencapai gateway dan jaringan luar.
2. Pemeriksaan Firewall dan NATHost
Periksa policy `FORWARD`:
sudo iptables -S FORWARD
Periksa chain Docker:
sudo iptables -S DOCKER-USER
Pemeriksaan NAT:
iptables -t nat -L POSTROUTING -n -v
Pastikan IP forwarding aktif:
sysctl net.ipv4.ip_forward
- Firewall forward tidak terdapat rule yang mengizinkan traffic dari bridge LXD/Incus, traffic dapat terblokir pada firewall host.
- Sementara traffic dari network LXD/Incus `10.14.3.0/24` tidak mendapatkan forwarding yang diperlukan menuju interface jaringan utama.
- dan juga status IP Forwarding tetap aktif '1'
Penyebab
Firewall Docker menggunakan policy FORWARD DROP pada host.
Traffic dari `incusbr0` kemudian tidak mendapatkan rule `ACCEPT` yang memungkinkan traffic masuk dan keluar melalui bridge Incus.
Akibatnya:
Incus Container
10.14.3.x
|
v
incusbr0
10.14.3.1
|
X
Docker Firewall / FORWARD DROP
|
X
8.8.8.8 / Internet
Solusi
Tambahkan rule `ACCEPT` pada chain `DOCKER-USER`.
Untuk LXD:
sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT sudo iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT
Untuk Incus:
sudo iptables -I DOCKER-USER -i incusbr0 -j ACCEPT sudo iptables -I DOCKER-USER -o incusbr0 -j ACCEPT
Sesuaikan nama bridge dengan konfigurasi yang digunakan.
Periksa kembali rule:
sudo iptables -S DOCKER-USER
Now it should be bertambah 2 rules:
-N DOCKER-USER -A DOCKER-USER -o incusbr0 -j ACCEPT -A DOCKER-USER -i incusbr0 -j ACCEPT
Verifikasi
Setelah rule diterapkan, lakukan kembali test connectivity dari VM/container.
Kemudian lakukan pengujian akses Internet:
curl -4I https://deb.debian.org
Jika menggunakan Debian/Ubuntu:
apt update
Test:
root@sandbox-cloud:~# curl -4I https://deb.debian.org HTTP/2 200 server: Apache x-content-type-options: nosniff x-frame-options: sameorigin referrer-policy: no-referrer x-xss-protection: 1 permissions-policy: interest-cohort=() last-modified: Fri, 01 Sep 2023 16:12:16 GMT etag: "754-6044e6c99e42d" x-clacks-overhead: GNU Terry Pratchett content-type: text/html backend: 4qpvL1tJyeV1P6Tmf0Lj8g--F_static_backend accept-ranges: bytes date: Sun, 27 Sep 2026 19:36:15 GMT via: 1.1 varnish age: 49 x-served-by: cache-sin-wsat1880040-SIN x-cache: HIT x-cache-hits: 1 x-timer: S1790537776.879989,VS0,VE1 vary: Accept-Encoding content-length: 1876 root@sandbox-cloud:~# sudo apt update Hit:1 http://deb.debian.org/debian trixie InRelease Hit:2 http://deb.debian.org/debian trixie-updates InRelease Get:3 http://deb.debian.org/debian-security trixie-security InRelease [43.4 kB] Get:4 http://deb.debian.org/debian-security trixie-security/main amd64 Packages [263 kB] Get:5 http://deb.debian.org/debian-security trixie-security/main Translation-en [161 kB] Fetched 468 kB in 0s (1179 kB/s) All packages are up to date. root@sandbox-cloud:~#
Persistensi Konfigurasi
Rule `iptables` yang dibuat secara manual dapat hilang setelah reboot.
Buat systemd service:
/etc/systemd/system/lxd-docker-forward.service
[Unit] Description=Allow LXD/Incus bridge through Docker firewall After=docker.service Wants=docker.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c '/usr/sbin/iptables -C DOCKER-USER -i lxdbr0 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT' ExecStart=/bin/sh -c '/usr/sbin/iptables -C DOCKER-USER -o lxdbr0 -j ACCEPT 2>/dev/null || /usr/sbin/iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT' [Install] WantedBy=multi-user.target
Untuk Incus, ganti `lxdbr0` dengan nama bridge Incus yang digunakan.
Aktifkan service:
sudo systemctl daemon-reload sudo systemctl enable --now lxd-docker-forward.service