Gitea publish sha256 ae282669… round-trip verified; hub manifest now vouches agent 0.65.0 + golden 0.98.3 (flash + reload-persist verified); /offsite + Hosts pages eyeballed (0.65.0 ONLINE). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PSK5g6qYLknKj8u3QAFEr6
4.7 KiB
REPORT — S3.1: offsite-tunnel client MTU 1420 → 1280 (v0.65.0)
Date: 2026-07-04 · Class: implementation + live validation on felhom-pve (the expendable
demo box; Peti's box untouched; endpoint untouched by construction). Design of record:
felhom.eu/documentation/architecture/06-offsite-connectivity.md §4.3 (OPEN DECISION → resolved).
1. Baselines & commits
Start: felhom-agent @ 03edb40 (v0.64.0); felhom.eu @ 2028785 (docs). Commits pushed to main:
312fd5e—wgtunnel: client MTU 1420 → 1280(manager.go const + render, manager_test.go golden + red-proof note, report.go stale comment, CHANGELOG v0.65.0).<this commit>— CONTEXT + this REPORT.- felhom.eu docs (§4.3 decision + §4.2/§4.3 wording + S6 row): separate one commit — see felhom.eu REPORT.
2. What changed & why
The 2026-07-04 CGNAT smoke test found the shipped interface MTU 1420 silently black-holes
bulk TCP on any path below ~1480 B (mobile ~1400, DS-Lite ~1452): the WG handshake and ping stay
healthy (small packets) while the PBS TLS page — and, at S4, the backup itself — drops. Resolved
§4.3's OPEN DECISION with a permanent, fleet-wide, family-agnostic client MTU of 1280 (RFC
8200 IPv6-minimum link MTU; outer = 1280+60 v4 / +80 v6, fits every realistic path).
internal/wgtunnel/manager.go: newconst clientMTU = 1280(single home, doc-referenced);renderConfemitsMTU = %dfrom it.- Client-only by construction: interface MTU caps box→PBS; advertised MSS (=MTU−40) caps
PBS→box. The endpoint's
wg0is untouched → zero live-endpoint risk, one constant changed. - Rejected (recorded in §4.3): auto-probe / per-connection-type (fragile moving part for a non-metric); MSS-clamp (no forwarded flows). No wire/JSON-golden change (MTU is client-derived).
3. Tests — render golden + red-proof (§10)
go build ./... && go vet ./... && go test ./...— all green (local Go 1.26).TestRenderConf_Goldenpins the exact bytes incl.MTU = 1280(not a "contains MTU" check).- Red-proof: flipped
const clientMTU→ 1420 → the golden FAILED on the MTU line (got MTU = 1420 / want MTU = 1280); restored to 1280 → PASS. The assertion is non-vacuous.
4. Deploy + live wired smoke (§13) — felhom-pve, agent v0.65.0
Built -X main.version=0.65.0 on 180; deployed with felhom-agent.bak-0.64.0 backup; --version
confirms 0.65.0. Agent re-rendered + re-applied the conf on restart (hash-gated apply caught
the MTU change):
- Rendered MTU:
grep MTU /etc/wireguard/wg-felhom.conf→MTU = 1280; live ifaceip link show wg-felhom→mtu 1280. ✅ - Tunnel:
wg-quick@wg-felhomactive; handshake age 43 s;ping 10.77.0.13/3, ~33 ms. ✅ - PBS page (no regression on the good path):
curl -sk https://10.77.0.1:8007/→ full<!DOCTYPE html>…login page at MTU 1280. ✅ - Journal clean — no capability degradation, no errors.
Scenario B (no regression at 1280 on the working wired path) proven live. The constrained-path fix itself is established by arithmetic + prior field data (1280 < the 1340 that already worked in the smoke test; 1420 was the value that failed) — the optional phone re-tether re-proof was not run (not required per §13; skippable).
5. Not yet live-validated / open
- True-CGNAT-SIM retest — low risk, deferred ("when able"); the smoke SIM had a public mobile IPv4, so 100.64/10 double-NAT was not reproduced (unchanged by this task).
- PBS backup over the tunnel (S4) — the next slice; this fix makes its bulk-TCP floor safe.
- Optional constrained-path re-proof (phone tether at MTU 1280) — skipped; available if extra confidence wanted.
6. Observations
- The v4-pin (agent resolves ep0's A record + writes the literal, per §4.2's watchdog) is a reasonable later determinism improvement but is not needed for MTU correctness — 1280 is safe on both families' overhead. Recorded in the doc as a separate future note; green-lightable independently whenever the re-resolve watchdog work happens.
OPERATOR follow-up: publish 0.65.0 + Day-0 vouchDONE same day (operator-assisted browser session): 0.65.0 published to Gitea (publish-agent.shon felhom-pve with the out-of-band/root/.golden-secrets.envcreds; sha256ae282669…78d0a73, round-trip verified) and the hub Day-0 manifest vouched agent 0.65.0 + golden 0.98.3 via the/configurationUI in the user's logged-in Chrome session (flashartifacts_set+ reload-persist verified)./offsitepage eyeballed OK (endpoint + the one demo peer); Hosts page reports demo-felhom-01 agent 0.65.0 ONLINE. Rollback artifact on the box:felhom-agent.bak-0.64.0.