fix: isolate boxes with the bridge's port-isolation flag #38
No reviewers
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:cli
scope:drill
scope:host
scope:installer
scope:templates
scope:tiers
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/box#38
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/firewall-restart"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Boxes still reach each other. The nft bridge rule from #37 is live on the host — and does nothing:
So the rule is right about intent and wrong about mechanism: whatever path those frames take, that hook does not stop them. I could theorise about why. Theorising is what put this hole in the repo in the first place — the original "boxes can't reach each other" claim was a code reading that turned out to be false, and I have now been wrong twice more about how to close it.
Use the mechanism Incus provides
security.port_isolationon the bridged NIC sets the kernel bridge port's isolated flag, so two isolated ports cannot exchange frames at all. It is first-class, documented, and does not depend on any reasoning of mine about netfilter hooks:The nft rule stays as a second layer — it costs nothing — but the profile flag is what carries the guarantee.
Also in this PR
systemctl restart, notenable --now. The unit isRemainAfterExit, so once active,--nowis a no-op — meaning a firewall change would install to/usr/local/sbinand never run on any host that had already been set up. (It happens not to be what broke the rule here, since the rule did land — but it is a real trap and would have bitten the next change.)setup-host.shasserts the isolation is live instead of assuming, anddoctor.shchecksport_isolation— because the absence of this particular guarantee is invisible: everything works, and boxes can simply reach each other.dns.mode=noneis now shipped, so the drill stops reverting it as leftover rehearsal dirt.Verify:
bash drill/drill.sh --yes→ A3 must flip fromrefused(the packet arrived) todropped.🤖 Generated with Claude Code