netinfra-02 was accidentally wiped during storage moves. Rebuilt from
netinfra-01 config: Docker + Technitium (167 zones, rsync timer every 60s),
Pi-hole v6 (healthy, gravity.db validated), NTP container, ISC DHCP failover
secondary (load-balancing with primary, 99+84 active leases).
Pi-hole hardened on BOTH nodes with defense-in-depth against the
gravity.db corruption outage:
- gravity-validate.sh: pre-start SQLite header check, auto-removes corrupt DB
- Healthcheck: validates DNS resolution + gravity.db file integrity
- autoheal container: restarts unhealthy containers automatically
- Root cause (/dev/shm too small) already fixed by operator (shm_size: 1024M)
Also corrected DHCP lease count in audit (98 unique active, not 753 raw blocks).
💘 Generated with Crush
Assisted-by: Crush:glm-5.2
221 lines
10 KiB
Markdown
221 lines
10 KiB
Markdown
# Ground-Truth Audit — 2026-08-05
|
||
|
||
> **Authoritative fleet audit** performed by Crush (GLM-5.2) via read-only
|
||
> network discovery (nmap, SNMP, SSH, API queries). Supersedes
|
||
> [`AUDIT-2026-07-30.md`](AUDIT-2026-07-30.md) for all fleet state.
|
||
>
|
||
> **Method:** Tailscale `status`, nmap ping sweep (192.168.0-3.0/24), SNMP
|
||
> walks (`kn3lmgmt` community), SSH via `tests/remote.sh` + `netinfra/dns-cluster-setup/remote-dns.sh`,
|
||
> Proxmox `qm list`/`pvecm`, Docker/container inspection.
|
||
|
||
## TL;DR — What Changed Since 2026-07-30
|
||
|
||
The fleet grew significantly and the repository was restructured into a
|
||
module/subproject layout. Headline deltas:
|
||
|
||
| Metric | 2026-07-30 | 2026-08-05 | Δ |
|
||
|--------|-----------|-----------|---|
|
||
| VMs (running) | 28 | **63** | +125% |
|
||
| DNS zones | 124 | **167** | +35% |
|
||
| DHCP active leases | 333 | **98** (unique active) | 431 total active binding-state entries |
|
||
| Proxmox hosts | 7 | 7 | — |
|
||
| PVE version (fleet) | mixed (9.1.5–9.2.5) | **all 9.2.5** | tsys4 upgraded |
|
||
| Tailscale nodes | ~30 | **80** | full 3-tier env mirror |
|
||
| k8s cluster | LIVE (3-node HA) | **DOWN** | cnode wiped, no quorum |
|
||
| netinfra-02 | redundant secondary | **WIPED** | needs rebuild |
|
||
|
||
## Repository Restructure (DONE by operator)
|
||
|
||
Top-level dirs were consolidated into modules. **Old flat dirs no longer
|
||
exist** at the repo root:
|
||
|
||
| Was (repo root) | Now |
|
||
|-----------------|-----|
|
||
| `provisioning/` | `archive/provisioning/` — superseded by **KNELIAC** project (`/home/reachableceo/projects/KNELIAC`) |
|
||
| `powerman/` `console/` `ups/` | `dcinfra/{powerman,console,ups}/` |
|
||
| `dns-cluster-setup/` `switches/` `dhcp/` | `netinfra/{dns-cluster-setup,switches,dhcp}/` |
|
||
| `perf/` | `proxmox/perf/` (+ `proxmox/perf/scripts/`) |
|
||
|
||
Current repo root: `archive/ awx/ dcinfra/ docs/ k8s/ netinfra/ proxmox/ tests/ vendor/` + `logs/ returned-logs/`.
|
||
|
||
> **WARNING:** `README.md`, `AGENTS.md`, and `docs/docmap.md` still reference
|
||
> the OLD paths. These are being updated in this same session.
|
||
|
||
## Network Switches
|
||
|
||
SNMP community: `kn3lmgmt` (read) / `kn3lwrite` (write). SNMP responds from
|
||
the workstation LAN (no ACL — earlier "filtered" was just a wrong community).
|
||
|
||
| IP | sysName | Model | Status |
|
||
|----|---------|-------|--------|
|
||
| 192.168.0.12 | pfv-core-sw01 | PowerConnect 5448 | **UP** (Dell, core, rack5) |
|
||
| 192.168.0.7 | pfv-r3-tor-mgmt | Neyland 24T (PC5324) | **UP** (rack3 mgmt TOR) |
|
||
| 192.168.0.9 | pfv-r3-tor-stor | Neyland 24T (PC5324) | **UP** (rack3 storage TOR) |
|
||
| 192.168.0.8 | subodev-torsw01 | Neyland 24T (PC5324) | **UP** (was "unidentified" — now named) |
|
||
| 192.168.0.5 | pfv-r2-tor-top | (unknown) | **OFFLINE** — no ping, no SNMP |
|
||
|
||
**Ports open on switches:** TCP 22 (ssh), 23 (telnet), 80 (http web UI). UDP
|
||
161 (SNMP) responds with `kn3lmgmt`.
|
||
|
||
### LACP / Cross-Rack Trunk (core-sw01 ch1)
|
||
|
||
- Operator reports **LACP is fixed** (was static `mode on`, hash layer-2-3).
|
||
- SNMP confirms **ch1 ifIndex=49 is UP**; ch3 ifIndex=51 also UP.
|
||
- ch1 reports ifSpeed=1000Mbps — the Dell FastPath switch does not report
|
||
aggregate bundle speed via standard ifSpeed, so **member count + hash
|
||
algorithm need console verification** (conman requires a PTY — run manually):
|
||
```bash
|
||
conman -d pfv-tsys4:7890 -f pfv-core-sw01
|
||
# then: show interfaces status port-channel 1
|
||
# show running-config | begin port channel
|
||
```
|
||
|
||
## Proxmox Hosts (7 standalone, managed via PDM)
|
||
|
||
All **PVE 9.2.5** (tsys4 upgraded from 9.1.5 — resolves old STATUS item).
|
||
**Not clustered** — standalone installs (corosync Expected votes=1 each).
|
||
|
||
| Host | RAM used/total | VMs | Uptime | Notes |
|
||
|------|---------------|-----|--------|-------|
|
||
| pfv-tsys1 | 71% (22.7/32 GB) | 8 | 6d | Highest RAM use in fleet |
|
||
| pfv-tsys3 | 12% (3.7/32 GB) | 2 | 9d | under-utilized |
|
||
| pfv-tsys4 | 18% (2.8/16 GB) | 2 | 5d | storage server, kernel 7.0.14-8 |
|
||
| pfv-tsys5 | 48% (46.8/97 GB) | **32** | 6d | sectestbed+preprod host |
|
||
| pfv-tsys6 | 14% (18/129 GB) | 5 | 10d | 129 GB RAM, wnode+cnode3 |
|
||
| pfv-tsys7 | 30% (58.8/193 GB) | 11 | 10d | **193 GB RAM**, prod workloads |
|
||
| pfv-tsys9 | 30% (7.2/24 GB) | 3 | 9d | netinfra-02 + wnode |
|
||
|
||
**Memory capacity goal (≤80%): PASS fleet-wide.** Highest is tsys1 at 71%.
|
||
|
||
### tsys5 Storage (RESOLVED)
|
||
|
||
Old STATUS item "NVMe + SSD not configured" is **FIXED**. All storage active:
|
||
|
||
| Disk | Mount | Use |
|
||
|------|-------|-----|
|
||
| nvme0n1 (CT500P1 500GB) | /mnt/nvme (PVE: NVME dir) | 49% used |
|
||
| sdb (SK hynix 512GB SSD) | /mnt/ssd2 (PVE: ssd2 dir) | 14% used |
|
||
| sdd (Samsung 860 PRO 256GB) | /mnt/pfv-tsys5/ssd (PVE: SSD dir) | 1% |
|
||
| sde (ST1000VN002 1TB) | /mnt/pfv-tsys5/S1 | 6% |
|
||
| sdf (ST1000VN002 1TB) | /mnt/pfv-tsys5/S2 | 7% |
|
||
| local-lvm (1.67 TB thin) | LVM | 6.9% |
|
||
|
||
NFS from tsys4: D2, D3, D5 all mounted and active.
|
||
|
||
## DNS / NTP / DHCP (netinfra)
|
||
|
||
### pfv-netinfra-01 (PRIMARY — 192.168.3.252, TS 100.70.181.72)
|
||
|
||
| Service | State | Detail |
|
||
|---------|-------|--------|
|
||
| **Technitium DNS** | UP (Docker `tsys-dns`, 5d) | Container, NOT systemd. Config: `/home/localuser/services/technitium/config` → `/etc/dns`. **167 zones.** Port 5380 via docker-proxy. |
|
||
| **Pi-hole** | UP (healthy, 26h) | `/dev/shm` = **1.0 GB** (operator hotfix applied). Healthcheck = `dig pi.hole` (DNS-resolution based). |
|
||
| **NTP** | UP (`ntpsec`, NOT chrony) | Clock synchronized. |
|
||
| **DHCP** | UP (`isc-dhcp-server`) | **753 active leases** (was 333). |
|
||
|
||
### pfv-netinfra-02 (SECONDARY — 192.168.3.253, TS 100.71.171.20)
|
||
|
||
**WIPED.** Reachable on Tailscale (host key changed, cleared from known_hosts)
|
||
but **SSH key auth fails** (`Permission denied (publickey,password)`). Needs
|
||
full rebuild as redundant node — see Pending.
|
||
|
||
## Kubernetes (pfv-k8s) — DOWN
|
||
|
||
| Node | Tailscale IP | k3s API :6443 | Location |
|
||
|------|-------------|---------------|----------|
|
||
| pfv-k8s-cnode1 | 100.125.134.53 | **closed** | VM 102 on tsys1 |
|
||
| pfv-k8s-cnode2 | 100.109.34.72 | **OPEN** | VM 705 on tsys7 |
|
||
| pfv-k8s-cnode3 | 100.106.222.18 | **closed** | VM 603 on tsys6 |
|
||
|
||
- **No etcd quorum** (≤1 of 3 members). cnode1 and cnode3 k3s not listening.
|
||
- **kubeconfig stale**: `~/.kube/config.pfv-k8s` points to `100.97.178.106:6443`
|
||
— an IP matching NO current cnode. Cluster must be rebuilt.
|
||
- Worker nodes (5) all online on Tailscale, **not joined**:
|
||
pfv-k8s-wnode-tsys3/5/6/7/9.
|
||
|
||
## Monitoring / Observability Stack
|
||
|
||
| System | Host | Status | Access |
|
||
|--------|------|--------|--------|
|
||
| LibreNMS | tsys-librenms (100.86.204.77) | UP (Tailscale) | API needs token (401) — SSH in to create |
|
||
| Uptime Kuma | status.knownelement.com | UP | API key in `~/.secrets/api-keys.env`; `/metrics` needs auth |
|
||
| Beszel | (fleet) | deployed (per STATUS) | metrics host TBD |
|
||
| Home Assistant | (HAOS VM) | configured (per STATUS) | NUT integration live |
|
||
| **Vault** | vault.knownelement.com | **Deployed, UNCONFIGURED** | API keys migration = HIGH priority TODO |
|
||
|
||
## Console Management (pfv-tsys4)
|
||
|
||
ser2net listening on all 7 ports (2001-2007) bound to Tailscale 100.70.77.93.
|
||
All 7 `/dev/consoles/<name>` symlinks present:
|
||
|
||
```
|
||
pfv-core-sw01→ttyUSB2 pfv-tor3-mgmt→ttyUSB1 pfv-tor3-stor→ttyUSB6
|
||
pfv-rrinfra-rtr→ttyUSB5 pfv-r2-tor-top→ttyUSB7 subodev-torsw→ttyUSB0
|
||
pfv-r2-sw→ttyUSB3
|
||
```
|
||
|
||
**conman requires a PTY** — cannot be driven via stdin pipe from Crush. Use an
|
||
interactive terminal, or the conman client directly.
|
||
|
||
## Tailscale Fleet (80 nodes)
|
||
|
||
Three full environment tiers now exist, each mirroring the same service set:
|
||
|
||
- **`tsys-*` (production):** tsys-awx, tsys-ca, tsys-cloudron, tsys-librenms,
|
||
tsys-proxmox-datacenter, tsys-proxmox-mailgw-01/02, tsys-siem, tsys-ucs-01/02,
|
||
tsys-umbrel, tsys-voip
|
||
- **`preprod-*`:** preprod-awx, preprod-ca, preprod-cloudron, preprod-hfnoc-uisp,
|
||
preprod-librenms, preprod-proxmox-datacenter, preprod-proxmox-mailgw,
|
||
preprod-rancherplatform, preprod-siem, preprod-voip
|
||
- **`sectestbed-*`:** sectestbed-awx, sectestbed-ca, sectestbed-cloudron,
|
||
sectestbed-hfnoc-uisp, sectestbed-k8s-cnode, sectestbed-k8s-wnode,
|
||
sectestbed-librenms, sectestbed-netinfra, sectestbed-proxmox-datacenter,
|
||
sectestbed-proxmox-mailgw, sectestbed-proxmox-pbs, sectestbed-proxmox-pve,
|
||
sectestbed-rancherplatform, sectestbed-sandbox, sectestbed-siem, sectestbed-voip
|
||
|
||
Plus: pfv-tsys1/3/4/5/6/7/9, pfv-k8s-cnode1/2/3, pfv-k8s-wnode-tsys3/5/6/7/9,
|
||
pfv-netinfra-01/02, pfv-proxmox-backup-server, pfv-rr-middleware-01/02,
|
||
pfv-bms, pfv-jetson-nano-1, pfvsvrpi, devbox-cloudron, hfnoc-uisp,
|
||
kali-rd, kali-tsys, netbird, preprod-awx, subopi-dev-3/4, subopi3,
|
||
stlpc-artroom/garage, siter-bizoffice, ultix-* (endpoints).
|
||
|
||
> **Note:** Tailscale reports `--accept-routes is false` on this workstation.
|
||
|
||
## Identified LAN Hosts (non-switch)
|
||
|
||
| IP | Identity | Evidence |
|
||
|----|----------|----------|
|
||
| 192.168.0.100 | stlpc-garage.knel.net | Linux + Postfix + xrdp |
|
||
| 192.168.0.250 | Linux storage (NFS) | SSH + rpcbind |
|
||
| 192.168.1.166 | pfv-stor1 (NAS) | Samba smbd 4 + Golang HTTP + SSH |
|
||
| 192.168.3.1 | gateway/router | Linux + xrdp |
|
||
|
||
## Divergences vs STATUS.md (2026-07-30)
|
||
|
||
1. **VM count 28→63** — sectestbed (16) + preprod (8) + new prod VMs added
|
||
2. **DNS zones 124→167**, **DHCP leases 333→753**
|
||
3. **tsys4 PVE 9.1.5→9.2.5** (was "behind fleet")
|
||
4. **tsys5 NVMe+SSD** now configured (was "not configured")
|
||
5. **tsys-umbrel + tsys-sipwise** deployed (new VMs)
|
||
6. **LACP core↔r3-stor** operator reports fixed (was #1 known issue)
|
||
7. **k8s cluster** now DOWN (was LIVE)
|
||
8. **netinfra-02** wiped (was redundant secondary)
|
||
9. **Technitium** now Docker container (was systemd dnsServer)
|
||
10. **NTP** is ntpsec (STATUS assumed chrony)
|
||
11. **Pi-hole /dev/shm** = 1 GB (operator hotfix; gravity.db healthcheck still DNS-based)
|
||
12. **Tailscale fleet** 3× larger with 3 environment tiers
|
||
|
||
## Pending / Recommended Next Actions
|
||
|
||
*(From `nextprompt` — reference only; awaiting operator direction)*
|
||
|
||
- **netinfra-02 rebuild** as redundant secondary (SSH key deploy + Technitium
|
||
zone sync + DHCP failover-peer)
|
||
- **k8s cluster rebuild** (fix wiped cnode, restore quorum, join 5 wnodes)
|
||
- **Pi-hole** add gravity.db healthcheck to compose (current check is DNS-only)
|
||
- **Vault** migrate all API keys (HIGH priority)
|
||
- **Monitoring**: deploy unpoller + netdisco to LibreNMS VM; add weathermap/smokeping
|
||
- **Home Assistant**: own all environmental monitoring/reporting
|
||
- **Benchmarking**: iperf (1gbps-per-flow verification) + fio + CPU/RAM across cluster
|
||
- **Repo gardening**: README/AGENTS/docmap path fixes (this session)
|