virtualization:lxd:docker-firewall-conflict

LXD / Incus ↔ Docker — Konflik Firewall

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`.

  • 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).

Lakukan pengujian konektivitas dari VM atau container yang mengalami masalah.

Hasil pengujian menunjukkan VM/container dapat atau tidak dapat mencapai gateway dan jaringan luar.

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'

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

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

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:~# 

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
  • virtualization/lxd/docker-firewall-conflict.txt
  • Last modified: 2026/09/28 02:50
  • by ilyasa