5013209e31
nft emitter (internal/emitter/nft.go): - Add DNATTarget field (C-51: validated via net.ParseIP; injection guard). Default 127.0.0.1; proxmox native uses LXC bridge IP. - Add EnableSNAT field (default true for zero-value config). - Add postrouting masquerade chain (research Topic 1): ip saddr 127.0.0.0/8 oifname != lo masquerade - Shift input/forward priority from filter (=0) to -10 (research Topic 2: pve-firewall coexistence — avoids same-priority undefined evaluation order). internal/ingress/bootstrap.go (new): - BootstrapLocalIngress: mkdir dirs, push step-ca root CA (C-60: certpaths.CACertPath not CAPath), render+write traefik static config (C-58: preserves traefik-on-public-ip opt-out), render+ write+apply nft ruleset, pre-create table (C-55: avoids first- apply flush-table error), ensure podman container. All non-fatal. init.go: Step 4d now calls ingress.BootstrapLocalIngress (R-024). doctor_nft.go: assert postrouting masquerade + priority -10. Tests: nft_test.go — DNATTarget substitution, invalid DNATTarget rejection (C-51), EnableSNAT=false omits postrouting, priority -10. ---ci--- project: orca phase: 3 milestone: v0.14 status: execute ---/ci---