====== 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. {{ :images:capture:lxd-docker-firewall-conflict-screenshot_2026-09-27_23-56-02.png?nolink&800 |}} 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 {{ :images:capture:lxd-docker-firewall-conflict-screenshot_2026-09-28_00-23-26.png?nolink&800 |}} * 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. {{ :problem:incus-connectivity-fixed.png?nolink&800 |}} 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