Files
oikos/containers/107-dns.md
dtoro f9f2e8ab5e DNS Phase 2: fix roaming-peer resolution via route distribution
Root cause of "NetBird won't forward to Technitium" was NOT a nameserver
bug — it was a missing route. The home-lab-dns nameserver group
(-> 192.168.8.2, domain hubris.network) was applied to all peers, but the
192.168.8.0/24 route (home-lab-network resource) was distributed only to
the Services group. Roaming peers (Core: iphone + laptops) had no route to
192.168.8.2, so forwarding silently failed (Networks: -).

Fix: added Core to the home-lab-network resource distribution via the
NetBird API. Roaming peers now get the subnet route + the already-applied
nameserver forwarding -> *.hubris.network resolves off-LAN. Also grants
roaming devices full homelab service access. No CT 107 mesh-join needed
(original Phase 2 hypothesis obsolete).

Docs: corrected dns.md + 107-dns.md root-cause claims. Managed zone kept
as fallback pending Phase 4.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-21 15:28:08 +02:00

6.3 KiB
Raw Blame History

107 — dns

Homelab DNS server (Technitium). Replaces the dnsmasq that lived on 124 — authentik; single-purpose, one job.

At a glance

  • Hostname: dns
  • IP: 192.168.8.2 (static — stable, decoupled from any app)
  • Privilege: privileged (Docker-in-LXC, features: nesting=1)
  • Resources: 1 core / 1 GiB / 8 GiB rootfs
  • Created: 2026-06-01, Debian 13. Its own resolver is 1.1.1.1 (no circular dependency on the DNS it serves).

Role

Authoritative split-horizon DNS for hubris.network on the LAN/mesh, plus recursive forwarding (1.1.1.1, 8.8.8.8) for everything else. Technitium runs in Docker (technitium/dns-server:latest, network_mode: host), web console on :5380.

The hubris.network zone

  • Specific A overrides: app names → 192.168.8.175 (Caddy), nfs-export → 192.168.8.200, auth/sso/... as needed.
  • auth.hubris.network → 82.165.190.79 (VPS Authentik), sso.hubris.network → 192.168.8.175 (LAN forward-auth outpost).
  • Wildcard *.hubris.network → 82.165.190.79 — mirrors the public IONOS wildcard so undefined names (e.g. netbird) resolve to the VPS, matching public behaviour.
  • MX / SPF-TXT / CAA replicated from public so an authoritative zone doesn't shadow hubris.network email/cert records.

Config / access

  • /opt/technitium/docker-compose.yml; admin password in /opt/technitium/admin_password.txt (mode 600 — sops-encrypt in Phase 5).
  • Console: http://192.168.8.2:5380 (user admin).
  • API: http://192.168.8.2:5380/api/... (token via /api/user/login). Zone was built via the API.

Who points here

  • NetBird mesh peers: resolve hubris.network via the home-lab-dns nameserver group (→ 192.168.8.2, applied to all peers) — now that roaming peers (Core) have the 192.168.8.0/24 route (fixed 2026-06-21), this forwarding path works for everyone. The NetBird managed DNS zone (kept in sync from this Technitium via dns-sync below) is now a redundant fallback, slated for removal in Phase 4.
  • Homelab DHCP clients: Technitium's own DHCP scope hands out 192.168.8.2 as the DNS server for 192.168.8.x leases (see DHCP section below).
  • Plain LAN clients (192.168.178.x): Fritz!Box DHCP still hands out Fritz!Box itself (192.168.178.1) as DNS, but the Fritz!Box now forwards upstream to Technitium — DNSv4 server set to 192.168.8.2 (Internet → Filter → DNS Server, 2026-06-17). So household clients get split-horizon *.hubris.network answers via Fritz!Box→Technitium, with no NetBird dependency. (This is the change that decoupled the on-prem tier from the mesh — see dns.md 2026-06-17.)

dns-sync (Technitium = authoring source)

/opt/dns-sync/sync.py (cron */10, logs /var/log/dns-sync.log) reconciles this zone's named A-records → the NetBird managed DNS zone via the NetBird API (/api/dns/zones/{id}/records). Token at /opt/dns-sync/netbird-token (mode 600; source of truth in sops secrets/netbird-pat.yaml). Edit DNS only here; the sync propagates to the mesh. It deletes NetBird records absent from Technitium. Tracked: scripts/dns-sync.py.

Why this exists (and why it's being retired) — corrected 2026-06-21. The sync was built on the belief that "NetBird won't forward to Technitium for mesh peers." That was wrong: the home-lab-dns nameserver group (→ 192.168.8.2, domain hubris.network) was applied to all peers, but the 192.168.8.0/24 route was distributed only to the Services group — roaming peers (Core) had no route to reach 192.168.8.2. Adding Core to the route distribution fixed forwarding directly. The managed zone + this sync are now redundant and slated for removal in Phase 4. See dns.md changelog 2026-06-21.

DHCP

Technitium also runs a DHCP server for the homelab subnet (enabled 2026-06-02):

  • Scope: homelab192.168.8.241 192.168.8.254
  • Gateway: 192.168.8.1 (Proxmox vmbr0 alias)
  • DNS: 192.168.8.2 (self)
  • Lease time: 24 h

Replaces the DHCP that was previously served by the Slate AX router. Static-IP LXCs (.101.239) are excluded from the pool. Pool narrowed from .100.240 to .241.254 on 2026-06-03 to eliminate IP conflict risk.

Changelog

2026-06-06 — dns-sync cron installed (had been missing since deployment)

Although the 2026-06-03 changelog claimed "cron */10", no crontab was actually configured on the LXC. The sync was running only via ad-hoc manual invocations during incident debugging. Fixed by adding /etc/cron.d/dns-sync.

2026-06-03 — DHCP pool narrowed to .241.254

Previous pool .100.240 overlapped with all static LXCs/VMs (.101.239). Shrunk via API (/api/dhcp/scopes/set). 11 stale DHCP leases in .101.110 remain until natural expiry (2026-06-04). See plan.

2026-06-03 — dns-sync added (Technitium → NetBird managed zone)

This Technitium became the single DNS authoring source; /opt/dns-sync/sync.py (cron */10) reconciles named A-records into the NetBird managed zone via the API. Fixed previously-broken mesh names (sso, nfs-export, mcp, secrets) by adding them to the managed zone; reaped obsolete files/photos-new. See dns.md.

2026-06-02 — DHCP server enabled; replaces Slate AX DHCP

Enabled Technitium's built-in DHCP server for 192.168.8.0/24 (scope homelab, range .100.240, gateway 192.168.8.1, DNS self). Previously the Slate AX sub-router served DHCP for the homelab subnet. With the Slate AX retired and Proxmox now the subnet router, Technitium takes over DHCP. Configured via the Technitium API (/api/dhcp/scopes/set). DHCP LXCs kept their Slate AX leases until expiry, then renewed from Technitium.

2026-06-01 — created; replaced dnsmasq on 124

Stood up Technitium at 192.168.8.2, imported the split-horizon zone (specific A + wildcard + MX/SPF/CAA), made it the primary nameserver in the NetBird home-lab-dns group. Verified all names resolve with dnsmasq/124 stopped; LXC 124 retired.