# Infrastructure Current State: xtrm-lab.org ## Document Updated: 2026-01-22 ## Target Domain: xtrm-lab.org --- ## Network Topology Diagram ```mermaid graph TB subgraph Internet WAN["WAN: 62.73.120.142"] DNS_EXT["dns.xtrm-lab.org
DoH/DoT/DoQ"] end subgraph MikroTik["MikroTik hAP ax³ (192.168.31.1)"] ROUTER["RouterOS 7.20.6"] subgraph MK_Containers["Docker Containers"] AGH_MK["AdGuard Home
172.17.0.5:5355
PRIMARY DNS"] TS["Tailscale
172.17.0.4"] end end subgraph Switch["CSS326-24G-2S+ (192.168.31.9)"] SW["24-Port Managed Switch"] end subgraph AP["cAP ac (192.168.31.6)"] WIFI["CAPsMAN AP"] end subgraph Unraid["Unraid Server (192.168.31.2)"] subgraph Core["Core Services"] TRAEFIK["Traefik
172.18.0.3"] HOMARR["Homarr
172.18.0.4"] end subgraph Security["Security"] AUTH["Authentik
172.18.0.11"] VAULT["Vaultwarden
172.18.0.15"] end subgraph DNS_Unraid["DNS Services"] AGH_UR["AdGuard Home
192.168.31.4:53
SECONDARY DNS"] UNBOUND["Unbound
192.168.31.5"] end subgraph DevOps["DevOps"] GITEA["Gitea
172.18.0.31"] WOODPECKER["Woodpecker CI
172.18.0.32"] end subgraph Monitoring["Monitoring"] UPTIME["Uptime Kuma
172.18.0.20"] NETBOX["NetBox
172.24.0.5"] end subgraph Media["Media"] PLEX["Plex"] NEXTCLOUD["Nextcloud
172.18.0.24"] end end subgraph LAN["LAN Devices (192.168.31.x)"] CLIENTS["Clients"] end WAN --> ROUTER DNS_EXT --> ROUTER ROUTER --> AGH_MK ROUTER --> TS ROUTER --> SW SW --> Unraid SW --> AP AP --> CLIENTS SW --> CLIENTS AGH_MK -.->|"Upstream DoH"| QUAD9["Quad9 DNS"] AGH_UR -.->|"Upstream DoH"| QUAD9 CLIENTS -->|"DNS Queries"| AGH_MK CLIENTS -.->|"Failover"| AGH_UR ``` --- ## MikroTik hAP ax³ Router (192.168.31.1) | Parameter | Value | |-----------|-------| | RouterOS Version | 7.20.6 (stable) | | WAN IP (Static) | 62.73.120.142 | | LAN Subnet | 192.168.31.0/24 | | Docker Bridge | 172.17.0.0/24 | | SSH Access | Port 2222, user: jazzymc | **Interfaces:** - `ether1` - WAN (62.73.120.142/23) - `bridge` - LAN (192.168.31.1/24) - `docker-bridge` - Container network (172.17.0.1/24) - `back-to-home-vpn` - WireGuard VPN (192.168.216.1/24) ### Running Containers on MikroTik | Container | IP | Storage | Purpose | |-----------|-----|---------|---------| | tailscale | 172.17.0.4 | usb1/tailscale/root | Tailscale VPN client | | adguardhome | 172.17.0.5 | disk1/agh-root + usb1 mount | DNS with DoH/DoT/DoQ | ### AdGuard Home (MikroTik) - PRIMARY DNS | Service | Port | Protocol | Status | |---------|------|----------|--------| | DNS | 5355 (NAT from 53) | UDP/TCP | Active | | Web UI | 80 | HTTP | Active | | DoH | 443 | HTTPS | Active | | DoT | 853 | TCP | Active | | DoQ | 8853 | UDP | Active | **Configuration:** - Upstream: Quad9 DoH (https://dns10.quad9.net/dns-query) - TLS Certificate: Let's Encrypt wildcard (\*.xtrm-lab.org) - Server Name: dns.xtrm-lab.org - Certificate Expiry: 2026-04-02 - Credentials: jazzymc / 7RqWElENNbZnPW **Persistence:** root-dir on disk1 + data mount on usb1 (survives container restart) --- ## MikroTik CSS326-24G-2S+ Switch (192.168.31.9) | Parameter | Value | |-----------|-------| | Role | Managed Layer 2 Switch | | Ports | 24x Gigabit + 2x SFP | | OS | SwOS | | Web UI | https://sw.xtrm-lab.org | --- ## MikroTik cAP ac (192.168.31.6) | Parameter | Value | |-----------|-------| | Role | CAPsMAN Managed Access Point | | RouterOS Version | 7.20.1 (stable) | | Identity | CAP XL ac | --- ## Unraid Server (192.168.31.2) **Tailscale IP:** 100.100.208.70 **SSH Access:** `ssh -i ~/.ssh/id_ed25519_unraid root@192.168.31.2 -p 422` ### Docker Networks | Network | Subnet | Purpose | |---------|--------|---------| | br0 | 192.168.31.0/24 | LAN macvlan (AdGuard Home) | | dockerproxy | 172.18.0.0/16 | Traefik-accessible services | | netbox | 172.24.0.0/16 | NetBox stack | | bridge | 172.17.0.0/16 | Default Docker bridge | ### Key Services | Service | Container | IP | External URL | |---------|-----------|---|--------------| | **Core** |||| | Reverse Proxy | traefik | 172.18.0.3 | traefik.xtrm-lab.org | | Dashboard | homarr | 172.18.0.4 | xtrm-lab.org | | **Security** |||| | Identity Provider | authentik | 172.18.0.11 | auth.xtrm-lab.org | | Password Manager | vaultwarden | 172.18.0.15 | vault.xtrm-lab.org | | **DNS** |||| | AdGuard Home | adguardhome | 192.168.31.4 | - | | Unbound | unbound | 192.168.31.5 | - | | **DevOps** |||| | Git Server | gitea | 172.18.0.31 | git.xtrm-lab.org | | CI/CD Server | woodpecker-server | 172.18.0.32 | ci.xtrm-lab.org | | **Monitoring** |||| | Uptime Kuma | UptimeKuma | 172.18.0.20 | uptime.xtrm-lab.org | | NetBox | netbox | 172.24.0.5 | netbox.xtrm-lab.org | | **Media** |||| | Plex | plex | host | plex.xtrm-lab.org | | Nextcloud | Nextcloud | 172.18.0.24 | nextcloud.xtrm-lab.org | | **Remote Access** |||| | RustDesk | rustdesk-hbbs/hbbr | bridge | rustdesk.xtrm-lab.org | ### AdGuard Home (Unraid) - SECONDARY DNS | Setting | Value | |---------|-------| | IP Address | 192.168.31.4 | | Network | br0 (macvlan) | | Web UI | http://192.168.31.4:3000 | | DNS | 192.168.31.4:53 | | DoT | 192.168.31.4:853 | | Credentials | jazzymc / 7RqWElENNbZnPW | **Configuration (synced with MikroTik):** - Upstream: Quad9 DoH - TLS Certificate: Let's Encrypt wildcard - 6 Clients configured - Custom filtering rules (SentinelOne, Jamf) **Data Location:** /mnt/user/appdata/adguardhome/ **Stopped Services:** - binhex-official-pihole (replaced by AdGuard Home) - nebula-sync (incompatible with AdGuard Home) --- ## DNS Architecture ```mermaid flowchart TB subgraph External["External Access"] DOH["DoH: https://dns.xtrm-lab.org/dns-query"] DOT["DoT: tls://dns.xtrm-lab.org:853"] DOQ["DoQ: quic://dns.xtrm-lab.org:8853"] end subgraph MikroTik["MikroTik Router"] NAT["NAT: 53 → 5355"] AGH1["AdGuard Home
172.17.0.5:5355
PRIMARY"] end subgraph Unraid["Unraid Server"] AGH2["AdGuard Home
192.168.31.4:53
SECONDARY"] end subgraph Upstream["Upstream DNS"] Q9["Quad9 DoH
dns10.quad9.net"] end subgraph Clients["LAN Clients"] C1["IPhone Dancho"] C2["IPhone Kimi"] C3["Laptop Dari"] C4["Laptop Kimi"] C5["PC Dancho"] C6["ROG Ally Teodor"] end External --> MikroTik Clients -->|"Primary"| NAT NAT --> AGH1 Clients -.->|"Failover"| AGH2 AGH1 --> Q9 AGH2 --> Q9 ``` --- ## Configured Clients (Both AdGuard Instances) | Client | MAC Address | Tags | |--------|-------------|------| | IPhone (Dancho) | f2:b8:14:61:c8:27 | - | | IPhone (Kimi) | 2a:2b:ba:86:d4:af | user_child | | Laptop (Dari) | 34:f6:4b:b3:14:83 | user_child | | Laptop (Kimi) | 90:91:64:70:0d:86 | user_child | | PC (Dancho) | 70:85:c2:75:64:e5 | - | | ROG Ally (Teodor) | cc:5e:f8:d3:37:d3 | user_child | --- ## Custom Filtering Rules ``` ||dv-eu-prod.sentinelone.net^ ||euce1-soc360.sentinelone.net^ ||ampeco.jamfcloud.com^ ||*.jamfcloud.com^ ``` --- ## NAT/Port Forwarding (MikroTik) | Rule | Protocol | Port | Destination | Purpose | |------|----------|------|-------------|---------| | HTTP | TCP | 80 | 192.168.31.2:8001 | Traefik | | HTTPS | TCP | 443 | 192.168.31.2:44301 | Traefik | | DNS UDP | UDP | 53→5355 | 172.17.0.5 | AdGuard Home | | DNS TCP | TCP | 53→5355 | 172.17.0.5 | AdGuard Home | | DoT | TCP | 853 | 172.17.0.5 | DNS over TLS | | DoQ | UDP | 8853 | 172.17.0.5 | DNS over QUIC | | Plex | TCP | 32400 | 192.168.31.2 | Plex Media | | RustDesk | TCP/UDP | 21115-21119 | 192.168.31.2 | RustDesk | --- ## Reference Documents - [Phase 1: DNS Portability](./01-PHASE1-DNS-PORTABILITY.md) - [Phase 7: Gitea GitOps](./08-PHASE7-GITEA-GITOPS.md) - [Changelog](./06-CHANGELOG.md) --- ## Network Discovery & Management ### Slurp'it Stack | Container | IP | Purpose | |-----------|-----|---------| | slurpit-portal | 172.18.0.129 | Web UI (slurpit.xtrm-lab.org) | | slurpit-scanner | 172.25.0.5 | SNMP network scanner | | slurpit-scraper | 172.25.0.3 | Device data collector | | slurpit-warehouse | 172.25.0.4 | Data storage API | | slurpit-mariadb | 172.25.0.2 | Portal database | | slurpit-mongodb | 172.25.0.6 | Discovery database | **Status:** Operational **Discovered Devices:** 1 (MikroTik Router) **SNMP Communities:** public, netdisco **Configuration:** - SNMP v2c credentials configured - Scan target: 192.168.31.0/24 - NetBox integration: Enabled (plugin_online: 1) **Pending Tasks:** - Add SSH credentials to Vault for device scraping - Troubleshoot SNMP discovery of switch and AP ### NetDisco | Container | IP | Purpose | |-----------|-----|---------| | netdisco-web | 172.18.0.41 | Web UI (netdisco.xtrm-lab.org) | | netdisco-backend | 172.18.0.42 | SNMP poller | ### NetBox (IPAM/DCIM) | Container | IP | Purpose | |-----------|-----|---------| | netbox | 172.24.0.5 | Web UI (netbox.xtrm-lab.org) | | netbox-postgres | 172.24.0.4 | Database | | netbox-redis | 172.24.0.2 | Cache | | netbox-worker | 172.24.0.6 | Background tasks | **NetBox Slurp'it Plugin:** Installed and configured --- ## Agent Service Account A dedicated service account `agent` was created for automated tools: | Device | Username | Auth Method | Port | |--------|----------|-------------|------| | Unraid | agent | SSH Key + Password | 422 | | MikroTik Router | agent | SSH Key | 2222 | | MikroTik AP | agent | Password | 2222 | | MikroTik Switch | N/A | No SSH (SwOS) | - | **Credentials:** See docs/AGENT-CREDENTIALS.md (gitignored, local only)