🐳 Podman Networking & UFW Integration

Filosofi: Podman is daemonless β€” gak ada Docker daemon yang nanganin networking buat lu. UFW + Podman butuh route allow manual. Kalau cuma ufw enable, container lu gak bisa akses internet dan dari luar gak bisa masuk.


Podman Network Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    eth0 (host)    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  Client   │◀──────────────▢│   Host    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜
                                   β”‚
                           podman0 bridge
                                   β”‚
              β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”
              β–Ό                    β–Ό    β–Ό
        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
        β”‚ Container β”‚         β”‚ Container β”‚
        β”‚ :11080    β”‚         β”‚ :5432     β”‚
        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Network ModeIP AccessPort MappingUse Case
bridge (default)Container punya IP sendiri-p HostPort:ContainerPortIsolasi antar container
hostContainer pake IP hostPort langsung exposePerformance critical, gak butuh isolasi
macvlanIP dari subnet fisikLangsung ke LANContainer sebagai β€œdevice” sendiri
noneLoopback-onlyGak adaTesting/isolasi total

UFW + Podman β€” The Correct Pattern

Jangan lakukan ini

ufw enable langsung tanpa routing rule β†’ container gak bisa akses internet. Forward policy default adalah DROP.

Step-by-step:

# 1. Aktifkan UFW + default deny incoming
ufw default deny incoming
ufw default allow outgoing
 
# 2. Izinkan SSH dulu (sebelum enable!)
ufw allow ssh
 
# 3. Enable UFW
ufw enable
 
# 4. ⚠️ Krusial: izinkan forward dari eth0 ke podman bridge
ufw route allow in on eth0 out on podman0 to any port 80 proto tcp
ufw route allow in on eth0 out on podman0 to any port 443 proto tcp
ufw route allow in on eth0 out on podman0 to any port 5432 proto tcp
# dst β€” satu rule per container port yang perlu diakses dari luar
 
# 5. Pastikan IP forwarding ON
sysctl net.ipv4.ip_forward=1
# Persisten: echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/99-podman.conf

Port Mapping Logic

          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β”‚          Host port :8080         β”‚
          β”‚   ufw allow 8080/tcp             β”‚
          β”‚   ufw route allow ... to 8080    β”‚
          β”‚                                  β”‚
          β”‚   podman run -p 8080:3000 app    β”‚
          β”‚                                  β”‚
          β–Ό                                  β–Ό
    External client ───────────▢ Container app (:3000)
Yang DibutuhkanCommand
Buka port di hostufw allow 8080/tcp
Route ke containerufw route allow in on eth0 out on podman0 to any port 8080 proto tcp
Jalankan containerpodman run -p 8080:3000 app

Podman Network Commands

# List networks
podman network ls
 
# Inspect bridge
podman network inspect podman0
# β†’ lihat subnet, gateway, containers terhubung
 
# Buat network custom (berguna untuk multi-container)
podman network create frontend --subnet 10.89.0.0/24
 
# Jalankan container di network tertentu
podman run --network frontend --name web -d nginx
 
# Hubungkan container ke network
podman network connect frontend web

Common Failures

GejalaPenyebabFix
Container bisa akses internet, tapi port gak bisa diakses dari luarKurang ufw route allowTambah rule route allow
ufw enable bikin SSH dropLupa ufw allow ssh sebelum enableConsole/VNC, ufw allow ssh
Container gak bisa resolve DNSDNS resolver blokirufw allow out on podman0 to any port 53 proto udp
Port conflict2 container pake host port samaGanti port mapping -p 8081:3000
Podman default network gak adaRootless podmanRootless pake slirp4netns, beda behavior

Rootless vs Rootful Podman

AspekRootful (sudo podman)Rootless (podman)
Port bindingBisa <1024>1024 (via net.ipv4.ip_unprivileged_port_start)
NetworkBridge (podman0)slirp4netns (NAT)
Volume mountBebasTerbatas (user namespace)
UFW routingufw route allow worksLebih kompleks (pakai -p)
Use caseProduction / system containersDevelopment / user apps


