virtualization:lxd:docker-firewall-conflict

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
virtualization:lxd:docker-firewall-conflict [2026/09/28 02:50] – removed - external edit (Unknown date) 127.0.0.1virtualization:lxd:docker-firewall-conflict [2026/09/28 02:50] (current) – ↷ Page moved and renamed from self:lxd-docker-firewall-conflict to virtualization:lxd:docker-firewall-conflict ilyasa
Line 1: Line 1:
 +====== 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).
 + 
 +<WRAP center round important 60%>
 +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`.
 +</WRAP>
 +
 +===== 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`:
 +
 +<code bash>
 +sudo iptables -S FORWARD
 +</code>
 +
 +Periksa chain Docker:
 +
 +<code bash>
 +sudo iptables -S DOCKER-USER
 +</code>
 +
 +Pemeriksaan NAT:
 +<code bash>
 +iptables -t nat -L POSTROUTING -n -v
 +</code>
 +
 +Pastikan IP forwarding aktif:
 +
 +<code bash>
 +sysctl net.ipv4.ip_forward
 +</code>
 +
 +
 +{{ :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:
 +
 +<code>
 +Incus Container
 +10.14.3.x
 +     |
 +     v
 +incusbr0
 +10.14.3.1
 +     |
 +     X
 +Docker Firewall / FORWARD DROP
 +     |
 +     X
 +8.8.8.8 / Internet
 +</code>
 +===== Solusi =====
 +
 +Tambahkan rule `ACCEPT` pada chain `DOCKER-USER`.
 +
 +Untuk LXD:
 +
 +<code bash>
 +sudo iptables -I DOCKER-USER -i lxdbr0 -j ACCEPT
 +sudo iptables -I DOCKER-USER -o lxdbr0 -j ACCEPT
 +</code>
 +
 +Untuk Incus:
 +
 +<code bash>
 +sudo iptables -I DOCKER-USER -i incusbr0 -j ACCEPT
 +sudo iptables -I DOCKER-USER -o incusbr0 -j ACCEPT
 +</code>
 +
 +Sesuaikan nama bridge dengan konfigurasi yang digunakan.
 +
 +Periksa kembali rule:
 +
 +<code bash>
 +sudo iptables -S DOCKER-USER
 +</code>
 +
 +Now it should be bertambah 2 rules:
 +<code bash>
 +-N DOCKER-USER
 +-A DOCKER-USER -o incusbr0 -j ACCEPT
 +-A DOCKER-USER -i incusbr0 -j ACCEPT
 +</code>
 +===== Verifikasi =====
 +
 +Setelah rule diterapkan, lakukan kembali test connectivity dari VM/container.
 +
 +{{ :problem:incus-connectivity-fixed.png?nolink&800 |}}
 +
 +Kemudian lakukan pengujian akses Internet:
 +
 +<code bash>
 +curl -4I https://deb.debian.org
 +</code>
 +
 +Jika menggunakan Debian/Ubuntu:
 +
 +<code bash>
 +apt update
 +</code>
 +
 +Test:
 +<code bash>
 +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:~# 
 +</code>
 +
 +===== Persistensi Konfigurasi =====
 +
 +Rule `iptables` yang dibuat secara manual dapat hilang setelah reboot.
 +
 +Buat systemd service:
 +
 +<code bash>
 +/etc/systemd/system/lxd-docker-forward.service
 +</code>
 +
 +<code ini>
 +[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
 +</code>
 +
 +Untuk Incus, ganti `lxdbr0` dengan nama bridge Incus yang digunakan.
 +
 +Aktifkan service:
 +
 +<code bash>
 +sudo systemctl daemon-reload
 +sudo systemctl enable --now lxd-docker-forward.service
 +</code>
 +