Bug #377
closedBug: Tailscale subnet router SPOF — netinfra-01 sole router, DERP bouncing causes fleet-wide up/down alerts
100%
Description
Symptom¶
Uptime Kuma reports intermittent up/down alerts for many different hosts
across the fleet (not just DNS). Alerts are transient — hosts come back within
seconds to minutes.
Root cause¶
pfv-netinfra-01 is the SOLE Tailscale subnet router advertising
192.168.0.0/22. There is no redundant subnet router. Every LAN host that
Uptime Kuma monitors (via the Cloudron VPS over Tailscale) routes through
this single node.
Three instability factors on netinfra-01:
-
DERP relay bouncing — tailscaled journal (Aug 5) shows the nearest
DERP relay switching between #13 (Dallas), #9, and #12 every ~15 minutes.
Each switch causes a brief WireGuard tunnel disruption. -
Docker LinkChange events — creating/destroying Docker containers
adds/removes bridge interfaces, triggeringLinkChange: major, rebinding
in tailscaled. This rebinds ALL interfaces and drops active connections.
Observed during Pi-hole container recreation at 08:53 CDT Aug 6. -
resolv.conf write failures — every link change produces:
wgengine: error setting DNS config after major link change: writing to /etc/resolv.conf: operation not permitted
Fix plan¶
-
Add netinfra-02 as a second subnet router for
192.168.0.0/22.
Tailscale supports ECMP failover between subnet routers — when netinfra-01
hiccups, traffic fails over to netinfra-02 transparently. -
Approve the new route in the Tailscale admin console (ACL/routes).
-
Investigate DERP bouncing — may need to pin a preferred DERP or
investigate NAT traversal stability at the site. -
Fix resolv.conf permissions on netinfra-01 (tailscaled needs write
access or a systemd-resolved integration).
References¶
- Discovered during: #376 (DNS alerts investigation)
- netinfra-01 Tailscale IP: 100.70.181.72
- netinfra-02 Tailscale IP: 100.71.171.20
- Subnet: 192.168.0.0/22
Updated by Charles N 9 days ago
ACTIONS TAKEN (2026-08-06):
-
netinfra-02 now advertises 192.168.0.0/22 as subnet route
(tailscale set --advertise-routes=192.168.0.0/22)
→ Advertised locally, needs admin console approval to activate. -
Fixed resolv.conf immutable flag on netinfra-01 (chattr -i).
Was preventing tailscaled from writing DNS config after every link change.
netinfra-02 was clean (no immutable flag). -
tailscaled restarted on netinfra-01 to clear error state.
PENDING (requires user action):
- Approve netinfra-02's 192.168.0.0/22 route in Tailscale admin console:
https://login.tailscale.com/admin/machines
Until approved, PrimaryRoutes remains None and failover is inactive.
Code/docs: docs/server-build/tailscale.md section 6 (commit 75e229c)
Updated by Charles N 9 days ago
UPDATE: netinfra-02 now also advertises exit node (0.0.0.0/0, ::/0),
matching netinfra-01 for full HA parity.
Verified:
- Subnet route 192.168.0.0/22: APPROVED and active (PrimaryRoutes confirmed)
- netinfra-02 visible as active; direct from netinfra-01
PENDING (requires user action):
- Approve netinfra-02 exit node routes (0.0.0.0/0, ::/0) in Tailscale admin:
https://login.tailscale.com/admin/machines
These appear as separate approvals from the subnet route.
Docs: docs/server-build/tailscale.md §6 (commit d4850a3)