🧠 Berpikir β€” Metodologi Penyusunan Catatan

Catatan ini disusun melalui proses berpikir terstruktur sebagai berikut:

1. Thinking Type yang Digunakan

TypeKenapaBagian
Analytical ThinkingMemecah arsitektur Podman network jadi 4 mode (bridge, host, macvlan, none) + menganalisis mengapa UFW perlu route allow terpisahNetwork Architecture, Rootless vs Rootful
Systems ThinkingMemetakan jalur traffic: client β†’ eth0 β†’ UFW β†’ podman0 bridge β†’ container; cascade failure kalau satu link missingUFW + Podman Pattern, Port Mapping Logic
Concrete ThinkingStep-by-step command untuk UFW routing β€” urutan penting (SSH dulu!). Exact syntax yang bisa di-copyStep-by-step, Commands
Critical ThinkingMengapa ufw enable langsung tanpa route allow bikin container mati? Forward policy default DROP β€” ini jarang diketahuiPeringatan Danger

2. Background Knowledge (Pra-Penulisan)

  • Podman daemonless architecture: gak pake dockerd β€” network management ada di cni-plugins atau netavark
  • iptables forward chain: UFW manage ini via ufw-before-forward chain, route allow add rule ke FORWARD policy
  • Contabo double firewall trap: pengalaman langsung β€” UFW allow SSH tapi masih timeout karena hypervisor firewall di panel Contabo blokir duluan
  • Rootless slirp4netns: user-mode networking β€” traffic keluar via TAP device, bukan bridge, jadi UFW route allow gak works
  • Persistent IP forwarding: sysctl setting ilang setelah reboot tanpa /etc/sysctl.d/

3. RAG Vault β€” Dokumen yang Dikonsultasi

DokumenKontribusi
CD Pipeline GuideContainer deployment context, environment yang perlu expose
DevOps RoadmapDocker vs Podman positioning, container skill progression
Infrastructure AdministratorServer layout β€” di folder mana container jalan
Infrastruktur CloudContainer orchestration scale, network isolation

4. Sintesis β€” Bagaimana Bagian Bergabung

Background Knowledge (Podman architecture + UFW internals)
    β”‚
    β–Ό
RAG Vault (konteks deployment existing)
    β”‚
    β–Ό
Analytical:  Network modes β†’ compare bridge vs host vs macvlan
    β”‚
    β–Ό
Systems:     Traffic flow β†’ UFW β†’ bridge β†’ container β†’ cascade failure points
    β”‚
    β–Ό
Concrete:    Step-by-step routing commands β†’ exact syntax
    β”‚
    β–Ό
Critical:    Pitfalls β†’ double firewall, rootless limitation, lost on reboot

5. Sequential Thinking Steps

Thought 1 (Cognitive):   "Podman is daemonless. Gak ada dockerd yg manage iptables automatically."
Thought 2 (Analytical):  "Ada 4 network mode. Bridge default, host buat perf, macvlan buat LAN, none buat isolasi."
Thought 3 (Systems):     "Traffic: client β†’ eth0 β†’ ufw INPUT β†’ FORWARD (kena DROP) β†’ podman0 β†’ container."
                          "Break at FORWARD = no internet for containers."
Thought 4 (Critical):    "UFW default forward policy = DROP. Ini yg bikin container mati setelah ufw enable."
Thought 5 (Concrete):    "Fix: ufw route allow in on eth0 out on podman0 to any port X proto tcp."
Thought 6 (Analytical):  "Rootless vs rootful: rootless pake slirp4netns, route allow gak works."
Thought 7 (Systems):     "Cascade: UFW enable β†’ SSH lupa diallow β†’ lockout. Solusi: console/VNC."

πŸ”— Lihat Juga