|
set-interface-v4: reload the pf filter on --commit (RULED); appendix-A rewritten
RULING (GA-R5) 2026-07-27. Question as presented: (a) add `configctl filter reload` to the script's --commit path; (b) leave the script and rely on DC standup DoD item 8; (c) put it behind an opt-in flag. Operator answer, exact utterance: "a". OPS under GA-R3 -- a script fix completing an already-documented operation, governed by D-113; no new D-number. DEFECT (appendix-A, measured on the fresh dc1 edge 2026-07-23): --commit ran `configctl interface reconfigure`, which applies the address to the kernel but does NOT regenerate the pf ruleset, so OPNsense never creates its automatic outbound-NAT rules for the (re-)addressed LAN. Forwarded LAN packets left the WAN un-NAT'd and replies never returned -- the edge passed NO LAN traffic while looking perfectly configured. Self-masking: any later plugin install or config apply reloads the filter as a side effect, so dc0's 07-20 qga work hid it there until dc1 exposed it. Option (b) rejected on evidence, not taste: DoD item 8 already existed and did NOT fire at dc1, and prose-only controls have a measured failure record here (D-137's own enforcement sat as prose at phase-3:498 and missed BOTH DC standups). PLACEMENT IS THE SUBSTANCE OF THE FIX, and my first attempt got it wrong -- caught before shipping. Putting the reload on the next line of the `interface reconfigure` heredoc would have been a fix that fixes nothing exactly when it matters: re-addressing the interface you arrived on drops the session DURING the reconfigure, so a following command in that stream never executes -- and that drop case IS this incident's own scenario (dc1's LAN moved 192.168.1.1 -> 10.12.64.1 over the LAN itself). As shipped the reload runs over a FRESH connection to PROBE_HOST. Also added a `pfctl -s nat` read-back with the `proto carp` boilerplate filtered out, since boilerplate-only is precisely appendix-A's broken-state signature. REPORTED, not gated: an edge's first addressing may legitimately have no gateway and so no NAT to generate, and hard-failing would block a correct run. The hard gate stays address-on-the-kernel. Harness 59/59 (was 53), cases 15-15f. Case 15f caught a real inconsistency -- appendix-A still said "not yet ruled". Case 15e caught a bug in my own first draft, which scanned to EOF and so failed the script for having the very hard gate the case exists to preserve. appendix-A rewritten: the FIX stays for an edge already in this state, plus a PREVENTED-IN-THE-TOOL block recording the placement detail and why prose prevention was rejected. Gauntlet ALL GREEN (81), repo-lint 0-fail. No live edge touched -- both DC edges are already addressed, so this affects only the NEXT edge addressing. With this, every substantive Stage 4 in-stage item is closed or split to gate row G17; only the GA-R6 close-out set remains. Revert: git revert this commit's script + harness + appendix-A changes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HvCyrwvYTTcDYnRErfMsNf |
|---|
|
|
| docs/CURRENT-STATE.md |
|---|
| docs/changelog-20260727-creds-consolidation.md |
|---|
| runbooks/appendix-A-troubleshooting.md |
|---|
| scripts/opnsense-set-interface-v4.sh |
|---|
| tests/opnsense-set-interface-v4/run-tests.sh |
|---|